环境信息:
mysql Ver 14.14 Distrib 5.6.35, for Linux (x86_64) using EditLine wrapper
CentOS release 6.5 (Final)
binlog_format: row
tx_isolation: read-commit
步骤大体如下:
(1) 拷贝备份文件到服务器;
(2) 全量+增量恢复;
(3) 在binlog日志中找到误操作数据的位置点,并从恢复点解析binlog日志到恢复点,由于解析binlog日志时,只支持细化到库级。
解析数据库日志:
mysqlbinlog -vv -d wifilock --start-position=236288775 mysql-bin.003874 > db_reback.sql
-d: 数据库名
--start_position: 起始位置
如果是多个日志,日志与日志之间,使用空格分开。
缺点:恢复的时间取决于你的数据量大小,如果数据量太大 ,那么时间会很长。
适用范围:所有误操作
遇到的问题:在恢复时不识别解析后的binlog日志。
mysql -u root -p -S /tmp/mysql.sock155 < /home/mysql/db_reback.sql
恢复时
日志如内容如下:
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180207 5:04:03 server id 22 end_log_pos 120 CRC32 0xe67119af Start: binlog v 4, server v 5.6.35-log created 180207 5:04:03 #记录了日志版本信息
BINLOG '
Qxh6Wg8WAAAAdAAAAHgAAAAAAAQANS42LjM1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAa8Z
ceY=
'/*!*/;
如果把日志中的前11行,就是与日志版本相关的信息删除后,重新进行恢复,还是依然会出现如下问题
ERROR 1609 (HY000) at line 374883: The BINLOG statement of type `Table_map` was not preceded by a format description BINLOG statement
此问题是日志格式的问题。参考如下处理方式处理。但是每一处有'BINLOG'标志的地方都需要处理。每一条insert或者delete的地方就有一个BINLOG标志。
https://www.percona.com/blog/2017/02/16/mysql-bug-72804-workaround-binlog-statement-can-no-longer-be-used-to-apply-query-events/
这个解决问题的方法,非常不靠谱,据官方资料,BINLOG日志格式的问题,在mysql5.6版本中已经解决了。不知为何还会遇到。
目前日志解析格式后的问题,一直没有解决。