5.6和5.7版本的MySQL,有个参数binlog_row_image,默认值为FULL,表示记录的是全部的binlog操作日志(仅在binlog_format=ROW时候生效)。此外binlog_row_image还可以是minimal,表示binlog记录的就只是影响后的行。如此一来使用ROW格式就能节约很多的磁盘空间。
因此,我们服务器上就可以直接设置binlog_format=ROW格式了,至于binlog_row_image设置为FULL还是minimal,各位就自行考虑了。
环境版本如下:
> SELECT @@version
+-------------+
| @@version |
|-------------|
| 5.6.34-log |
+-------------+
> SELECT @@binlog_format;
+-------------------+
| @@binlog_format |
|-------------------|
| ROW |
+-------------------+
假设我们的操作都是在一个库里面执行的,MySQL服务器上只跑了这一个hellodb业务的数据库。
如果数据库多的话,还会增大恢复的难度,如下事例(下面的grant操作实例不够明显,但是差不多就是那个操作步骤):
step1 准备一个全量备份:
mysqldump --flush-logs -A > /root/all.sql
step2 手工误操作删除部分数据
> use hellodb;
> delete from scores where `StuID`=8 AND `ID`=14;
# 模拟误操作删了1条用户数据,然后上报需要回滚操作。
此时还有个线程,执行了 grant all on *.* to 'abc'@'%'; 假设这个grant操作的是管理员正常的操作。
> delete from scores where `StuID`=5 AND `ID`=10;
# 模拟再次误操作删了1条用户数据,然后上报需要回滚操作。
........
........
在我们发现操作错了,到汇报这期间,还要很多用户的正常操作,也造成了数据库的一些更新。例如下面这条插入的记录。
........
INSERT INTO stu