数据库binlog数据恢复

是否开启binlog(on已开启)

show variables like ‘log_bin‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

开启 (8.0+版本后没有了my.ini,可能时我安装用的zip解压版本【一般会默认开启】)
windows下有的话可能在C:\ProgramData\mysql下的my.ini,没有可以找一个

# Binary Logging
log-bin=binlog(也可指定路径)binlog-format=ROW

linux下找到my.cnf 一般在 /etc/my.cof..

server-id=1
log-bin=/var/lib/mysql/binlog
重启再查询,即开启binlog日志查询
show master logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000009 |       178 | No        |
| binlog.000010 |       178 | No        |
| binlog.000011 |       178 | No        |
| binlog.000012 |      1618 | No        |
| binlog.000013 |       178 | No        |
| binlog.000014 |       178 | No        |
| binlog.000015 |       178 | No        |
| binlog.000016 |       178 | No        |
| binlog.000017 |       178 | No        |
| binlog.000018 |      2583 | No        |
| binlog.000032 |  66276708 | No        |
+---------------+-----------+-----------+
show binlog events;
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| Log_name      | Pos | Event_type     | Server_id | End_log_pos | Info                              |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| binlog.000009 |   4 | Format_desc    |         1 |         124 | Server ver: 8.0.16, Binlog ver: 4 |
| binlog.000009 | 124 | Previous_gtids |         1 |         155 |                                   |
| binlog.000009 | 155 | Stop           |         1 |         178 |                                   |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
show binary logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000009 |       178 | No        |
| binlog.000010 |       178 | No        |
| binlog.000011 |       178 | No        |
| binlog.000012 |      1618 | No        |
| binlog.000013 |       178 | No        |
| binlog.000014 |       178 | No        |
| binlog.000015 |       178 | No        |
| binlog.000016 |       178 | No        |
| binlog.000017 |       178 | No        |
| binlog.000018 |      2583 | No        |
| binlog.000032 |  66276708 | No        |
+---------------+-----------+-----------+show binlog events in ‘binlog.000016‘;//查询指定binlog

(这里面mysqlbinlog命令,如果没有配置全局变量,需要在mysql的bin目录下执行。其它binlog相关命令要登录mysql后输入)

解析成可读sql(根据sql,寻找到位置点)

mysqlbinlog --base64-output=DECODE-ROWS -v binlog.000067 > d:/1.sql
mysqlbinlog --start-datetime="2019-11-06 17:18:20" --stop-datetime="2019-11-06 17:21:21" binlog.000067 > D://test121.sql
show master status;/*主log状态*/
show VARIABLES like ‘BINLOG_format‘;/*binlog格式*/
SHOW BINLOG EVENTS in ‘binlog.000067‘;/*查询binlog详情*/
show BINARY logs;/*查所以binlog文件*/
show master logs;/*同上*/
/*非mysql下面执行*/
mysqlbinlog --start-position=313 --stop-position=436 binlog.000067 > D:\\test.sql;/*mysql data目录下,导出指定文件*/
show binlog events in ‘binlog.000067‘ from 313 limit 2,10\G;
mysqlbinlog binlog.000067 > D:\\test.sql;

数据恢复

mysqlbinlog --no-defaults --database=geeRunner --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlogs.000080 > sanjiaomao.txt
mysqlbinlog --no-defaults --database=geeRunner --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlogs.000080 | more
只查看update操作
mysqlbinlog --no-defaults --database=raceEnroll  binlogs.000078 |grep update |more
1、恢复从 2015-12-15 11:20 到 2015-12-15 17:20被删除的数据
mysqlbinlog -d test --start-date="2015-12-15 11:20" --stop-date="2015-12-15 17:20"  binlog.000004  |mysql -uroot -p
2、恢复10000到20000位置点之间的操作
mysqlbinlog -d test --start-position="10000" --stop-position="20000"  binlog.000004  |mysql -uroot -p
3.也可以用之前解析的*.sql文件
进入mysql,登录之后执行
source  /data/*.sql
实战说明:
1、 binlog日志是有有效期的,过期的数据无法恢复
2、如果表结构被修改了,要想恢复表结构修改之前的被删除的数据,必须先将表结构恢复,否则无法恢复
3、binlog日志一般都有多个,有时要恢复的数据分布在多个日志文件里面

 一次binlog恢复数据记录

windows恢复测试
1.文件解析为可读(把服务器的binlog拉到windows下)
mysqlbinlog --base64-output=DECODE-ROWS -v binlog.000067 > d:/1.sql
2.尝试解析linux上的binlog为可读
解析成功有些意外。。
3.通过最新binlog找到
恢复位置# at 36643740
之后是 重新建表的log信息
4.尝试用binlog恢复数据到localhost中
mysqlbinlog --stop-position=36643740 binlog.000067 > d:/1.sql
根据位置导出binlog恢复信息
5.用1.sql恢复数据
可以恢复。。但结果依旧是库没了
说明我的恢复点包含了删库操作
修改节点到at 36643625
6.部分增量恢复成功了
在mysql登录下use备份的数据库
eg: use db;
source 1.sql;
数据即可恢复至日志时间内包含数据信息 完成

tip:上面的binlog.000067也可以是全路径
mysqlbinlog --stop-position 36643625 C:\Users\admin\Desktop\binlog.000031 > C:\Users\admin\Desktop\1.sql

注意:linux下的操作同理,在恢复之前一定要先用备份还原结构以及部分数据
例如到11.11号的备份,这时使用binlog的文件日期要至少为从11.11号至今的所有binlog文件之和,
可能时多个sql文件,才保证完整恢复。还有,如果数据备份跟binlog数据有重复insert操作,数据会重复的,所以
选取binlog恢复点或时间范围很重要。最后有有惊无险。