mysql原生自带mysqlbinlog,但使用binlog恢复的原理是“重做”而不是“回滚”。网上相当多的文章描述mysqlbinlog用法的时候,并没有进行完整说明(先使用完整备份恢复数据库至最近备份时间点,再利用binlog恢复上次备份到现在的剩余数据)。
如果线上环境着急“回滚”,哪有时间去暂停业务,恢复备份,并学习binlog,结果很可能就是乱上加乱。因此,借助处理一起误删除的事故,整理记录快速回滚操作,以备以后不时之需。
首先,阿里RDS免费版是支持回滚的,此功能在"数据追踪"里.选择时间/库/表等内容,即可追踪到误操作的数据,并直接给出回滚sql语句,copy出来执行即可.
此方法其实可以解决大部门问题.只是有点限制,比如之前有时间限制,我记得大概是1个小时(限制比较大).目前是容量限制,可以追踪2G的数据(基本够用了).
另外,如果是使用工具进行的delete删除了1万条数据,很有可能会产生1万条delete语句和1万条回滚语句.这样操作起来会累死人.
所有感谢binlog2sql项目的存在.如果有时间请尽量阅读原项目说明.
mysql server服务器在线
开启了binlog日志(如果使用的阿里RDS,肯定是开启的)
binlog2sql 是基于python 的第三方项目,
项目地址:https://github.com/danfengcao/binlog2sql
安装方法:
shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
shell> pip install -r requirements.txt
推荐使用国内豆瓣加速下载
shell> pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
因此需要python环境,和pip工具。
本着不求最好,只求最快的原则,推荐使用anaconda
到国内镜像下载适合自己操作系统的安装包。
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
比如我使用的
shell>wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh
然后给予执行权限,并执行.
shell>chmod +x Anaconda3-5.3.1-Linux-x86_64.sh
shell>./Anaconda3-5.3.1-Linux-x86_64.sh
重新到binlog2sql目录下,安装binlog2sql的requirements
如果没有export python的环境变量,你也许需要写出pip的完整路径,比如:
~/anaconda3/bin/pip install -r requirements.txt
- 找到记录数据的binlog文件(必须)
阿里RDS最简单的办法,RDS>>>某实例>>>备份恢复>>>日志备份,
列表里根据时间,列出了数据在哪个文件.如果最新的操作时间不在此列表里,那就是还没有备份,存在于RDS的本地实例中,进入实例新建查询,
show master logs;
这里有,而列表里没有的,就是最新的binlog,需要的数据在于此,记录下这个log_name.
此步先大范围粗略的查找原始sql语句,再从中锁定导致错误的 关键的那一条 sql语句.
~/anaconda3/bin/python binlog2sql/binlog2sql.py -h rm-xxxxxxxxx.mysql.rds.aliyuncs.com -uroot -p -d dbname -t tablename --start-datetime='2019-09-16 11:44:00' --stop-datetime='2019-09-16 11:50:00' --start-file='mysql-bin.00003'>binlog000003.sql
通过grep或者文件编辑器,找到具体的sql语句.接着就可以通过–flashback(-B)参数生成闪回回滚sql了.
~/anaconda3/bin/python binlog2sql/binlog2sql.py --flashback -h rm-xxxxxxxxx.mysql.rds.aliyuncs.com -uroot -p -d dbname -t tablename --start-file='mysql-bin.001003'>binlog001003-backup.sql
--start-position=1000 --stop-position=2000
--start-datetime='2019-09-16 11:44:00' --stop-datetime='2019-09-16 11:50:00'
通过加入点或者时间参数,来精确范围,用法跟mysqlbinlog命令是一样的.导出sql之后,也可以编辑sql语句来筛选.
把回滚语句发给业务部门,确认后执行.
比如
shell> mysql -h127.0.0.1 -P3306 -uroot -p'admin' < /tmp/rollback.sql