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

6065 ワード

基本的には、データベースと付き合っているプログラマー(もちろん同僚かもしれません)は、MySQLが誤操作した後、どのようにして迅速にロールバックするかという問題に直面します.例えばdeleteは1枚の表で、制限条件をつけるのを忘れて、全体の表がなくなりました.もしこれがオンライン環境の核心業務データであれば、このことは大きくなります.誤操作後、データをすばやくロールバックできることが重要です.
従来の解法
フルバックアップでインスタンスを再ロードし、インクリメンタルbinlogバックアップを再利用して、誤操作前の状態に復元します.その後、誤操作のSQLをスキップし、binlogを適用し続けます.この方法は時間と労力がかかり,これ以上推薦する価値がない.
binlog 2 sqlによる高速フラッシュバック
まず、MySQLサーバがbinlogを開いていることを確認し、以下のパラメータを設定します.
[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を生成することです.
git clone https://github.com/danfengcao/binlog2sql.git
pip install -r requirements.txt

その後、ロールバックSQLを生成できます.
背景:testライブラリtblテーブル全体のデータを誤って削除し、緊急ロールバックが必要です.
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-10 00:04:51 |
|  4 |      | 2016-12-10 00:04:56 |
+----+--------+---------------------+
4 rows in set (0.00 sec)

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

tbl    
mysql> select * from tbl;
Empty set (0.00 sec)

データを復元するには、次の手順に従います.
  • mysqlに登録し、現在のbinlogファイルを見る
  • mysql> show master logs;
    +------------------+-----------+
    | Log_name | File_size |
    +------------------+-----------+
    | mysql-bin.000046 | 12262268 |
    | mysql-bin.000047 | 3583 |
    +------------------+-----------+
    ```

    1. binlog mysql-bin.000047, SQL binlog

    2. $ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000047'

      DELETE FROM testtblWHEREaddtime='2016-12-10 00:04:33'ANDid=1 ANDname=' 'LIMIT 1;start 3346 end 3556 DELETE FROM test . tblWHEREaddtime='2016-12-10 00:04:48'ANDid=2 ANDname=' 'LIMIT 1;start 3346 end 3556 DELETE FROM test . tblWHEREaddtime='2016-12-10 00:04:51'ANDid=3 ANDname=' 'LIMIT 1;start 3346 end 3556 DELETE FROM test . tblWHEREaddtime='2016-12-10 00:04:56'ANDid=4 ANDname=' 'LIMIT 1;start 3346 end 3556 ```

    3. ロールバックsqlを し、ロールバックsqlが しいか する
    4. $ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000047' --start-pos=3346 --end-pos=3556 -B

      INSERT INTO testtbl(addtime,id,name)VALES('2016-12-10 00:04:56',4,' ');start 3346 end 3556 INSERT INTO test . tbl(addtime,id,name)VALES('2016-12-10 00:04:51',3,' ');start 3346 end 3556 INSERT INTO test . tbl(addtime,id,name)VALES('2016-12-10 00:04:48',2,' ');start 3346 end 3556 INSERT INTO test . tbl(addtime,id,name)VALES('2016-12-10 00:04:33',1,' ');start 3346 end 3556 ```

    5. ロールバックsqlが しいことを し、ロールバック を する.mysqlにログインして し、データのロールバックに しました.
    6. $ python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000047' --start-pos=3346 --end-pos=3556 -B | mysql -h127.0.0.1 -P3306 -uadmin -p'admin'

      mysql> select * from tbl;
      +----+--------+---------------------+
      | id | name | addtime |
      +----+--------+---------------------+
      | 1 | | 2016-12-10 00:04:33 |
      | 2 | | 2016-12-10 00:04:48 |
      | 3 | | 2016-12-10 00:04:51 |
      | 4 | | 2016-12-10 00:04:56 |
      +----+--------+---------------------+
      ```

      , 。

      • , DDL ? drop 。

      。 row ,DDL binlog, DDL binlog 。 DDL , DDL 。 mysql server DDL , xiaobin lin patch。 , 。 , , , 。

      ,DDL 。 , 。 ?

      • mysql binlog2sql, ?

        。 mysqlbinlog flashback , mysql flashback , DML , binlog DML 。DDL 。 , 。 , Inception MySQL , , DML , binlog , , DDL , ~ slave , slave, , 。 , 。

      mysql , 。

      [email protected]

      [1] , MySQL

      [2] Lixun Peng, Provide the flashback feature by binlog

      [3] , MySQL

      [4] xiaobin lin, flashback from binlog for MySQL

      [5] , inception

      [6] danfengcao, binlog2sql: Parse MySQL binlog to SQL you want