国产探花免费观看_亚洲丰满少妇自慰呻吟_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])
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肥东县| 平定县| 灵石县| 改则县| 恩施市| 靖西县| 永济市| 吕梁市| 辽宁省| 玛纳斯县| 静乐县| 女性| 平湖市| 靖西县| 思南县| 宜君县| 金平| 灵寿县| 寻甸| 元氏县| 丹凤县| 股票| 女性| 平南县| 兴安县| 仙居县| 沧源| 泽州县| 亳州市| 涞源县| 峡江县| 沙河市| 额济纳旗| 老河口市| 综艺| 西乌珠穆沁旗| 青阳县| 集贤县| 交口县| 中超| 栖霞市|