当前位置: 代码迷 >> 综合 >> 【mysql】记录一次truncate表后利用binlog恢复情况
  详细解决方案

【mysql】记录一次truncate表后利用binlog恢复情况

热度:83   发布时间:2024-02-13 08:48:35.0

今日午休醒来,有点懵,测试环境truncate表时,清错了一张配置表,需要恢复。

但是该机器上没有备份机制,开发环境到是有,但极有可能数据不同步。

然后开始binlog按时间,与表名,确定了binlog的 --stop-position,但是没有用,因为binlog都是配合备份数据弄的,binlog只是导出执行日志,在当前状态下,再执行一遍,因为没有数据,都是update操作 依然还是空数据。

如果配合备份数据,恢复到之前某时刻状态,再用binlog将那个时刻到现在truncate之前操作再执行一遍,就是比较完美的思路。

 

后面多方查找,

好在同事之前做代运营,copy了一份环境,日期比较近,就直接先表数据弄好,再将binlog较长时间的操作导出。

 

binlog给人查看的文件导出命令:

mysqlbinlog --no-defaults --skip-gtids --start-datetime='2020-08-21 13:30:00' --stop-datetime='2020-08-21 15:00:00' --database=sm_xxx --base64-output=decode-rows -v /binlog_file_path/binlog.0000000x |grep -i -A 5 -B 5 truncate > /tmp/binlog0xx_trun.log

--no-defaults 用于解决字符集不识别 或其他小异常问题

--skip-gtids 用于忽略gtids范围选择

--start-datetime --stop-datetime 用于筛选日志时间段,日志导出来后,每行最前面 就是 最前面是长数字 然后 时分秒。

--database 选择库

--base64-ouput=decode-rows  就是我们binlog使用row的方式,用于解密,用于人来看

-v 则是将注释类的语句也显示出来

grep -i表示 忽略大小写 -A 5 则是同时显示命中行的后5行(after)  -B 5同时显示命中行的前5行(before)

 

 

binglog导出  mysql中的用于source执行的文件命令:

mysqlbinlog --no-defaults --skip-gtids --start-datetime='2020-04-21 00:00:00' --stop-position=xxxxxxx --database=sm_xxx /binlog_file_path/binlog.00000xx |grep -i -B 100 tablename >binxx_recover_timestampe_to_now.sql

这里 -B 100 其实是有风险的,可能不包括tablename表操作的也去执行了,一般不加。(我是备份其他表,然后尽量补全目标tablename表),后面在恢复其他表。(其实可能是我多此一举,因为同样影像行数为0)

 

后面有缺失的配置,再慢慢补了,唉,以后头晕脑胀的时刻,千万不要执行高危操作,不然就要删库跑路了。

  相关解决方案