数据库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恢复点或时间范围很重要。最后有有惊无险。