背景
线上环境核心业务数据,delete/update
操作一张表,忘加 where
限制条件,如何快速恢复?
方案
- 备份恢复:先用全量备份恢复实例,再利用增量
binlog
备份恢复到误操作之前的状态,费时费力! - 第三方工具:binlog2sql(支持
DML Delete/Update
等语句回滚,不支持DDL Drop
等语句回滚)
binlog2sql 工具实战
支持
- MySQL 5.6/5.7
- Delete、Update
要求
- MySQL 配置要求
1 | [mysqld] |
1 | mysql> show variables like 'server_id'; |
- MySQL 权限要求:
SELECT
、REPLICATION SLAVE
、REPLICATION CLIENT
1 | mysql> show grants for 'cosmo_t'\G |
- 申请特权账号,登录服务器
操作步骤
安装 pip
安装 binlog2sql
1 | $ cd /usr/local/src |
- 根据误操作时间,确定
binlog
文件
1 | mysql> show master status; |
- 定位误执行
SQL
1 | $ python binlog2sql.py -h'x.x.x.x' -uroot -p'xx' -dtest -temployees --start-file='mysql-bin.000020' --sql-type=DELETE > result.sql |
- 解析出回滚
SQL
,并检查回滚SQL
是否正确
1 | $ python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'xx' -dtest -temployees --start-file='mysql-bin.000020' --start-pos=66374969 --end-pos=66375406 -B > rollback.sql |
Tips:回滚条数可以使用
%s/pattern/&/g
进行统计,pattern
是要搜索的关键字。
- 确认回滚
SQL
正确,执行回滚语句
1 | $ mysql -h127.0.0.1 -P3306 -uroot -p'xx' < rollback.sql |
工具
1 | # 连接配置 |
注意事项
- 还是先恢复再去面壁思过吧!
- 手工执行
delete
、update
语句前,先执行selete
语句。 drop
或者truncate
语句造成的误操作,通过备份来恢复。