ユーザ用ツール

サイト用ツール


mysql:incremental_backup

binlogを用いた差分バックアップ

事前準備

binlogを出力する設定

# vi /etc/my.cnf

+) log-bin = mysql-bin
+) expire_logs_days = 2
+) sync_binlog = 1
  • log-bin = mysql-bin
    MySQLのルートディレクトリにmysql-binというファイルを出力する。
  • expire_logs_days = 2
    バイナリログを自動削除する日数。
    例は2日間のバイナリログを残す。
  • sync_binlog = 1
    1回バイナリログへ更新を行うことでディスクへのフラッシュを行うことを表すオプションであるため、ディスクへの負荷が高くなる。高速なディスク、特にバッテリー付きのRAID装置などを利用していないと性能が極端に落ちてしまう。

バックアップ

#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
  • –single-transaction
    ダンプ時のデータのトランザクションの一貫性を保つことができます。
  • –master-data=2
    指定するとCHANGE MASTER TOがコメントアウトされた状態になります。
  • –maser-data=1
    指定するとコメントアウトされずにダンプされます。
  • –flush-logs
    ダンプを開始する前に、MySQL サーバ内のログファイルをフラッシュします。

リストア

バックアップからLOGのポジションを確認する

# zcat dbbackup.20140401_040101.gz | egrep -i MASTER_LOG_POS
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000146', MASTER_LOG_POS=107;
  • zcat
    gzip圧縮されたファイルを解凍せずに確認(cat)する。

例では、ダンプを取る際にmysql-bin.000146に切り替わったので、mysql-bin.000145までは処理済み。
最新まで復旧するためには、mysql-bin.000146以降の処理を適用する必要がある。

誤った操作の手前まで戻したい⇒binlogから誤った操作の手前のポジションを確認する

# 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)ということが分かった。

binlogからリカバリに必要な差分のsqlを作成する

最新までの全ての差分を抽出する

# 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
mysql/incremental_backup.txt · 最終更新: 2014/04/23 07:27 by clownclown

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki