MySQL误删数据后快速恢复的方法
传统解法
用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态。然后跳过误操作的SQL,再继续应用binlog。
利用binlog2sql快速闪回
首先,确认你的MySQL server开启了binlog,设置了以下参数:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 100M
binlog-format = row
如果没有开启binlog,也没有预先生成回滚SQL,那真的无法快速回滚了。对存放重要业务数据的MySQL,强烈建议开启binlog。
随后,安装开源工具binlog2sql。binlog2sql是一款简单易用的binlog解析工具,其中一个功能就是生成回滚SQL。
shell> git clone https://github.com/danfengcao/binlog2sql.git
shell> pip install -r requirements.txt
然后,我们就可以生成回滚SQL了。
背景:小明在20点多时误删了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-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)
恢复数据步骤:
1、登录mysql,查看目前的binlog文件
mysql> show master status;
+------------------ |
+----------- |
+ |
| Log_name |
| File_size | |
|
+------------------ |
+----------- |
+ |
| mysql-bin.000051 | |
967 | |
|
| mysql-bin.000052 | |
965 | |
|
+------------------ |
+----------- |
+ |
2、最新的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:25:00', 3, '小孙'); #start 4 end 290 time 2016-12-13 20:25:46 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
3、我们得到了误操作sql的准确位置在728-938之间,再根据位置进一步过滤,使用flashback模式生成回滚sql,检查回滚sql是否正确
shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-pos=3346 --end-pos=3556 -B 输出:
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> python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --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-13 20:25:00 |
| 4 | 小李 | 2016-12-12 00:00:00 |
+----+--------+---------------------+
MySQL误删数据后快速恢复的方法相关推荐
- mysql误删数据后 快速恢复的办法
手抖不小心把表里的数据删除或修改错误怎么办?该如何快速恢复呢?遇到这样的问题怎么办?希望下面这篇文章能够帮助到你! 第一步:保证mysql已经开启binlog,查看命令: 查看binklog是否开启 ...
- MySQL误删数据?快速恢复!
MySQL误删数据?快速恢复! 第一步:保证mysql已经开启binlog,查看命令: 查看binklog是否开启! show variables like '%log_bin%'; 查看binlog ...
- MySQL误删数据后,查找操作日志并恢复数据
有时候直接操作数据库,可能会出现误删除一些数据的情况,比如删了某个表中某一行数据,事后发现该条数据是误删的,还需要恢复,但是又不太记得具体每个字段原来的数据是什么了,只能要查到之前删掉的数据每个字段值 ...
- MySQL误删数据?快速恢复指南来了!
作者:一个人的孤独自白 cnblogs.com/-mrl/p/9959365.html 相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸 ...
- db2怎么恢复误删除的数据_DB2误删数据后的恢复方法实践
1.在源库中使用以下语句生成重定向脚本: db2 "restore db dbname from /yourdbparth taken at timestamp into dbname re ...
- mysql删除数据后id自增不连续的解决方法
mysql删除数据后id自增不连续的解决方法 参考文章: (1)mysql删除数据后id自增不连续的解决方法 (2)https://www.cnblogs.com/weifeng-888/p/1163 ...
- mysql c接口返回自增id_详解mysql插入数据后返回自增ID的七种方法
引言 mysql 和 oracle 插入的时候有一个很大的区别是: oracle 支持序列做 id: mysql 本身有一个列可以做自增长字段. mysql 在插入一条数据后,如何能获得到这个自增 i ...
- mysql 新增返回主键自增id_详解mysql插入数据后返回自增ID的七种方法
引言 mysql 和 oracle 插入的时候有一个很大的区别是: oracle 支持序列做 id: mysql 本身有一个列可以做自增长字段. mysql 在插入一条数据后,如何能获得到这个自增 i ...
- 七种MYSQL插入数据后返回自增主键ID的方法
我们都知道,mysql中的insert插入之后会有返回值,返回的是影响的行数,也就是说,成功插入一条数据之后返回的是1,失败则返回0.那么,很多时候我们都想要得到最后插入的id值,下面七种方法均可,结 ...
最新文章
- 理解NSAttributedString
- pyqtdeploy教程_PyQtdeploy-V2.4 User Guide 中文 (一)
- Python开发基础总结之模块+日志+自省
- python物联网通信_物联网通信RESTDemo示例程序(Python版本)
- Java程序员校招蚂蚁金服,mysql培训考试
- PHP课程20161114
- Intel Realsense D435 关于深度摄像头获取实际深度坐标时的常见问题及可能的解决方案
- MULE ESB简介
- python hadoop streaming_Hadoop Streaming 使用及参数设置
- 适用于ATI卡的GPU计算MD5的小程序源码,基于AMD APP SDK开发
- RK方案 manifest.xml编译问题,并解决方案
- flowable 查询完成的流程_中注协正在调试注册会计师成绩查询系统?
- OpenGL ES 中的模板测试
- 一道学吧上的题目,python3 - 解决高中的古典概率问题: 有A、B两个袋子。A袋中装有4个白球、2个黑球,B袋中装有3个白球、4个黑球。从A、B两个袋子中
- csdn插件下载和应用
- 通过2048学习自定义view(二) 滑动事件监听 与 事件回调
- UART协议及其Verilog实现
- 分子动力学理论部分总结(未整理完)
- 台式计算机能不能安装蓝牙驱动,几个方法教你台式电脑怎么安装蓝牙
- HDU 6208 The Dominator of Strings [AC自动机]