MySQL使用bin-log将数据恢复到某个时间点


binlog的三种模式

  1. statement:记录每一条修改数据的sql
  2. row:保存哪条记录被修改
  3. 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

注意事项

  1. 每次重启mysql服务都会创建一个新的binlog文件
  2. FLUSH LOGS;也会创建一个新的binlog
  3. 恢复之前建议FLUSH LOGS;生成一个新的binlog,把恢复操作都写到新的binlog中。
  4. 恢复的过程中可能遇到主键冲突,可能是有binlog记录了mysql的一些自带数据的创建,应该找好恢复的开始位置,别把mysql数据的创建记录也恢复了。
  5. 去找这些binlog,以自己数据库的创建position开始,一个个binlog去恢复,直到最近被删除前的位置。
  6. 建议以位置position或者整个binglog文件恢复。当然也可以mysql-bin.0000*匹配所有binlog然后指定--start-datetime--stop-datetime去恢复。
  7. 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

(0)
上一篇 2022年7月10日
下一篇 2022年7月10日

相关推荐

发表回复

登录后才能评论