5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【MySQL】マスターを止めずに定期バックアップからレプリケーションを復旧する

Last updated at Posted at 2016-09-22

■バックアップの時刻を調べる

定期的にバックアップをとっていることが前提。
この例では毎日8:00とする。

■その時刻をもとにマスターのバイナリログファイルを特定する

$ ls -l;

rw-rw---- 1 mysql mysql  1073753869  6月 16 06:04 2016 mysql-bin.000231
rw-rw---- 1 mysql mysql  1073750057  6月 16 16:33 2016 mysql-bin.000232
rw-rw---- 1 mysql mysql  1073741972  6月 17 01:03 2016 mysql-bin.000233

タイムスタンプがバックアップ時間より新しいファイルの中で、もっとも古いものが対象。
この場合は mysql-bin.000232

■バイナリログをテキストに変換する

$ mysqlbinlog --no-defaults --start-datetime="2016-06-16 07:55:00" --stop-datetime="2016-06-16 08:05:00" mysql-bin.000232  > tmp.log;

--no-defaults を指定しないとmysqlbinlog: unknown variable 'default-character-set=utf8'言われた。
--start-datetimeと--stop-datetimeで出力ファイルのサイズを減らす。

■tmp.logをのぞいて、8:00頃のログポジションを特定する

tmp.log
...
# at 191679237
#160616  7:59:51 server id 1001  end_log_pos 191679375  Query   thread_id=2978577       exec_time=0     error_code=0
...

時刻で検索する。
atの後ろの値がログポジション。
クエリも目視で確認したほうがベター。辛いけど。

■レプリケーション停止&初期化

mysql> stop slave;
mysql> reset slave;

■バックアップからリストアする

$ mysql -u hoge -p < dump.sql;

■レプリケーション設定&開始

mysql > CHANGE MASTER TO
       MASTER_HOST='hosuto',
       MASTER_USER='yuuzaa',
       MASTER_PASSWORD='paswaado',
       MASTER_LOG_FILE='mysql-bin.000232',
       MASTER_LOG_POS=191679237;
mysql > START SLAVE;

■祈る

完全に正しいログポジションではない場合、レプリケーションエラーは発生しうる。
レプリケーションがエラーしたらひとつずつ確認し、スキップして問題なさそうならスキップ。
大事なのは祈り。

バックアップ時の--master-dataとか--single-transactionで、もっとうまくできる気がする。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?