[Mysql]binlog做数据恢复

212 阅读2分钟

最好还是定时使用mysqldump 进行数据备份:

mysqldump -uroot -proot -lF --log-error=/root/myDump.err -B dev> /root/BAK.dev.sql

恢复备份:

mysql -uroot -proot -v < /root/BAK.dev.sql

此外,我们可以通过我们之前介绍过的binlog来进行排查和更细致的恢复,前提是开启了binlog日志记录

首先,发现问题之后使用

flush logs
来启用新的日志记录,也就是保证之前的问题日志不会插入新数据

flush logs;

可以查看一下现在用的是几号日志

show master status;

编号 -1就是之前的问题日志(不一定是最近的一个出问题,也需要往前排查)

用之前介绍的方法查看日志

mysql> show binlog events in 'mysql-bin.000023';


看到问题出在哪一条pos点之后,我们可以用恢复句式来恢复数据:

mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

常用选项:
--start-position=xxx 起始pos点
--stop-position=xxx 结束pos点
--start-datetime="xxxx-11-29 13:18:54" 起始时间点
--stop-datetime="xxxx-11-29 13:21:53" 结束时间点
--database=hap_dev 指定只恢复hap_dev数据库(一台主机上往往有多个数据库,只限本地log日志)

不常用选项:
-u --user=name Connect to the remote server as username.连接到远程主机的用户名
-p --password[=name] Password to connect to remote server.连接到远程主机的密码
-h --host=name Get the binlog from server.从远程主机上获取binlog日志
--read-from-remote-server Read binary logs from a MySQL server.从某个MySQL服务器上读取binlog日志

小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;



可以看到我们之前操作了一条insert语句,但是后来手动从数据库中删除了(模拟故障),并且不被包含在之前的备份中,这里可以用binlog来重新跑一下这条SQL

mysqlbinlog.exe --stop-position=657 --database=hap_dev ../data/DESKTOP-SSQBJ6V-bin.000003 | mysql -uroot -proot



可以看到数据已经重新被插入了

总结,binlog只能用来按 记录的SQL语句来恢复数据,做些小修小补,最主要的还是要靠备份。