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’才不报错(要加引号) 找到建库语句
终点:
找到删库的上一个。
219-------805
(第二步):截取日志
在命令行(不是在数据库)执行
mysqlbinlog --start-positinotallow=起点 --stop-positinotallow=终点 日志文件 > xxx.sql ---------(退出数据库在执行的)
【注意】 日志文件 那里 是日志文件所在的路径 例如:
【扩展】
日志截取的方式:
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号的时间来获取。