MySQL 8 min read

mysqldumpの使い方 ― バックアップとリストア、MySQL 8.4で変わったオプション

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() を使います。