【mysqlデータテーブル復元】テーブル全体のデータを誤って削除し、緊急ロールバックが必要


適用事例
テーブル全体のデータを誤って削除するには、緊急ロールバックが必要です.
test tbl     
mysql> select * from tbl;
+----+--------+---------------------+
| id | name   | addtime             |
+----+--------+---------------------+
|  1 |      | 2016-12-10 00:04:33 |
|  2 |      | 2016-12-10 00:04:48 |
|  3 |      | 2016-12-13 20:25:00 |
|  4 |      | 2016-12-12 00:00:00 |
+----+--------+---------------------+
4 rows in set (0.00 sec)

mysql> delete from tbl;
Query OK, 4 rows affected (0.00 sec)

20:28 ,tbl       
mysql> select * from tbl;
Empty set (0.00 sec)

データを復元するには、次の手順に従います.
  • mysqlにログインし、現在のbinlogファイル
    mysql> show master status;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000051 |       967 |
    | mysql-bin.000052 |       965 |
    +------------------+-----------+
  • を表示します.
  • 最新のbinlogファイルはmysql-binです.000052、誤操作SQLのbinlog位置を再配置します.誤操作者は大まかな誤操作時間しか知らず,大まかな時間に基づいてデータをフィルタリングする.
    shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-datetime='2016-12-13 20:25:00' --stop-datetime='2016-12-13 20:30:00'
      :
    INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:26:00', 4, '  '); #start 317 end 487 time 2016-12-13 20:26:26
    UPDATE `test`.`tbl` SET `addtime`='2016-12-12 00:00:00', `id`=4, `name`='  ' WHERE `addtime`='2016-12-13 20:26:00' AND `id`=4 AND `name`='  ' LIMIT 1; #start 514 end 701 time 2016-12-13 20:27:07
    DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:33' AND `id`=1 AND `name`='  ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
    DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-10 00:04:48' AND `id`=2 AND `name`='  ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
    DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-13 20:25:00' AND `id`=3 AND `name`='  ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
    DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-12 00:00:00' AND `id`=4 AND `name`='  ' LIMIT 1; #start 728 end 938 time 2016-12-13 20:28:05
  • 誤操作sqlの正確な位置が728-938の間にあることを得て、さらに位置によってフィルタリングし、flashbackモードを使用してロールバックsqlを生成し、ロールバックsqlが正しいかどうかを確認します(注:実際の環境では、このステップで必要なsqlをさらにフィルタリングすることがよくあります.grep、エディタなどと組み合わせて)
    shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-position=3346 --stop-position=3556 -B > rollback.sql | cat
      :
    INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, '  '); #start 728 end 938 time 2016-12-13 20:28:05
    INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, '  '); #start 728 end 938 time 2016-12-13 20:28:05
    INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, '  '); #start 728 end 938 time 2016-12-13 20:28:05
    INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, '  '); #start 728 end 938 time 2016-12-13 20:28:05
  • ロールバックsqlが正しいことを確認し、ロールバック文を実行します.mysqlにログインして確認し、データのロールバックに成功しました.
    shell> mysql -h127.0.0.1 -P3306 -uadmin -p'admin' < rollback.sql
    
    mysql> select * from tbl;
    +----+--------+---------------------+
    | id | name   | addtime             |
    +----+--------+---------------------+
    |  1 |      | 2016-12-10 00:04:33 |
    |  2 |      | 2016-12-10 00:04:48 |
    |  3 |      | 2016-12-13 20:25:00 |
    |  4 |      | 2016-12-12 00:00:00 |
    +----+--------+---------------------+

  • 参照リンク:https://github.com/danfengcao/binlog2sql