「mysqldumpを実行したが、本当にリストアできるのか不安だ」
サーバー管理を始めると、必ずぶつかるのがデータベースのバックアップ設計です。ファイルのバックアップと違い、DBはエンジンのファイルをそのままコピーするだけでは壊れるリスクがあります。
この記事では、
mysqldump コマンドの実践的な使い方を解説します。フルバックアップの取り方、特定テーブルだけのダンプ、圧縮・自動化・リストアの手順まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した内容をもとに説明します。
この記事のポイント
・mysqldump は MySQL/MariaDB 標準のダンプツールで追加インストール不要
・フルバックアップには --single-transaction と --events オプションが安全
・リストアは mysql コマンドでリダイレクト入力するだけでできる
・cronと圧縮を組み合わせた自動バックアップが実務の基本形
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
mysqldumpとは何か
mysqldump は MySQL および MariaDB に付属するコマンドラインのバックアップツールです。データベースの内容を SQL 文の形式(CREATE TABLE、INSERT INTO など)でテキストファイルに書き出します。
バイナリのデータファイル(
/var/lib/mysql/ 以下)をそのままコピーする方法と比較して、以下の利点があります。・バージョン間の移行が容易:別バージョンの MySQL や MariaDB へのマイグレーションに使える
・論理バックアップ:テキストなので内容を目視確認できる
・部分バックアップ:特定のデータベース・テーブルだけダンプできる
・リストアが安全:稼働中のサーバーに上書き・追記できる
一方、デメリットもあります。
・処理時間:数GB以上のDBでは時間がかかる
・本番への負荷:大テーブルのダンプ中は I/O が増加する
・バイナリデータ:BLOB などはそのままサイズが大きくなる
20年以上 Linux サーバーを運用してきた経験から言うと、数十GB 未満のDBであれば mysqldump で十分です。それ以上のDBや RTO(目標復旧時間)が短い本番環境では、XtraBackup など物理バックアップも検討してください。
基本的な使い方
1. データベースをフルバックアップする
最も基本的なパターンです。-u でユーザー名、-p でパスワードの入力を求めます。# フルバックアップ(推奨オプション付き) $ mysqldump -u root -p \ --single-transaction \ --routines \ --events \ mydb > /backup/mydb_$(date +%Y%m%d).sql Enter password: (パスワードを入力)
・--single-transaction:InnoDB テーブル使用時に、ダンプ中のテーブルをロックせずに整合性を保てる(本番稼働中の推奨設定)
・--routines(-R):ストアドプロシージャ・ファンクションを含める
・--events(-E):スケジュールイベントを含める
実際に RHEL 9.4 で取得したダンプの先頭部分は以下のようになります。
-- MySQL dump 10.13 Distrib 8.0.36, for Linux (x86_64) -- -- Host: localhost Database: mydb -- ------------------------------------------------------ -- Server version 8.0.36 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; ...
2. 特定のテーブルだけダンプする
データベース名の後ろにテーブル名を並べると、指定したテーブルだけをダンプできます。# users テーブルと orders テーブルだけダンプ $ mysqldump -u root -p mydb users orders > /backup/mydb_partial.sql
3. すべてのデータベースをまとめてダンプする
--all-databases オプションを使うと、サーバー上のすべての DB を 1 ファイルに出力できます。# 全 DB をダンプ(--single-transaction は InnoDB のみ有効) $ mysqldump -u root -p \ --all-databases \ --single-transaction \ --routines \ --events \ > /backup/all_databases_$(date +%Y%m%d).sql
圧縮してディスクを節約する方法
SQL ファイルはテキストなので、gzip で圧縮するとサイズを大幅に削減できます。パイプを使って直接圧縮できます。
# ダンプと同時に gzip 圧縮 $ mysqldump -u root -p --single-transaction --routines --events mydb \ | gzip > /backup/mydb_$(date +%Y%m%d).sql.gz # 圧縮ファイルのサイズ確認 $ ls -lh /backup/mydb_*.sql.gz -rw-r--r--. 1 root root 4.2M May 29 13:00 /backup/mydb_20260529.sql.gz
ディスク容量が限られているサーバーでは、この方法を標準にすることをお勧めします。
リストア(復元)の手順
ダンプした SQL ファイルは、mysql コマンドのリダイレクト入力でリストアします。1. 非圧縮ファイルからリストアする
# 事前にデータベースを作成しておく(必要な場合) mysql -u root -p -e "CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" # リストア実行 mysql -u root -p mydb < /backup/mydb_20260529.sql
2. 圧縮ファイル(.sql.gz)からリストアする
# gunzip と mysql をパイプで接続してリストア $ gunzip < /backup/mydb_20260529.sql.gz | mysql -u root -p mydb
3. リストア後の確認
リストアが完了したら、テーブル数とレコード数を確認しましょう。# テーブル一覧を確認 mysql -u root -p mydb -e "SHOW TABLES;" # レコード数を確認(例: users テーブル) mysql -u root -p mydb -e "SELECT COUNT(*) FROM users;"
cronで自動バックアップを設定する実践例
毎日決まった時間に自動バックアップする設定を説明します。まず、パスワードをスクリプト内に書くのを避けるため、
~/.my.cnf に認証情報を設定します。1. ~/.my.cnf に認証情報を設定する
# /root/.my.cnf を作成(root でバックアップする場合) $ cat > /root/.my.cnf [mysqldump] user=backup_user password=YourSecurePassword # 他ユーザーに読まれないようにパーミッションを設定 $ chmod 600 /root/.my.cnf
2. バックアップスクリプトを作成する
# /usr/local/bin/mysql_backup.sh #!/bin/bash set -euo pipefail BACKUP_DIR="/backup/mysql" DATE=$(date +%Y%m%d_%H%M%S) DB_NAME="mydb" KEEP_DAYS=14 # バックアップディレクトリを作成 mkdir -p "${BACKUP_DIR}" # ダンプ実行(~/.my.cnf の認証情報を使用) mysqldump \ --single-transaction \ --routines \ --events \ "${DB_NAME}" \ | gzip > "${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz" # 古いバックアップを削除(14日以上前のファイル) find "${BACKUP_DIR}" -name "*.sql.gz" -mtime +${KEEP_DAYS} -delete echo "[$(date)] Backup completed: ${DB_NAME}_${DATE}.sql.gz"
# スクリプトに実行権限を付与 $ chmod 755 /usr/local/bin/mysql_backup.sh # 動作確認 $ /usr/local/bin/mysql_backup.sh [2026-05-29 03:00:01] Backup completed: mydb_20260529_030001.sql.gz
3. crontab に登録する
毎日午前 3 時に実行する設定です。# root の crontab を編集 $ crontab -e # 毎日 3:00 に実行(追加する行) 0 3 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
応用Tips:よく使うオプションと実務パターン
1. 構造だけをダンプする(データなし)
テーブル定義だけが欲しい場合(開発環境へのスキーマ適用など)に使います。# テーブル構造のみ(INSERT 文を含めない) $ mysqldump -u root -p --no-data mydb > /backup/mydb_schema.sql
2. データだけをダンプする(構造なし)
既にテーブルが存在する環境にデータだけを流し込む場合です。# INSERT 文のみ(CREATE TABLE を含めない) $ mysqldump -u root -p --no-create-info mydb > /backup/mydb_data.sql
3. 文字コードを明示してダンプする
文字化けトラブルを防ぐため、本番環境では--default-character-set を指定することをお勧めします。# UTF-8 を明示(utf8mb4 推奨) $ mysqldump -u root -p \ --default-character-set=utf8mb4 \ --single-transaction \ mydb > /backup/mydb_utf8mb4.sql
4. リモートサーバーのDBをダンプする
-h でホスト名を指定すると、リモートのMySQL サーバーへ接続できます。SSH ポートフォワーディングと組み合わせると、直接アクセスできない DB サーバーにも対応できます。
# リモートサーバー(db01.example.com)のDBをダンプ $ mysqldump -u dbuser -p -h db01.example.com \ --single-transaction mydb > /backup/remote_mydb.sql # SSH ポートフォワード経由(3307 をローカルにマッピング済みの場合) $ mysqldump -u dbuser -p -h 127.0.0.1 -P 3307 \ --single-transaction mydb > /backup/remote_mydb.sql
トラブルシュート:よくあるエラーと対処法
「Access denied for user」が出る
# エラー例 mysqldump: Got error: 1045: Access denied for user 'backup'@'localhost' ... # 対処:バックアップ用ユーザーに必要な権限を付与 mysql -u root -p -e " GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, EVENT ON *.* TO 'backup'@'localhost'; FLUSH PRIVILEGES; "
「mysqldump: Couldn't execute 'FLUSH TABLES'」が出る
--single-transaction を使うと FLUSH TABLES が実行されますが、SUPER 権限がない場合にエラーになることがあります。MariaDB では
RELOAD 権限を付与することで解決します。# MariaDB での対処 mysql -u root -p -e " GRANT RELOAD ON *.* TO 'backup'@'localhost'; FLUSH PRIVILEGES; "
「Got a packet bigger than 'max_allowed_packet' bytes」が出る
BLOB や TEXT が大量に含まれるテーブルで発生します。# max_allowed_packet を増やしてダンプ $ mysqldump -u root -p \ --max-allowed-packet=256M \ --single-transaction mydb > /backup/mydb.sql
MyISAMテーブルがある場合の注意点
--single-transaction は InnoDB テーブルにのみ有効です。MyISAM テーブルを含むDBをバックアップする場合は、
--lock-tables を使います(ただしダンプ中は書き込みロックがかかります)。# MyISAM テーブルを含む場合(書き込みロックが発生) $ mysqldump -u root -p --lock-tables mydb > /backup/mydb.sql # InnoDB のみなら --lock-tables=false で明示的に無効化 $ mysqldump -u root -p \ --single-transaction \ --lock-tables=false \ mydb > /backup/mydb.sql
本記事のまとめ
mysqldump の使い方をコマンド別にまとめます。| やりたいこと | コマンド |
|---|---|
| フルバックアップ(推奨) | mysqldump -u root -p --single-transaction --routines --events mydb > dump.sql |
| 全DBをまとめてダンプ | mysqldump -u root -p --all-databases --single-transaction > all.sql |
| 特定テーブルのみ | mysqldump -u root -p mydb users orders > partial.sql |
| gzip圧縮して保存 | mysqldump -u root -p mydb | gzip > dump.sql.gz |
| 圧縮ファイルからリストア | gunzip < dump.sql.gz | mysql -u root -p mydb |
| スキーマのみダンプ | mysqldump -u root -p --no-data mydb > schema.sql |
| データのみダンプ | mysqldump -u root -p --no-create-info mydb > data.sql |
| リモートサーバーからダンプ | mysqldump -u user -p -h db-host mydb > dump.sql |
データベースのバックアップは「取っているつもり」で実際には機能していないケースが現場でよくあります。
バックアップを設定したら、必ずリストアの動作確認まで行いましょう。
検証サーバーに
gunzip < dump.sql.gz | mysql -u root -p test_mydb を実行して、テーブルとレコードが復元できることを確認してください。MySQL の関連操作については、tar コマンドでバックアップファイルを圧縮・アーカイブする方法も参考にしてください。
ディスク管理や保存先のファイルシステム確認には mount コマンドの使い方 も合わせて確認しておくとよいでしょう。
パッケージ管理で MySQL をインストール・管理する際は rpm コマンドの使い方 も役立ちます。
mysqldumpの次は、実務サーバー運用の「型」を体系化しませんか?
バックアップコマンドを覚えても、「設計・運用・障害対応の全体像」は断片的な情報だけでは身につきません。現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:MySQLでユーザー一覧を表示する方法|mysql.userの確認とCURRENT_USERの活用
- この記事の属するカテゴリ:Linuxtips・MySQLへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます