MySQL は binglog を使用してデータステップを復元します

プロジェクトのシナリオ:

最近、あるプロジェクトで binlog を使用してデータを復元するシナリオが発生し、自宅で Windows 環境を使用してテストが行​​われました。ちなみに、実際には Linux 環境と似ていますが、手順が異なりますので、自分で Linux 用に変換することもできます。


回復手順

1. データベースでバイナリログが有効になっているかどうかを確認します

次のコマンドを実行します。

show variables like '%log_bin%'

ここに画像の説明を挿入

1 オンはオンになっていることを意味し、バージョン 8.0 がデフォルトでオンになっていることがわかります。2.basename は binglog の保存場所です。 3.index は binlog ストレージのインデックスです。開封後は下図のようになります。
ここに画像の説明を挿入
レコードはすべてのバイナリログの名前です。
開かれていない場合は、自分で設定した後に SQL を再起動するだけで、ここでは展開されません。

2. 削除ステートメントを実行します。

delete from a where a.id =1; 

3. バイナリログを表示する

2.1 通常、復元したいデータは基本的にその日に誤って削除されているため、その日の binglog ファイルを直接読み取り可能な txt ファイルに変換します。上記の binlog.index を見ると、最後のファイルがその日のbinlogファイル このファイルのデフォルトのサイズは1gですが、データ量がそれほど大きくない場合は、直接変換できます。

D:\javaTools\mysql-8.0.12-winx64\bin\mysqlbinlog --no-defaults -vv --base64-output=decode-rows binlog.000764>binlog1.txt

2.2 どのバイナリログであるかわからない場合は、時間によって変換することもできます

D:\javaTools\mysql-8.0.12-winx64\bin\mysqlbinlog --no-defaults  --base64-output=decode-rows -v --database=test1  --start-datetime="2022-11-13 00:00:00" --stop-datetime="2022-11-14 00:00:00" binlog.000764 > binlog2.txt

2.3 ファイルを開くと、次の図に示すように、
ここに画像の説明を挿入
binlog に delete ステートメントの実行が表示されます。

4. データ復旧

4.1 binlog ファイルのデータ全体を復元する

mysqlbinlog --no-defaults binlog.000001|mysql -u root -p test

エラーは次のとおりです。

'mysql' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

mysql bin をシステム パスに追加する必要があります。
4.2 開始行と終了行の数に応じた復元
ここに画像の説明を挿入

2.1 の手順でファイルを変換した後、開始する前に行数を取得する必要があります。削除ステートメントの開始行と終了行の数が 230 ~ 438 であることがわかり、復元されたステートメントは次のようになります

D:\javaTools\mysql-8.0.12-winx64\bin\mysqlbinlog --no-defaults --start-position=230 --stop-position=438 binlog.000002|mysql -u root -p

ここに画像の説明を挿入

エラーは次のように報告されます。これら 2 つの方法では削除ステートメントを復元できません。いくつかの方法を試しましたが、解決できません。解決策がある場合は、メッセージを残してお知らせください。
4.3 上記の方法ではうまくいかないので、delete文をinsert文に変換して復元し、別の方法でデータを復元してください。
Linux環境では、先ほどのtxtファイルを使用して以下の手順を実行します。

cat binlog1.txt | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/;INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@17.*),/\1;/g' | sed 's/@1=//g'| sed 's/@[1-9]=/,/g' | sed 's/@[1-9][0-9]=/,/g' > test.sql

変換されたファイルの内容は以下の通りで、通常のSQLコマンドではないことがわかりますが、自分で変換することも可能です。

;INSERT INTO `test1`.`a`
SELECT
  6 ,
  ,'小红1667188306698' ,
  ,1 ,
  ,12 ,
  ,'2022-10-31 11:51:47' , 

変換されたSQL

  insert
	into
	`test1`.`a`
select
	6,
	'小红1667188306698' ,
	
	1 ,
	
	12 ,
	
	'2022-10-31 11:51:47'

4.4 SQLの実行
ここに画像の説明を挿入

要約:

データは binlog を通じて復元できます。ドキュメントをテストして表示した後、ドロップ テーブルの場合、データは方法 4.2 で復元する必要がありますが、削除された行は復元できません。binlog ログを次のように変換する必要があります。データを復元するための insert ステートメント。
mysqlbinlog メソッドを直接使用してデータを復元できる小規模なパートナーがいる場合は、私に知らせて、一緒に進歩させてください。

おすすめ

転載: blog.csdn.net/qq_34526237/article/details/127838165