[趙強先生] MySQLフラッシュバック

[趙強先生] MySQLフラッシュバック

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%";

[趙強先生] MySQLフラッシュバック

フラッシュバック戦闘

実際のフラッシュバックシナリオでは、最も重要なことは、実際にロールバックする必要がある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;

[趙強先生] MySQLフラッシュバック

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は次のとおりです。

[趙強先生] MySQLフラッシュバック

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

生成されたフラッシュバックステートメントは次のとおりです。

[趙強先生] MySQLフラッシュバック

6.ロールバックSQLに問題がないことをビジネスパーティに確認し、ロールバックステートメントを実行します。mysqlにログインし、ロールバックが成功したことを確認します。

mysql -uroot -pWelcome_1 < /root/tools/rollback.sql

7.データが復元されているかどうかを確認します

[趙強先生] MySQLフラッシュバック

おすすめ

転載: blog.51cto.com/collen7788/2538676