mysqldump は、データベースの中身を CREATE TABLE 文と INSERT 文の SQL ファイルとして書き出すツールです。リストアは、そのファイルを mysql クライアントに流すだけです。この記事の出力は MySQL 8.4.6 で採りました。
まず見る(結論)
- InnoDB の表なら
--single-transactionを付ける。止めずに整合性のあるダンプが取れる - ストアドプロシージャとイベントは既定では入らない。
--routines --eventsを付ける - リストアは
mysql -u root -p 復元先DB < ファイル。復元先のデータベースは先に作っておく - 8.4 では
--master-dataは非推奨(--source-dataを使う)、mysqlpumpは削除された
データベースをバックアップする
$ mysqldump -u root -p --single-transaction --routines --triggers --events sugdb > sugdb.sql
-p の後ろにはパスワードを書かず、入力を求めるようにします。ファイルの先頭はこうなっています。
-- MySQL dump 10.13 Distrib 8.4.6, for Linux (x86_64)
--
-- Host: localhost Database: sugdb
-- ------------------------------------------------------
-- Server version 8.4.6
...
DROP TABLE IF EXISTS `customers`;
...
CREATE TABLE `customers` (
`id` int NOT NULL,
`name` varchar(50) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
...
INSERT INTO `customers` VALUES (1,'x','a@example.com','2026-09-01 10:00:00'),(2,'b','b@example.com','2026-09-02 10:00:00'),...
表ごとに DROP TABLE IF EXISTS → CREATE TABLE → INSERT の順に並びます。リストア先に同じ名前の表があると、消して作り直されます。INSERT は1表ごとに、複数行を1文にまとめた形です。
--single-transaction: ダンプを1つのトランザクションの中で読む。InnoDB なら、ダンプ中に更新があっても開始時点のデータがそろう--routines: ストアドプロシージャと関数を含める--triggers: トリガーを含める(既定で ON)--events: イベントを含める
1表だけ・定義だけ・データだけ
$ mysqldump -u root -p sugdb customers > customers.sql # 1表だけ(データベース名の後ろに表名)
$ mysqldump -u root -p -d sugdb > schema.sql # 定義だけ(--no-data)
$ mysqldump -u root -p -t sugdb > data.sql # データだけ(--no-create-info)
2表のデータベースで試すと、-d のファイルは CREATE TABLE が2つで INSERT が0、-t は CREATE TABLE が0で INSERT が2つでした。
すべてのデータベース
$ mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql
--all-databases では、データベースごとに CREATE DATABASE /*!32312 IF NOT EXISTS*/ ... と USE が入ります。mysql データベース(ユーザーや権限)も含まれます。
リストアする
1つのデータベースを指定して取ったダンプには CREATE DATABASE が入っていないので、復元先を作ってから流します。別の名前のデータベースにも戻せます。
$ mysql -u root -p -e "CREATE DATABASE sugdb2"
$ mysql -u root -p sugdb2 < sugdb.sql
元の sugdb と復元した sugdb2 で件数を比べると、どちらも customers 5件、orders 5件で一致しました。
MySQL 8.4 で変わったところ
–master-data は非推奨、–source-data を使う
レプリカを作るときに binlog の位置を書き込む --master-data を使うと、8.4 では警告が出ます。
WARNING: --master-data is deprecated and will be removed in a future version. Use --source-data instead.
--source-data=2 にすると、ファイルの中に binlog の位置がコメントとして入ります。
-- CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='binlog.000005', SOURCE_LOG_POS=13844;
出てくる文も、以前の CHANGE MASTER TO ではなく CHANGE REPLICATION SOURCE TO になっています。
mysqlpump は無い
並列でダンプする mysqlpump は 8.4.0 で削除されました。8.4.6 の環境では、コマンド自体が見つかりませんでした。公式のリリースノートは、代わりに mysqldump か MySQL Shell のダンプ機能を使うよう案内しています。mysqldump は表を1つずつ順に書き出します。並列で取りたいなら、MySQL Shell の util.dumpInstance() を使います。