binlogを出力する設定
# vi /etc/my.cnf +) log-bin = mysql-bin +) expire_logs_days = 2 +) sync_binlog = 1
#mysqldump -u root \ -ppassword \ --single-transaction \ --master-data=2 \ --flush-logs \ --databases DBNAME \ or --all-databases \ | gzip > dbbackup.$(date "+%Y%m%d_%H%M%S").gz
# zcat dbbackup.20140401_040101.gz | egrep -i MASTER_LOG_POS -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000146', MASTER_LOG_POS=107;
例では、ダンプを取る際にmysql-bin.000146に切り替わったので、mysql-bin.000145までは処理済み。
最新まで復旧するためには、mysql-bin.000146以降の処理を適用する必要がある。
# mysqlbinlog --no-defaults /mnt/addVol/mysql/mysql-bin.000146 | egrep -i -B5 truncate COMMIT /*!*/; # at 1008 #140418 12:30:01 server id 181 end_log_pos 314172554 Query thread_id=1605543 exec_time=0 error_code=0 SET TIMESTAMP=1397791801/*!*/; TRUNCATE TABLE TESTTABLE
例では、誤ってtruncateしてしまったので、間際の処理までを復活するためにポジションを確認している。
mysqlbinlogコマンドでbinlogの中をみて、egrepでtruncate処理を検索、-B5オプションで処理の5行前までを表示する。
表示から、間際の処理は1008(# at 1008)ということが分かった。
# mysqlbinlog --disable-log-bin mysql-bin.000146 mysql-bin.000147 > restore.sql
ダンプファイルから開始位置は107、binlogから終了位置は1008
# mysqlbinlog --no-defaults --start-position=107 --stop-position=1008 mysql-bin.000146 > restore.sql
# mysql -u root -ppassword < restore.sql
※万が一途中でエラーになった場合は、エラーを対処してから「-f」オプションで再実行
「-f」エラーをスキップして続行
# mysql -u root -ppassword -f < restore.sql