mysqldump – MySQL/MariaDB の論理バックアップを作成するダンプツール

フル/増分バックアップ

mysqldump は、MySQL/MariaDB のデータベースやテーブルを SQL 形式CREATE TABLEINSERT 文)でエクスポートするコマンドです。
実務では、定期バックアップ、移行、特定テーブルだけのエクスポート/インポート、スキーマだけの出力などに使います。

構文(Syntax)

# 基本(対話的にパスワード入力推奨)
mysqldump -h HOST -P PORT -u USER -p [OPTIONS] DB [TABLE ...] > dump.sql

# 複数DB / すべてのDB
mysqldump [接続オプション] --databases DB1 DB2 ... > dump.sql
mysqldump [接続オプション] --all-databases > alldb.sql

# スキーマのみ / データのみ
mysqldump [接続オプション] --no-data    DB [TABLE ...] > schema.sql
mysqldump [接続オプション] --no-create-info DB [TABLE ...] > data.sql

# 一貫性スナップショット(InnoDB)でのオンラインダンプ
mysqldump [接続オプション] --single-transaction [--quick] DB > dump.sql
  • パスワードは -p のみ指定し、標準入力で入力するのが安全です。
  • 認証情報は --login-pathmysql_config_editor)や --defaults-extra-file での利用が推奨です。

主なオプション一覧

オプション説明使用例
-h HOST -P PORT -u USER -p接続先と認証。-p はプロンプト入力mysqldump -h 127.0.0.1 -u backup -p DB > dump.sql
--databases DB...複数 DB を 1 つのファイルに(各DBの CREATE DATABASE を含む)mysqldump -u root -p --databases app test > dbs.sql
--all-databasesすべての DB をダンプmysqldump -u root -p --all-databases > full.sql
--single-transactionInnoDB をロックせず整合性スナップショットでダンプ(長時間読取向き)mysqldump --single-transaction DB > dump.sql
--quick結果を逐次出力(クライアント側メモリ節約)mysqldump --single-transaction --quick DB > dump.sql
--lock-tables / --skip-lock-tablesテーブルを読み取りロック/ロックしない(--single-transactionとは併用不可)mysqldump --lock-tables DB > dump.sql
--routines / --events / --triggersストアドルーチン/イベント/トリガを含める(トリガは通常既定で含まれる)mysqldump --routines --events DB > dump.sql
--no-data / --no-create-infoスキーマのみデータのみmysqldump --no-data DB > schema.sql
--where="条件"条件でデータを絞り込みmysqldump DB orders --where="created_at>=CURDATE()" > today.sql
--ignore-table=DB.TBL指定テーブルを除外(複数指定可)mysqldump DB --ignore-table=DB.logs > dump.sql
`–set-gtid-purged=OFFONAUTO`
`–master-data[=12]`バイナリログ座標をコメント/SQLで埋め込む(レプリセットアップ)
--hex-blobBLOB/TEXT を 16 進で出力(文字化け回避)mysqldump --hex-blob DB > dump.sql
--default-character-set=utf8mb4クライアント文字コードmysqldump --default-character-set=utf8mb4 DB > dump.sql
--order-by-primary主キー順で出力(復元性能/再現性向上)mysqldump --order-by-primary DB > dump.sql
--column-statistics=0互換性のため列統計の出力を無効化(古いサーバ/MariaDB向け)mysqldump --column-statistics=0 DB > dump.sql
--result-file=FILEリダイレクトせずに直接ファイルへmysqldump DB --result-file=./dump.sql
--tab=DIRDIRTSV(データ).sql(定義) を出力mysqldump --tab=/tmp/out DB TABLE

メモ:ネットワーク圧縮--compress(転送圧縮)。出力の圧縮gzip など外部コマンドで行います。

実行例

1) 単一データベースを一貫性スナップショットでバックアップ(推奨)

説明: InnoDB のオンラインバックアップに適した方法です。
コマンド:

mysqldump -h 127.0.0.1 -u backup -p \
  --single-transaction --quick --routines --events \
  --default-character-set=utf8mb4 shop > shop_$(date +%F).sql

2) 構造だけ/データだけを分けて出力

説明: スキーマ移行や後続のロード最適化に。
コマンド:

# スキーマのみ
mysqldump -u root -p --no-data shop > schema.sql
# データのみ
mysqldump -u root -p --no-create-info shop > data.sql

3) 条件付きで一部のデータだけを抽出

説明: 今日分の注文だけを抽出します。
コマンド:

mysqldump --login-path=report shop orders \
  --where="created_at >= CURDATE()" > orders_today.sql

4) すべてのDBを丸ごと取得して圧縮保存

説明: フルバックアップを日付付きで保存します。
コマンド:

mysqldump --login-path=backup --all-databases \
  --single-transaction --triggers --routines --events \
  | gzip > full_$(date +%F).sql.gz

5) エラー例:権限不足で --master-data を使用

説明: バイナリログ座標を含めるには RELOAD, LOCK TABLES などが必要。
コマンド:

mysqldump -u user -p --master-data=2 shop > dump.sql

出力例(例):

mysqldump: Got error: 1227: Access denied; you need (at least one of) the SUPER privilege(s) ...

対処: 必要権限を付与、または --single-transaction のみで取得。

関連コマンド

  • mysql : ダンプの復元(mysql < dump.sql)や確認に使用。
  • mysqlpump : 並列ダンプ/復元に対応した MySQL 公式の別ツール。
  • mydumper/myloader : 高速並列ダンプ/ロードのサードパーティ。
  • xtrabackup(物理バックアップ): Percona のホットバックアップツール(InnoDB)。
  • gzip / zstd : ダンプの圧縮保存。

備考

  • 一貫性: InnoDB 前提なら --single-transaction を使うのが基本。MyISAM を含む場合は整合性のため --lock-tables 等が必要。両者は併用不可。
  • 大規模データ: --quick(逐次フェッチ)、--hex-blob(バイナリ安全)、--order-by-primary(復元のインデックス効率)を検討。
  • 認証情報の扱い: コマンドラインにパスワードを直接書かず、--login-pathmysql_config_editor)または --defaults-extra-file=/path/secret.cnf を利用。
  • 互換性: MySQL 8 系クライアントで MariaDB/古いサーバへ接続する場合は --column-statistics=0 を付与するとエラーを回避できることがあります。
  • 復元の注意: ダンプは 論理バックアップ。大容量では復元に時間がかかります。重要システムでは物理バックアップとの併用を。
  • トリガ/イベント/ルーチン: トリガは通常デフォルトで含まれます。ストアドルーチンやイベントは --routines/--events を明示。
  • 文字コード: 文字化け防止に --default-character-set=utf8mb4 を明示し、復元側でも適切な character_set_server を確認。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント