入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

读取binlog的delete记录

创建时间:2016-12-20 投稿人: 浏览次数:1238
如果不小心删除了一批记录,并提交了,在oracle中可以使用闪回查询,闪回版本查询获取丢失的数据,在mysql中没有很好的办法,不过有一种方式是读取二进制文件
前提条件:
1,开启二进制
   查看并开启show variables like "%log_bin%";
   如果没有开启,设置加入参数log-bin=mysql-binlog
2,日志格式为ROW
   binlog_format=ROW

1,获取二进制日志内容

  mysqlbinlog --start-datetime="2016-12-20 09:27:54" --stop-datetime="2016-12-20 09:30:40" -vv mysql-binlog.000001 >/root/1.log       --  制定库名的,-d  db1

注意:

 尽量不要查看正在写入的日志文件;这里是行格式,加了-vv

 部分内容:
SET @@session.time_zone="SYSTEM"/*!*/;
SIlYWBMKAAAANQAAAHIGAAAAAG4AAAAAAAEABXRlc3QxAAR0ZXN0AAMDDxIDHgAAB0gAHxo=
SIlYWCAKAAAANAAAAKYGAAAAAG4AAAAAAAEAAgAD//gCAAAABue+juWbvZmbKJcV+bhyjQ==
"/*!*/;
### DELETE FROM `test1`.`test`
### WHERE
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
###   @2="美国" /* VARSTRING(30) meta=30 nullable=1 is_null=0 */
###   @3="2016-12-20 09:28:21" /* DATETIME(0) meta=0 nullable=1 is_null=0 */
# at 1702
#161220  9:28:40 server id 10  end_log_pos 1733 CRC32 0x1f21e110        Xid = 30
COMMIT/*!*/;

2,使用python分析,脚本如下,摘录网上

#!/bin/env python
# -*- encoding: utf-8 -*-
def read_binlog(file,column_num):
    f=open(file)
    num = "@"+str(column_num)
    while True:
        lines = f.readline()
        if lines.strip()[0:3] == "###":
            lines=lines.split(" ",3)
            if lines[1] == "DELETE" and lines[2] =="FROM":           #该部分替换Delete为Insert
                lines[1] = "INSERT"
                lines[2] = "INTO"
                lines[-1] = lines[-1].strip()
            if lines[1].strip() == "WHERE":
                lines[1] = "VALUES ("
            if  "".join(lines).find("@") <> -1 and lines[3].split("=",1)[0] <> num:          #num为列数,要是小于最大的列数
                print "".join(lines[3])
                lines[3] = lines[3].split("=",1)[-1].strip()
                #print "test2---".join(lines[3])
                if lines[3].strip(""").strip().find(""") <> -1:
                    lines[3] = lines[3].split("/*")[0].strip(""").strip().strip(""").replace("\","").replace(""","\"")  #这里过滤掉转义的字符串
                    lines[3] = """ + lines[3] + "","
                elif lines[3].find("INT meta") <> -1:                #过滤Int类型的字段为负数后带的(),正数不受影响
                    lines[3] = lines[3].split("/*")[0].strip()
                    lines[3] = lines[3].split()[0] + ","
                elif lines[3].find("NULL") <> -1:
                    lines[3] = lines[3].split("/*")[0].strip()
                    lines[3] = lines[3] + ","
                else:
                    lines[3] = lines[3].split("/*")[0].strip(""").strip().strip(""").replace("\","").replace(""","\"")  #这里过滤掉转义的字符串
                    lines[3] = """ + lines[3].strip("""" ") + "","
            if  "".join(lines).find("@") <> -1 and lines[3].split("=",1)[0] == num:          #num为列数,要是小于最大的列数);
                lines[3] = lines[3].split("=",1)[-1].strip()
                if lines[3].find(""") <> -1:
                    lines[3] = lines[3].split("/*")[0].strip(""").strip().strip(""").replace("\","").replace(""","\"")  #同上
                    lines[3] = """ + lines[3] + "");"
                elif lines[3].find("INT meta") <> -1:                #同上
                    lines[3] = lines[3].split("/*")[0].strip()
                    lines[3] = lines[3].split(" ")[0] + ");"
                elif lines[3].find("NULL") <> -1:
                    lines[3] = lines[3].split("/*")[0].strip()
                    lines[3] = lines[3] + ");"
                else:
                    lines[3] = lines[3].split("/*")[0].strip(""").strip().strip(""").replace("\","").replace(""","\"")  #同上
                    lines[3] = """ + lines[3].strip("""" ") + "");"
            print " ".join(lines[1:])
        if lines == "":
            break
if __name__ == "__main__":
    import sys
    read_binlog(sys.argv[1],sys.argv[2])

调用python my.py 1.txt 3 > 1.sql
内容为:
INSERT INTO `test1`.`test`
VALUES (
  2,
  "美国",
  "2016-12-20 09:28:21");
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。