国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

實現MySQL回滾的Python腳本的編寫教程

2024-07-24 12:45:26
字體:
來源:轉載
供稿:網友

操作數據庫時候難免會因為“大意”而誤操作,需要快速恢復的話通過備份來恢復是不太可能的,因為需要還原和binlog差來恢復,等不了,很費時。這里先說明下因為Delete 操作的恢復方法:主要還是通過binlog來進行恢復,前提是binlog_format必須是Row格式,否則只能通過備份來恢復數據了。
方法:

條件:開啟Binlog,Format為Row。

步驟:

1.通過MySQL自帶工具mysqlbinlog 指定導出操作的記錄:

mysqlbinlog --no-defaults --start-datetime='2012-12-25 14:56:00' --stop-datetime='2012-12-25 14:57:00' -vv mysql-bin.000001 > /home/zhoujy/restore/binlog.txt

2.數據取出來之后,需要把數據解析反轉,原始數據:

### DELETE FROM test.me_info ### WHERE ### @1=2165974 /* INT meta=0 nullable=0 is_null=0 */ ### @2='1984:03:17' /* DATE meta=0 nullable=1 is_null=0 */ ### @3=NULL /* DATE meta=765 nullable=1 is_null=1 */ ### @4=2012-10-25 00:00:00 /* DATETIME meta=0 nullable=0 is_null=0 */ ### @5='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */ ### @6=0 /* TINYINT meta=0 nullable=1 is_null=0 */ ### @7='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */ ### @8=-1 (4294967295) /* INT meta=0 nullable=1 is_null=0 */ ### @9=0 /* MEDIUMINT meta=0 nullable=1 is_null=0 */ ### @10=NULL /* MEDIUMINT meta=0 nullable=1 is_null=1 */ ### @11=2 /* TINYINT meta=0 nullable=1 is_null=0 */ ### @12=0 /* TINYINT meta=0 nullable=1 is_null=0 */ ### @13='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */ ### @14='' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */ ### @15=0 /* MEDIUMINT meta=0 nullable=1 is_null=0 */ ### @16=320 /* INT meta=0 nullable=1 is_null=0 */ …………………… …………………… ……………………

Row格式的binlog記錄的格式如上面所示,需要做的工作就是吧Delete的操作轉換成Insert操作,發上面的都是有一定規律的,并且需要注意的是:

1、字段類型 DATETIME 日期。在日志中保存的格式為 @4=2012-10-25 00:00:00,需要將2012-10-25 00:00:00加上引號。

2、負數。在日志中保存的格式為 @1=-1 (4294967295), -2(4294967294),-3(4294967293),需要將()里面的數據去掉,只保留@1=-1。

3、轉義字符集。如:'s,/,等。

上面3點清楚之后,可以寫一個腳本(水平有限,在提升中,寫的不好看):

#!/bin/env python # -*- encoding: utf-8 -*- #------------------------------------------------------------------------------- # Name: restore.py # Purpose: 通過Binlog恢復Delete誤操作數據 # Author: zhoujy # Created: 2012-12-25 # update: 2012-12-25 # Copyright: (c) Mablevi 2012 # Licence: zjy #------------------------------------------------------------------------------- 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為列數,要是小于最大的列數,后面均加, lines[3] = lines[3].split('=',1)[-1].strip() 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])
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德州市| 阳信县| 遵义县| 班戈县| 安塞县| 贺兰县| 宜昌市| 静安区| 涿州市| 福安市| 石屏县| 乌兰县| 克东县| 崇礼县| 云阳县| 西昌市| 宜川县| 桂林市| 平武县| 汪清县| 错那县| 繁峙县| 射洪县| 平凉市| 大丰市| 成都市| 万宁市| 丹巴县| 通道| 舒城县| 广安市| 贞丰县| 黄山市| 宁波市| 维西| 广州市| 葫芦岛市| 锦屏县| 锦屏县| 驻马店市| 宝丰县|