binlog恢复操作:
1、使用binlog直接还原
# --no-defaults参数可以解决字符集报错
mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -p #日志备份全部恢复
# 使用--database参数,从binlog日志中恢复单个库(两种写法)
mysqlbinlog --database=test mysql-bin.000001 |mysql -uroot -p123
mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -p test
有时会因为误删文件而恢复删除前状态,但是日志存储文件还是位于mysql-bin.000001,如果执行一次上面的命令,你会发现你的数据并没有恢复。WHY? 因为其实你已经恢复了,但是你又把它删除了。解决办法是定时使用flush logs存储文件
mysqlbinlog的时间和位置界定参数:
- --start-datetime:恢复的开始时间
- --stop-datetime:恢复的结束时间
- --start-position:恢复开始的位置
- --stop-position:恢复结束的位置
使用以上的参数,我们可以恢复到删除前一秒:
mysqlbinlog --no-defaults --start-datetime='2016-01-04 15:11:00' --stop-datetime='2016-01-04 15:11:00' mysql-bin.000001 | mysql -uroot -p123
或者执行我们删除之前的代码:
mysqlbinlog --no-defaults --start-position=249 --stop-position=249 mysql-bin.000001 | mysql -uroot -p123
不常用选项:
- -u --user=name日志恢复到的服务器账号
- -p --password[=name]日志恢复到的服务器密码
- -h --host=name日志恢复到的服务器IP,本机不用填写
- --read-from-remote-server从某个MySQL服务器上读取binlog日志
2、通过binlog文本文件source还原
上面我们已经通过~/test1.sql导出了日志文件,使用mysqlbinlog将binlog日志导出成文本文件,使用source执行该文件:
source ~/test1.sql;
常见错误解决办法:
1、binlog恢复数据会出现重复创建数据么?
答案是不会,在恢复过程中如果出现重复创建数据记录,将会出现Duplicate entry '2' for key 'PRIMARY'这样的错误并且结束程序执行。
2、如何在报错的情况下继续执行数据
有时候我们不记得开始和结束时间,希望直接执行而不是遇到错误停止:
- --force-read, -f
#使用此选项,如果mysqlbinlog读取它无法识别的二进制日志事件,它将输出警告,忽略该事件,然后继续。如果没有此选项,mysqlbinlog会在读取此类事件时停止。
mysqlbinlog --no-defaults --start-datetime='2018-12-26 14:31:00' --stop-datetime='2018-12-26 14:38:00' mysql-bin.000001 | mysql -uroot -p123 -f