binlog的三种模式
- statement:记录每一条修改数据的sql
- row:保存哪条记录被修改
- mixed:兼顾前两者的优点。
# 查看binlog有没有开启
SHOW VARIABLES LIKE 'log_bin%';
# 查看当前binlog的模式
SHOW VARIABLES LIKE 'binlog%';
在配置文件中添加一行:binlog_format=”ROW”,即可设置成row模式,其他模式同理
-- 查看当前是在哪个日志文件中
SHOW MASTER STATUS;
# 截断日志文件,重新定向到新的日志文件中
# 每次操作binlog恢复前,都需要执行下此命令,能够保证之前的日志文件不会再有新的日志在到这个文件中,影响恢复。
FLUSH LOGS;
# 查询出这些日志文件保存的路径
show variables like '%datadir%';
# get所有的操作记录
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
cd /var/lib/mysql
# get这个binlog文件所有的操作记录, 有详细时间
mysqlbinlog --no-defaults mysql-bin.000001
# get某个区间的操作记录
mysqlbinlog --no-defaults --start-position=120 --stop-position=220226 mysql-bin.000001
# 在后面加管道符|mysql -uroot -p,用这个区间的操作记录去恢复到数据库
mysqlbinlog --no-defaults --start-position=120 --stop-position=220226 mysql-bin.000001 ||mysql -uroot -p
mysqlbinlog --stop-datetime="2022-2-26 20:17:33" mysql-bin.000001 |mysql -uroot -p
mysqlbinlog --start-datetime="2022-2-25 20:17:00" --stop-datetime="2022-2-26 20:17:33" mysql-bin.0000* |mysql -uroot -p
注意事项
- 每次重启mysql服务都会创建一个新的binlog文件
FLUSH LOGS;
也会创建一个新的binlog- 恢复之前建议
FLUSH LOGS;
生成一个新的binlog,把恢复操作都写到新的binlog中。 - 恢复的过程中可能遇到主键冲突,可能是有binlog记录了mysql的一些自带数据的创建,应该找好恢复的开始位置,别把mysql数据的创建记录也恢复了。
- 去找这些binlog,以自己数据库的创建position开始,一个个binlog去恢复,直到最近被删除前的位置。
- 建议以位置position或者整个binglog文件恢复。当然也可以
mysql-bin.0000*
匹配所有binlog然后指定--start-datetime
和--stop-datetime
去恢复。 - position的选取,取
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
结果的End_log_pos
列的值。
清空binlog
先用navicat导出一份数据,
删除数据库,
然后清空binlog文件
cd /var/lib/mysql
rm -f mysql-bin.0000*
:> mysql-bin.index
重启mysql
systemctl restart mysql
用navicat导入数据,
查看binlog日志
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
生成新的binlog
FLUSH LOGS;
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/273373.html