flush logs;刷新一个新的数据文件。(滚动日志)

一:基于 binlog 日志中的 pos 标记

【个人总结】 就是binlog文件中保存了 我的操作语句 例如建库建表添加数据 删库跑路等等,我要恢复数据的时候 就把binlog里我需要的记录导出来 保存为一个sql脚本 然后执行这个脚本 他就会把我之前创建库表的操作 重复一遍(注意;删库的就不要截取了) 自然 执行完 我的数据就回来了;

show master status;

show binlog events in 'mysql-bin.xxxxxx';

[数据库外] mysqlbinlog --start-position xxx --stop-position xxx /xx/yy/msql-bin.xxxx >/xx/xx.sql

set sql_log_bin=0

source /xx/xx.sql;

set sql_log_bin=1;


(第一步):分析binlog

通过binlog日志,找到建库日志点和删库之前的日志点。

起点:

查询目前使用的日志。show matser status; show binlog events in ‘mysql-bin.xxxx’-----------------注意 ‘mysql-bin.xxxx’才不报错(要加引号) 找到建库语句

终点:

找到删库的上一个。

1-9:数据恢复(二进制日志截取恢复)_mysql

219-------805


(第二步):截取日志

在命令行(不是在数据库)执行

mysqlbinlog --start-positinotallow=起点 --stop-positinotallow=终点 日志文件 > xxx.sql ---------(退出数据库在执行的)

【注意】 日志文件 那里 是日志文件所在的路径 例如:

1-9:数据恢复(二进制日志截取恢复)_mysql_02

【扩展】

日志截取的方式:

1;按时间截取日志信息:

参数说明:

--start-datetime='' 截取的起始时间

--stop-datetime='' 截取的结束时间 ,不指定即到当前为止

注意:最多精确到秒,做精确截取会有问题。

mysqlbinlog --start-datetime='2020-11-03 7:20:00' mysql-bin.000002 > /tmp/1.sql

2;按position号码截取日志

参数说明:

--start-position 截取的起始position号

--stop-position 截取的结束position号

mysqlbinlog --start-positinotallow=543 --stop-positinotallow=910 mysql-bin.000002 > /tmp/2.sql

3;通过GTID方式截取(当要截取的日志跨多个日志文件时候 适合)

(第三步):恢复数据 (会产生binlog 所以要先关闭再打开 binlog写入功能)

先关闭binlog写入:set sql_log_bin=0 暂时关闭

执行刚刚截取的日志文件xxx.sql:source xxx.sql

再打开binlog写入:set sql_log_bin=1 再打开

==========================================================================================================================================

可能遇到的复杂情况:


1.binlog记录的数据库较多怎么办?恢复重复怎么办?

【方案】

截取某库

mysqlbinlog -d 数据库名字 --start-positinotallow=起点 --stop-positinotallow=终点 日志文件 > xxx.sql

也就是说 在截取的这一段里 我只恢复 和我指定数据库相关的数据


2.创库时间较长假如运行三年插入数据操作从bin.0001到bin.000300,数据行较多,全部被删恢复怎么办?

假设每周六备份,全备,每天做两次binlog备份。 思路? 结合备份来恢复数据 binlog实际上时我们数据恢复时配合备份一起恢复数据的手段。

【个人理解】

单纯的binlog日志 只适用于恢复少量数据

对于大量的数据恢复 需要 结合 备份来进行


3.有多个binlog文件日志的情况下有截取。

起点:假如在1号文件。 起点4600 终点:在2号文件。 终点980 mysqlbinlog --start-datetime= --stop-datetime= mysql-bin.0001 mysql-bin.0002 写多个文件名,找时间维度,通过position号的时间来获取。

跨多个文件该怎么截取。

解决方案:
(1)对binlog日志文件分段截取追加方式存储。position号在不同的binlog日志文件是独立,而GTID是唯一的。
(2)通过GTID方式对多份日志进行截取和恢复。
(3)按时间截取,但有可能不准确,果断pass掉。

4;如果是数据库中的一张表被误删除。*
解决方案:
(1)利用三剑客等筛选过滤命令从日志中截取。不现实,麻烦还是麻烦,存在风险,万一过滤没过好,漏了什么或者多了什么。pass。
(2)找一个临时的库,恢复上一次的全备。从原库截取上一次全备到删库之前的binlog,恢复到临时库,然后将误删除的表单独导出,再导入到原生产环境。可行,但是慢。
(3)使用第三方工具,例如:binlog2sql等。