宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「MySQLのバックアップって、どうやればいいんだろう」
「mysqldumpを実行したが、本当にリストアできるのか不安だ」

サーバー管理を始めると、必ずぶつかるのがデータベースのバックアップ設計です。ファイルのバックアップと違い、DBはエンジンのファイルをそのままコピーするだけでは壊れるリスクがあります。

この記事では、mysqldump コマンドの実践的な使い方を解説します。
フルバックアップの取り方、特定テーブルだけのダンプ、圧縮・自動化・リストアの手順まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した内容をもとに説明します。

この記事のポイント

・mysqldump は MySQL/MariaDB 標準のダンプツールで追加インストール不要
・フルバックアップには --single-transaction と --events オプションが安全
・リストアは mysql コマンドでリダイレクト入力するだけでできる
・cronと圧縮を組み合わせた自動バックアップが実務の基本形


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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 の約 1/5 ~ 1/10 のサイズに圧縮できることが多いです。
ディスク容量が限られているサーバーでは、この方法を標準にすることをお勧めします。

リストア(復元)の手順

ダンプした 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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。