mysql5.7通过binglog日志恢复某个库的表的数据

背景

某个库的某张表的数据呗delete 或者update了,需要将数据还原
思路:
1、先要找到对应的binglog日志文件
2、将恢复的表的操作给找到,以delete为例

大概操作步骤

1、找到binglog日志

mysqlbinlog -d  数据库名 --base64-output=decode-rows -v  mysql-bin.000110 > /tmp/teach.sql

2、teach.sql内容部分,截图的部分

# at 1044175060
#190416 18:20:54 server id 1  end_log_pos 1044175152 CRC32 0x6a3f90b0   Delete_rows: table id 118751 flags: STMT_END_F
### DELETE FROM `test`.`test1`
### WHERE
###   @1=1
###   @2='测试'
###   @3=NULL
###   @4=5
###   @5=5
###   @6=5
###   @7=10
###   @8='2018-03-29 15:39:39'
###   @9='2018-03-29 15:39:39'
# at 1044175152
#190416 18:20:54 server id 1  end_log_pos 1044175239 CRC32 0x0591171b   Table_map: `fz_ssp_teaching`.`knowledge_template` mapped to number 118751
# at 1044175239
#190416 18:20:54 server id 1  end_log_pos 1044175331 CRC32 0x7ed39090   Delete_rows: table id 118751 flags: STMT_END_F
### DELETE FROM `test`.`test1`
### WHERE
###   @1=7
###   @2='测试2'
###   @3=NULL
###   @4=7
###   @5=7
###   @6=7
###   @7=7
###   @8='2018-03-29 15:46:03'
###   @9='2018-03-29 15:46:03'
# at 1044175331
#190416 18:20:54 server id 1  end_log_pos 1044175418 CRC32 0xeb6c8425   Table_map: `fz_ssp_teaching`.`knowledge_template` mapped to number 118751
# at 1044175418

以上数据为自己伪造的

3、通过python 脚本将上面的文件处理一下,将需要的数据给拿出来,并生成sql脚本
比如

### DELETE FROM `test`.`test1`
### WHERE
###   @1=7
###   @2='测试2'
###   @3=NULL
###   @4=7
###   @5=7
###   @6=7
###   @7=7
###   @8='2018-03-29 15:46:03'
###   @9='2018-03-29 15:46:03'

生成INSERT INTO test.test1 VALUES (7,‘测试2’,NULL,7,7,7,7,‘2018-03-29 15:46:03’,‘2018-03-29 15:46:03’)

这就是大概思路

4、一下是脚本内容,非常简单的一个脚本,大家根据自己的需求去弄,最重要的是思路

#!/bin/python
#coding: utf-8
import time
import linecache

def sql_func(sql_list):
    str = ""
    for i in sql_list:
         str += i + ','
    sql = 'INSERT INTO`test`.`test1` VALUES (%s);' % str.strip(',')
    return sql

def get_context(line):
    return  linecache.getline('/tmp/teach.sql',line)

str_list = []
with open("/tmp/teach.sql", 'r') as f:
   sql_list = []
   for index, n in enumerate(f):
       if 'DELETE FROM `test`.`test1`' in n:
           s_list = []
           line = index+1
           i = line
           while True:
               i += 1
               content = get_context(i+1)
               s_list.append(content.strip().split("=")[-1])
               if i < line+9:
                   continue
               else:
                   sql_list.append(s_list)
                   break
f.close()
for i in sql_list:
    sql = sql_func(i)
    print (sql)
    

5、我不是专业的dba,用了不专业的方式,膜拜DBA大神,谢谢大家提出好的建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值