MySQL は差分バックアップに対応していません。
mysqldump コマンドを使用する方法を記載します。
# ストレージエンジンが InnoDB のオンラインバックアップ例
mysqldump \
-h 127.0.0.1 \
-P 3306 \
-u root \
-p \
--single-transaction \
--default-character-set=utf8mb4 \
--source-data=2 \
--routines --triggers --events \
--hex-blob \
--flush-logs \
--all-databases > source.dump
// PROCESS 権限がないときは --no-tablespaces も付与
mysqldump オプション | 内容 |
---|---|
--single-transaction | 一貫性のあるデータベースをバックアップ( --lock-tables と排他的) |
--lock-tables | テーブルをダンプする前にすべてロック( --single-transaction と排他的) |
--skip-lock-tables | --lock-tables を打ち消す。--single-transaction と --lock-tables は排他的なので --single-transaction を指定した場合には必要ない。 |
--source-data | 「ポジションレプリケーションのためのソースのバイナリログファイル系とポジションを出力(Show Master STATUS の値)」 MySQL 運用・管理 実践入門 p158 |
--dump-replica | ポジションレプリケーションのためのコマンド実行対象おレプリカのソースのバイナリログファイル名とポジションを出力(SHOW REPLICA STATUS ステートメントの値) |
--no-tablespaces | 後述 |
--flush-logs | MySQL で新しいログファイルの使用を強制的に開始する |
mysqldump のデフォルトはダンプ処理中の書き込み処理をロックします(通常 --lock-tables
が暗黙的に有効なっています)。
そのためにタンプ処理中はデータベースに書き込みができないために(メンテナンスモードなどで)サイトを停止する必要があります。
しかし ストレージエンジンが InnoDB の場合は --single-transaction
オプションを付与することでサイトを停止せずにダンプすることができます。
--single-transaction
は --lock-tables
を使用ぜずに整合性を保ってダンプするためのオプションです--single-transaction
を使用せずに整合性を保ってダンプするには --lock-tables
が必要です( 通常 --lock-tables
はデフォルトで有効)--single-transaction オプションおよび --lock-tables オプションは相互に排他的です。これは、保留中のトランザクションが LOCK TABLES により暗黙的にコミットされるためです。
https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html#option_mysqldump_single-transaction
--skip-lock-tables
は --lock-tables
を打ち消します( --single-transaction を指定している場合は必要ありません)The --single-transaction option and the --lock-tables option are mutually exclusive because LOCK TABLES causes any pending transactions to be committed implicitly.
-- man mysqldump
MySQL 5.7.31以降から、--no-tablespaces
も必要になりました。
mysqldump には、ダンプされたテーブルに対する SELECT 以上の権限、ダンプされたビューに対する SHOW VIEW、ダンプされたトリガーに対する TRIGGER、--single-transaction オプションが使用されていない場合 LOCK TABLES、および (MySQL 8.0.21 時点で)--no-tablespaces オプションが使用されなければ、PROCESS が必要です。
ref. https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html
Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
PROCESS
権限を付与して解消することが望ましいが、レンタルサーバなどの権限付与ができない場合は --no-tablespaces
を付与します例えばさくらのレンタルサーバでは PROCESS
権限を付与することはできませんでした。
> GRANT PROCESS ON *.* TO 'example';
ERROR 1045 (28000): Access denied for user 'example'@'%' (using password: YES)
以下リンクを読む限り tablespace は DB の論理情報と物理データを結びつける情報を格納しているようなので、新サーバでリストアする時には必要はなさそう。よって --no-tablespaces
を付けても良さそう。
ref. https://anothercoffee.net/how-to-fix-the-mysqldump-access-denied-process-privilege-error/
$ mysql -h {{restore distination}} -P 3306 -u root -p < source.dump