sql里面没有加where 导致更新了所有数据(美团还是大众点评开源了一个binlog2sql的工具就是为了这个场景 原理还是binlog里面挖数据) 吐槽下 mysql确实没有O强大需要借助开源力量,可能这也是mysql比O强的一个方面
mysql是8.0版本
binlog_format | ROW |
如果是statement形式的就不行了 或者你是mixed 但是事务隔离级别设置为RR也会有问题
关于binlg_format形式的问题state是记录sql 而row是记录的是哪条记录被修改
mysql> select * from aa;
+------+------+------+
| id | name | mark |
+------+------+------+
| 1 | xixi | 50 |
| 2 | haha | 60 |
| 3 | lala | 40 |
| 4 | kaa | 90 |
+------+------+------+
需求是<60 的更改为fail update aa set mark='fail' where mark<60; 这个时候忘记写where 条件
mysql> select * from aa;
+------+------+------+
| id | name | mark |
+------+------+------+
| 1 | xixi | fail |
| 2 | haha | fail |
| 3 | lala | fail |
| 4 | kaa | fail |
+------+------+------+ 就变成这个结果
开始恢复 停掉前端所有应用
mysqlbinlog --no-defaults -vv --base64-output=DECODE-ROWS bin.000006 |grep -B 15 'fail' |more
取出这里的信息 修改前的数据和修改后的数据都在这里 自己写脚本修改一下恢复就好了