这篇文章主要介绍了关系型数据库数据库误操作后快速回滚的方法的相关资料,需要的朋友可以参考下
基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,删除一张表,忘加限制条件,整张表没了。假如这还是线上环境核心业务数据,那这事就闹大了。误操作后,能快速回滚数据是非常重要的。
binlog2sql快速回滚
首先,确认你的关系型数据库服务器开启了binlog,设置了以下参数:
[mysqld]
服务器id=1
log _ bin=/var/log/MySQL/MySQL-bin。原木
max _ binlog _ size=1000M米米
binlog-format=row
如果没有开启binlog,也没有预老师成回滚SQL,那真的无法快速回滚了。对存放重要业务数据的MySQL,强烈建议开启宾洛格。
随后,安装开源工具binlog2sql是一款简单易用的binlog解析工具,其中一个功能就是生成回滚SQL。
饭桶克隆https://github.com/danfengcao/binlog2sql.git
点安装-r要求。文本文件(textfile)
然后,我们就可以生成回滚结构化查询语言了。
背景:误删了试验库f表整张表的数据,需要紧急回滚。
原有数据
MySQL select * from f;
- - -
| uid | did | updateTime |
- - -
| 1 | 18 | 2016-12-06 12:28:18 |
| 2 | 19 | 2016-12-06 12:55:56 |
| 3 | 20 | 2016-12-07 14:00:58 |
| 4 | 21 | 2016-12-07 14:01:00 |
- - -
误操作关系型数据库从f中删除;查询正常,4行受影响(0.00秒)
f表被清空
MySQL select * from f;
空集(0.00秒)
回滚步骤:
登录mysql,查看目前的binlog文件
关系型数据库显示主日志;
- -
|日志名称|文件大小|
- -
| mysql-bin.000001 | 12262268 |
| mysql-bin.000002 | 132776 |
- -
最新的binlog文件是mysql-bin.000002我们再定位误操作结构化查询语言的binlog位置
$ python binlog 2 SQL/binlog 2 SQL。py-h 127。0 .0 .1-p 3306-ua dmin-p admin -dtest-t f-start-file= MySQL-bin。000002
输出:
从"测试` f "中删除,其中" did "=18,"更新时间"="2016-12-06 12:28:18 "和" uid "=1限制1;#开始四结束314
从"测试` f "中删除,其中" did "=19,"更新时间"="2016-12-06 12:55:56 "和" uid "=2限制1;#开始四结束314
从"测试` f "中删除,其中" did "=20,"更新时间"="2016-12-07 14:00:58 "和" uid "=3限制1;#开始四结束314
从"测试` f "中删除,其中" did "=21,"更新时间"="2016-12-07 14:01:00 "和" uid "=4限制1;#开始四结束314
生成回滚sql,并检查回滚结构化查询语言是否正确
$ python binlog 2 SQL/binlog 2 SQL。py-h 127。0 .0 .1-p 3306-ua dmin-p admin -dtest-t f-start-file= MySQL-bin。000002 -开始位置=4-结束位置=314-B
输出:
插入到` test`.`f`(`did,` updateTime,` uid `)值中(21, 2016-12-07 14:01:00 ,4);#开始四结束314
插入到` test`.`f`(`did,` updateTime,` uid `)值中(20, 2016-12-07 14:00:58 ,3);#开始四结束314
插入到` test`.`f`(`did,` updateTime,` uid `)值中(19, 2016-12-06 12:55:56 ,2);#开始四结束314
插入到` test`.`f`(`did,` updateTime,` uid `)值中(18, 2016-12-06 12:28:18 ,1);#开始四结束314
确认回滚结构化查询语言正确,执行回滚语句。登录mysql,数据回滚成功。
$ python binlog 2 SQL。py-h 127。0 .0 .1-p 3306-ua dmin-p admin -dtest-t f-start-file= MySQL-bin。000002 -start-pos=4-end-pos=314-B | MySQL-h 127。0 .0 .1-p 3306-ua dmin-p 管理
MySQL select * from f;
- - -
| uid | did | updateTime |
- - -
| 1 | 18 | 2016-12-06 12:28:18 |
| 2 | 19 | 2016-12-06 12:55:56 |
| 3 | 20 | 2016-12-07 14:00:58 |
| 4 | 21 | 2016-12-07 14:01:00 |
- - -
至此,不用再担心被炒鱿鱼了。
常见问题
有人会问,我数据定义语言误操作了怎么快速回滚?比如滴了一张大表。
很难做到。即使在行模式下,DDL操作也不会将每行数据的变化记录到binlog,所以DDL无法通过binlog回滚。要实现DDL回滚,必须在执行DDL之前备份旧数据。确实有人修改了mysql服务器的源代码来实现DDL的快速回滚。我找到阿里的林,提交了一个补丁。但据我所知,国内的互联网公司很少有应用这个功能的。至于原因,我认为最重要的是懒。没必要搞这种低频功能。第二个原因是会增加一些额外的存储。
所以DDL误操作只能通过备份来恢复。如果公司连备份都用不上,真的建议买机票。为什么快跑!
除了mysql binlog2sql还有其他回滚工具吗?
当然有。阿里李勋在mysqlbinlog中加入了闪回功能,这应该是mysql最早的闪回功能。彭解决了DML的回滚问题,说明了使用binlog进行DML闪回的设计思路。DDL的回滚特性也是由Ali团队提出并实现的。这两个功能是创新的,此后出现的闪回工具基本都是对以上两个的模仿。另外,去哪儿开源的Inception是一个MySQL自动运维工具,比较重。它支持DML回滚,不是从binlog,而是从backup,还支持DDL回滚表结构。数据无法回滚~
以上是边肖介绍的MySQL数据库误操作后的快速回滚方法。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!