背景
某个库的某张表的数据呗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大神,谢谢大家提出好的建议。