MySQL DBAまたは開発者は、誤ってデータを削除または更新することがあります。オンライン環境であり、影響が大きい場合は、すばやくロールバックできる必要があります。従来の回復方法は、バックアップを使用してインスタンスを再構築し、エラーsqlを削除した後にbinlogを使用してデータを回復することです。この方法は時間と手間がかかり、メンテナンスのためにダウンタイムが必要であり、高速ロールバックには適していません。LVMスナップショットを使用してリカバリ時間を短縮するチームもありますが、スナップショットの欠点は、mysqlのパフォーマンスに影響を与えることです。MySQLフラッシュバック(フラッシュバック)は、binlogを使用して直接ロールバックします。これにより、ダウンタイムなしですばやく回復できます。
フラッシュバックの原理
MySQL binlogは、binlogがイベントの形式で有効化されて以来、MySQLサーバー内のすべての変更を記録します。これは、イベント間のすべての変更を再現するのに役立ちます。MySQLは、2つの主な目的でbinlogを導入しています。1つはマスタースレーブレプリケーション用で、もう1つは、バックアップおよび復元操作の後にbinlogを再適用する必要があることです。3つのオプションのbinlog形式があり、それぞれに長所と短所があります。
- ステートメント:SQLステートメントモードに基づくと、binlogデータの量は少ないですが、一部のステートメントと関数は、コピープロセス中にデータの不整合やエラーを引き起こす可能性があります。
- 行:行モードに基づいて、行の完全な変更を記録します。非常に安全ですが、binlogは他の2つのモードよりもはるかに大きくなります。
- 混合:混合モード、文に応じてステートメントまたは行モードを選択します。
binlogフラッシュバックを使用するには、binlog形式をrowに設定する必要があります。次のステートメントを使用して、現在のbinlogモードを表示します。
show global variables like "%binlog_format%";
フラッシュバック戦闘
実際のフラッシュバックシナリオでは、最も重要なことは、実際にロールバックする必要があるSQLをすばやく除外することです。実際の戦闘演習には、オープンソースツールbinlog2sqlを使用します。binlog2sqlは、Meituan-Dianping DBAチーム(上海)によって作成され、オンライン環境で数回すばやくロールバックされました。
①binlog2sqlツールをインストールする
首先安装Python工具管理表pip
yum -y install epel-release
yum -y install python-pip
安装binlog2sql
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt
②フラッシュバックケース実戦
1.以前の従業員テーブルデータを使用して、別のデータベースを作成します
create database testflashback;
use testflashback;
source /root/tools/scott.sql
2.誤操作、以下の事項を実行します。
start transaction;
delete from emp where sal>3000;
update emp set sal=6000;
delete from emp where job='CLERK';
commit;
3.現在のbinlogファイルを表示します
show master logs;
4.最新のbinlogファイルはmysql-binlog.000001です。私たちの目標は、ロールバックする必要のあるSQLを除外することです。誤操作者はおおよその誤操作時間を知っているだけなので、最初に時間に基づいてフィルタリングします。testflashbackライブラリのempテーブルを解析するだけで済みます。(注:複数のSQLの誤操作がある場合、生成されたbinlogは複数のファイルに分散される可能性があり、複数のファイルを解析する必要があります)
python binlog2sql/binlog2sql.py -uroot -pWelcome_1 \
--start-file='mysql-binlog.000001' > /root/tools/raw.sql
上記のステートメントは、empテーブルのすべてのbinlogログをトレーニングします。おおよその時間範囲を決定できる場合は、パラメーター--start-datetimeおよび--stop-datetimeを使用してフィルター処理できます。例えば:
--start-datetime='2016-12-26 11:44:00' --stop-datetime='2016-12-26 11:50:00'
解析によって処理されるbinlogは次のとおりです。
5.位置情報によると、誤操作sqlは同じトランザクションからのものであり、正確な位置は14956〜16791であると判断しました(binlog2sqlは同じトランザクションに対して同じ開始位置を出力します)。次に、場所に応じてフィルタリングし、-Bオプションを使用してロールバックsqlを生成し、ロールバックsqlが正しいかどうかを確認します。(注:実際のシナリオでは、生成されたロールバックSQLをさらにフィルタリングする必要があることがよくあります。grep、editorなどと組み合わせてください。)
python binlog2sql/binlog2sql.py -uroot -pWelcome_1 --start-file='mysql-binlog.000001' \
--start-position=14956 --stop-position=16791 -B > /root/tools/rollback.sql
生成されたフラッシュバックステートメントは次のとおりです。
6.ロールバックSQLに問題がないことをビジネスパーティに確認し、ロールバックステートメントを実行します。mysqlにログインし、ロールバックが成功したことを確認します。
mysql -uroot -pWelcome_1 < /root/tools/rollback.sql
7.データが復元されているかどうかを確認します