MySQL のオンラインバックアップ
& リカバリ
2014/05/24
teru
@TKS #3
アジェンダ
• バックアップ
• mysqldump コマンド
• 推奨オプション
• 便利なオプション
!
• リカバリ
• ダンプのリストア方法
• mysqlbinlog コマンド
• バイナリログの適用 (ポイントインタイムリカバリ)
2
バックアップ編
3
mysqldump
• MySQL に付属している論理バックアップツール
!
• SQL 文が羅列されたものが出力される
4
DROP TABLE IF EXISTS `sometable`;
CREATE TABLE `sometable` ( ...
INSERT INTO `sometable` VALUES ( ...
INSERT INTO `sometable` VALUES ( ...
INSERT INTO `sometable` VALUES ( ...
INSERT INTO `sometable` VALUES ( ...
対象テーブルの指定
• mysqldump somedb
• somedb 内のテーブルすべてダンプ
!
• mysqldump somedb sometable1 sometable2
• somedb.sometable1, somedb.sometable2 のみバッ
クアップ
!
• mysqldump --ignore-table=somedb.gomitable1 somedb
• somedb.gomitable1 は無視する
• オプションを繰り返すことで複数指定可
5
デフォルト有効のオプション
• mysqldump は、デフォルトで "--opt" が有効になっている。
• "--skip-opt" で無効にできる。
!
• "--opt" は下記と同義
• --add-drop-table
• --add-locks
• --create-options
• --disable-keys
• --extended-insert
• --lock-tables
• --quick
6
デフォルト有効のオプション
• --extended-insert
• INSERT 一文に、複数のレコードが入る
• メリット: リストア速度が早い
!
!
!
!
• --skip-extended-insert
• 1 レコード 1 INSERT になる。
• メリット: ダンプファイルをいじりやすい
7
INSERT INTO `sometable` VALUES (1,1980,'piyopiyo','','2014-05-24
13:44:51'),(2,1981,'hogehoge','','2014-05-24 13:45:05'),
(3,1982,'hugahuga','','2014-05-24 14:44:27');
デフォルト有効のオプション
• --lock-tables
• テーブルのダンプ前、ロックを掛ける
• ダンプ中はそのテーブルの更新ができない
!
• --skip-lock-tables
• ロックしない
• サーバ移行時の事前テストなど、カジュアルにダンプ
ができる
8
推奨オプション
• --single-transaction
• ダンプが単一トランザクションになる
• ダンプ開始時点の断面がダンプできる
• かつ、ダンプ中更新可能
• ※ トランザクション対応 DB でのみ可能 (InnoDB など)
!
• --master-data=2
• ダンプファイル内に、バイナリログのポジションがコメントで入る
• ポイントインタイムリカバリに使える
9
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1457;
推奨オプション
• --order-by-primary
• ダンプを主キーでソートして出力する
• InnoDB のリストアが爆速になる
!
!
!
!
!
!
• 444MBのダンプファイルのリスト時
• 引用: http://d.hatena.ne.jp/sh2/20120122
10
innodb_buffer_pool_size
おまけ: クラスタインデックス
11
僕がいつも使うオプション
!
• mysqldump --default-character-set=binary --opt -c
somedb
• MyISAM の場合
!
• mysqldump --default-character-set=binary --opt -c
--single-transaction --master-data=2 --order-by-
primary somedb
• InnoDB の場合
• binlog 出しとく
12
その他知っとくと便利なオプション
• --where="deleted_at >= '2013-10-01 00:00:00'"
• ダンプ時に where 句指定で吐ける
• 「"」「'」 に注意
!
• --no-data
• テーブルの定義のみダンプ
• CREATE TABLE, CREATE INDEX などのみ
!
• --no-create-info
• データのみダンプ
• INSERT のみ
13
リストア編
14
ダンプファイルのリストア方法
!
• cat somedb.sql | mysql somedb
• 普通の方法
!
• cat somedb.sql | throttle -M 1 | mysql somedb
• throttle コマンドで 1MB/s に制限
• 負荷を掛けたくない時に有用
15
mysqlbinlog コマンド
!
• バイナリログから SQL 構文を作るコマンド
!
• 出力されたファイルは、ダンプファイルと同じようにリ
ストアに使用できる。
!
• 文法
• mysqlbinlog [OPTIONS] mysql-bin.000001 ...
16
mysqlbinlog オプション
• --start-position=4
• --stop-position=123456
• バイナリログの読み込み開始・終了のポイントを、ポ
ジションで指定
!
• --start-datetime="2013-01-01 12:34:56"
• --stop-datetime="2013-01-01 12:34:56"
• バイナリログの読み込み開始・終了のポイントを、時
刻で指定
!
• --database=somedb
• バイナリログの中で、対象のデータベースを指定
17
(再掲) 推奨オプション
• --single-transaction
• ダンプが単一トランザクションになる
• ダンプ開始時点の断面がダンプできる
• かつ、ダンプ中更新可能
• ※ トランザクション対応 DB でのみ可能 (InnoDB など)
!
• --master-data=2
• ダンプファイル内に、バイナリログのポジションがコメントで入る
• ポイントインタイムリカバリに使える
!
!
!
18
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1457;
mysqlbinlog 使用例
!
!
!
!
!
• 状況の例
• --master-data=2 で取得したバックアップがある
!
• 15:00:00 にバルス (DROP TABLES) してしまった
!
• バックアップと tmp.sql でバルス直前の状態まで戻せ
る
19
$ mysqlbinlog 
--start-position=1457 
--stop-datetime="2014-05-24 14:59:00" 
mysql-bin.000001 > tmp.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1457;
以上
20

MySQL のオンラインバックアップ & リカバリ