mysqldump コマンドでデータベースダンプすることができます。ダンプファイルには、CREATE TABLE, INSERT 等の SQL 文が含まれます。大量データがの場合はバックアップ・リストアに時間がかかることがありあります。
# mysqldump -h localhost -u root -pパスワード データベース名 テーブル名... > dump.sql # mysqldump -h localhost -u root -pパスワード --databases データベース名... > dump.sql # mysqldump -h localhost -u root -pパスワード --all-databases > dump.sql
おススメのオプションを下記に示します。--single-transaction の条件に注意して利用してください。
# mysqldump -h localhost -u root -pパスワード --databases データベース名 \ --flush-logs --single-transaction --master-data=2 > dump.sql
バックアップをリストアするには、ダンプファイルを単に SQL 文として実行します。
# mysql -h localhost -u root -pパスワード < dump.sql
バイナリログが退避されていれば、さらに障害発生の直前まで、データをロールフォワードすることができます。例えば、誤ってテーブルを削除してしまったのを復旧するケースを考えます。まず、ダンプ時のバイナリログ名とポジションを確認します。
# grep "CHANGE MASTER TO" dump.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000005', MASTER_LOG_POS=389;
退避したバイナリログをSQL文に変換します。
# mysqlbinlog /tmp/mariadb-bin.000005 > binlog_000005.sql # vi binlog_00005.sql
「end_log_pos 番号」 から次の 「end_log_pos 番号」 までがひとつの処理です。
#191207 19:01:10 server id 1 end_log_pos 389 ... : # at 389 : : : #191207 19:04:11 server id 1 end_log_pos 3553 ... : insert into users ( id, name ) values ( 3, 'Takeda' ) : # at 3553 #191207 19:04:11 server id 1 end_log_pos 3584 ... : drop table sample : # at 3584
389番の処理までは dump.sql でリストア済み。3584番の処理が誤ってテーブルを消してしまった処理なので、その直前の 3553番の処理までを SQL 文にして、流し込みます。
# mysqlbinlog --start-position=389 --stop-position=3553 mariadb-bin.000005 > binlog_000005.sql # mysql -h localhost -u root -pパスワード < binlog_000005.sql