MySQLデータベースの誤操作後の高速ロールバック方法

7093 ワード

MySQLデータベースの誤操作後の高速ロールバック方法
転載更新時間:2016年12月09日10:17:22作者:dfcao
この文章は主にMySQLデータベースの誤操作の後で急速にロールバックする方法の関連資料を紹介して、必要な友達は参考にすることができます
基本的には、データベースと付き合っているプログラマー(もちろん同僚かもしれません)は、MySQLが誤操作した後、どのようにして迅速にロールバックするかという問題に直面します.例えば、deleteは1枚の表で、制限条件を忘れて、1枚の表がなくなりました.もしこれがオンライン環境の核心業務データであれば、このことは大きくなります.誤操作後、データをすばやくロールバックできることが重要です.
binlog 2 sqlクイックロールバック
まず、MySQLサーバがbinlogを開いていることを確認し、以下のパラメータを設定します.
?
1 2 3 4 5 [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_size = 1000M binlog-format = row
binlogをオンにしていないし、ロールバックSQLを事前に生成していないと、本当に速くロールバックできません.重要なビジネスデータを格納するMySQLに対してbinlogを開くことを強くお勧めします.
次に、オープンソースツールbinlog 2 sqlをインストールします.binlog 2 sqlは簡単で使いやすいbinlog解析ツールで、その機能の一つはロールバックSQLを生成することです.
?
1 2 git clone https://github.com/danfengcao/binlog2sql.git pip install -r requirements.txt
その後、ロールバックSQLを生成できます.
背景:testライブラリfテーブル全体のデータを誤って削除し、緊急ロールバックが必要です.
既存データ
?
1 2 3 4 5 6 7 8 9 10 11 12 13 mysql> select * from f; + -----+-----+---------------------+ | uid | did | updateTime     | + -----+-----+---------------------+ |  1 | 18 | 2016-12-06 12:28:18 | |  2 | 19 | 2016-12-06 12:55:56 | |  3 | 20 | 2016-12-07 14:00:58 | |  4 | 21 | 2016-12-07 14:01:00 | + -----+-----+---------------------+ mysql> delete from f;Query OK, 4 rows affected (0.00 sec) f mysql> select * from f; Empty set (0.00 sec)
ロールバック手順:
mysqlにログインし、現在のbinlogファイルを表示
?
1 2 3 4 5 6 7 mysql> show master logs; + ------------------+-----------+ | Log_name     | File_size | + ------------------+-----------+ | mysql-bin.000001 | 12262268 | | mysql-bin.000002 |  132776 | + ------------------+-----------+
最新のbinlogファイルはmysql-binです.000002,SQLのbinlog位置を誤操作する
?
1 $ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p 'admin' -dtest -t f --start-file='mysql-bin.000002'
出力:
?
1 2 3 4 DELETE FROM `test`.`f` WHERE `did`=18 AND `updateTime`= '2016-12-06 12:28:18' AND `uid`=1 LIMIT 1; #start 4 end 314 DELETE FROM `test`.`f` WHERE `did`=19 AND `updateTime`= '2016-12-06 12:55:56' AND `uid`=2 LIMIT 1; #start 4 end 314 DELETE FROM `test`.`f` WHERE `did`=20 AND `updateTime`= '2016-12-07 14:00:58' AND `uid`=3 LIMIT 1; #start 4 end 314 DELETE FROM `test`.`f` WHERE `did`=21 AND `updateTime`= '2016-12-07 14:01:00' AND `uid`=4 LIMIT 1; #start 4 end 314
ロールバックsqlを生成し、ロールバックsqlが正しいかどうかを確認します.
?
1 $ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p 'admin' -dtest -t f --start-file='mysql-bin.000002' --start-pos=4 --end-pos=314 -B
出力:
?
1 2 3 4 INSERT INTO `test`.`f`(`did`, `updateTime`, `uid`) VALUES (21, '2016-12-07 14:01:00' , 4); #start 4 end 314 INSERT INTO `test`.`f`(`did`, `updateTime`, `uid`) VALUES (20, '2016-12-07 14:00:58' , 3); #start 4 end 314 INSERT INTO `test`.`f`(`did`, `updateTime`, `uid`) VALUES (19, '2016-12-06 12:55:56' , 2); #start 4 end 314 INSERT INTO `test`.`f`(`did`, `updateTime`, `uid`) VALUES (18, '2016-12-06 12:28:18' , 1); #start 4 end 314
ロールバックsqlが正しいことを確認し、ロールバック文を実行します.mysqlにログインし、データのロールバックに成功しました.
?
1 2 3 4 5 6 7 8 9 10 $ python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p 'admin' -dtest -t f --start-file='mysql-bin.000002' --start-pos=4 --end-pos=314 -B | mysql -h127.0.0.1 -P3306 -uadmin -p'admin' mysql> select * from f; + -----+-----+---------------------+ | uid | did | updateTime     | + -----+-----+---------------------+ |  1 | 18 | 2016-12-06 12:28:18 | |  2 | 19 | 2016-12-06 12:55:56 | |  3 | 20 | 2016-12-07 14:00:58 | |  4 | 21 | 2016-12-07 14:01:00 | + -----+-----+---------------------+
これで首になる心配はない.
よくある質問
  • DDLが間違って操作したのにどうやって素早くロールバックするのかと聞かれる人がいます.例えばdropは大きな時計を持っています.

  • なかなかできません.rowモードでもDDL操作では1行あたりのデータの変化がbinlogに記録されないため、DDLはbinlogでロールバックできない.DDLロールバックを実現するには、DDLを実行する前に古いデータをバックアップする必要があります.確かにmysql serverのソースコードを修正することでDDLの高速ロールバックを実現した人がいて、アリのxiaobin linを見つけてpatchを提出しました.しかし、私の知っている限りでは、国内ではこの特性を応用しているインターネット会社は少ない.理由は、最も主要なのは怠け者だと思います.この低周波機能をする必要はありません.副次的な原因は、追加のストレージを増やすことです.
    したがって、DDLが誤動作した場合は、バックアップによるリカバリのみが一般的です.もし会社がバックアップも使えなくなったら、本当に航空券を買うことをお勧めします.何してるの?走れ!
  • mysql binlog 2 sqlのほかに、ロールバックツールはありますか?

  • もちろんあります.アリ彭立勲はmysqlbinlogにflashbackの特性を追加した.これはmysqlが最初に持っていたflashback機能であるはずだ.彭はDMLのロールバックを解決し、binlogを利用してDMLフラッシュバックを行う設計構想を説明した.DDLロールバック特性もアリチームが提案し実現した.この2つの機能には革新的な精神があり、その後現れたフラッシュバックツールは基本的に上の2つの模倣である.また、どこでオープンソースのInceptionはMySQL自動化メンテナンスツールで、これは比較的重いです.DMLロールバックをサポートしています.binlogからロールバックしているわけではありません.バックアップからロールバックしています.DDLロールバックテーブル構造もサポートしています.データはロールバックできません.