微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐