MySQL誤操作後の高速ロールバック方法
従来の解法
フルバックアップでインスタンスを再ロードし、インクリメンタル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> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000046 | 12262268 |
| mysql-bin.000047 | 3583 |
+------------------+-----------+
```
-
binlog mysql-bin.000047, SQL binlog
$ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000047'
:
DELETE FROM test
・tbl
WHEREaddtime
='2016-12-10 00:04:33'ANDid
=1 ANDname
=' 'LIMIT 1;start 3346 end 3556 DELETE FROM test
. tbl
WHEREaddtime
='2016-12-10 00:04:48'ANDid
=2 ANDname
=' 'LIMIT 1;start 3346 end 3556 DELETE FROM test
. tbl
WHEREaddtime
='2016-12-10 00:04:51'ANDid
=3 ANDname
=' 'LIMIT 1;start 3346 end 3556 DELETE FROM test
. tbl
WHEREaddtime
='2016-12-10 00:04:56'ANDid
=4 ANDname
=' 'LIMIT 1;start 3346 end 3556 ```
- ロールバックsqlを し、ロールバックsqlが しいか する
$ 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 test
・tbl
(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 ```
- ロールバックsqlが しいことを し、ロールバック を する.mysqlにログインして し、データのロールバックに しました.
$ 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 , 。
[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