这两天线上数据被误删除为了回滚折腾了两天终于搞定,其中用到了mysql的binlog以此记录一下。
之前没有搞过mysql的mysqlbinlog查看了很多文档但是多数为简单的教程,虽然有用但是还是相对疑惑。因此自己记录一下希望有用。
mysqlbinlog是mysql自带的回滚数据的机制,默认是不开启的需要手动开启。
一、开启mysql-binlog日志
在mysql配置文件my.cnf加上如下配置
[mysqld]
log-bin=mysql-bin
重启mysql
service mysqld restart

这里有一点有可能你是使用的阿里云的rds服务,那样的话应该是已经默认开启了binlog,可以直接登录阿里云平台下载binlog文件。不过也可以登录进行查看到底是否已经开启了。不过这个貌似只要你权限够用

二、显示是否已经开启了binlog命令

show variables like ‘log_bin’

mysql 查看正在回滚的表 mysql回滚日志_mysql


显示on表示已经开启了binlog

三、获取文件进行恢复
1、直接进行恢复
mysqlbinlog /usr/local/mysql/data/binlog.123456 | mysql -u root -p
2、按位置进行恢复 主要参数[–stop-position –start-position]
mysqlbinlog –stop-position=368312 –start-position=368315 /usr/local/mysql/data/binlog.123456 | mysql -u root -p
这里的位置可以通过读取binlog文件进行查看,不过这个也必须自己知道进行了那些操作。后面说如果看到的文件都是乱码或者看不到真正sql的问题
3、按时间点进行恢复 主要参数 [–stop-datetime –start-datetime]
mysqlbinlog –stop-datetime=”2005-04-20 9:59:59” –start-datetime=”2005-04-20 10:01:00” /usr/local/mysql/data/binlog.123456 | mysql -u root -p
时间点恢复跟位置恢复道理一样,也必须知道具体操作的时间和要恢复到什么时间
4、不同的方式进行恢复
1、如果是登录到了mysql并且binlog也是在一台服务器上切一般binlog的目录会在mysql安装目录下data文件下那么就可以直接进行恢复
这种情况可以直接在mysql下执行命令
2、如果是只拿到了binlog文件,并且是线下的服务器需要先尝试数据正确后再导入生产的
这种情况可以先把binlog文件输出到你制定的sql文件如:
mysqlbinlog /usr/local/mysql/data/binlog.123456 > /tmp/mysql.sql
这样的输出有可能是看不到任何有价值的sql如果想看到标准的sql可以使用
mysqlbinlog –base64-output=DECODE-ROWS -v /usr/local/mysql/data/binlog.123456 > /tmp/mysql.sql

上面的情况也可能得到的sql不是想要的需要进行替换,那么如果数据量少手动替换@1@2就可以如果比较多建议使用开源工具mysql2binlog

最后一点线上数据一定要当心,虽然mysql有binlog机制,但还是希望人尽量少用它!