日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
MySQL遭遇DELETE誤操作的回滾

方法:

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比憑祥網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式憑祥網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋憑祥地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。

條件:開啟Binlog,F(xiàn)ormat為Row。

步驟:

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

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

2.數(shù)據(jù)取出來之后,需要把數(shù)據(jù)解析反轉(zhuǎn),原始數(shù)據(jù):

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

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

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

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

3、轉(zhuǎn)義字符集。如:'s,\,等。

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

 
 
 
  1. #!/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. #-------------------------------------------------------------------------------
  4. # Name:        restore.py
  5. # Purpose:     通過Binlog恢復(fù)Delete誤操作數(shù)據(jù)
  6. # Author:      zhoujy
  7. # Created:     2012-12-25
  8. # update:      2012-12-25
  9. # Copyright:   (c) Mablevi 2012
  10. # Licence:     zjy
  11. #-------------------------------------------------------------------------------
  12. def read_binlog(file,column_num):
  13.     f=open(file)
  14.     num = '@'+str(column_num)
  15.     while True:
  16.         lines = f.readline()
  17.         if lines.strip()[0:3] == '###':
  18.             lines=lines.split(' ',3)
  19.             if lines[1] == 'DELETE' and lines[2] =='FROM':           #該部分替換Delete為Insert
  20.                 lines[1] = "INSERT"
  21.                 lines[2] = 'INTO'
  22.                 lines[-1] = lines[-1].strip()
  23.             if lines[1].strip() == 'WHERE':
  24.                 lines[1] = 'VALUES ('
  25.             if  ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] <> num:          #num為列數(shù),要是小于***的列數(shù),后面均加,
  26.                 lines[3] = lines[3].split('=',1)[-1].strip()
  27.                 if lines[3].strip('\'').strip().find('\'') <> -1:
  28.                     lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #這里過濾掉轉(zhuǎn)義的字符串
  29.                     lines[3] = '\'' + lines[3] + '\','
  30.                 elif lines[3].find('INT meta') <> -1:                #過濾Int類型的字段為負(fù)數(shù)后帶的(),正數(shù)不受影響
  31.                     lines[3] = lines[3].split('/*')[0].strip()
  32.                     lines[3] = lines[3].split()[0] + ','
  33.                 elif lines[3].find('NULL') <> -1:
  34.                     lines[3] = lines[3].split('/*')[0].strip()
  35.                     lines[3] = lines[3] + ','
  36.                 else:
  37.                     lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #這里過濾掉轉(zhuǎn)義的字符串
  38.                     lines[3] = '\'' + lines[3].strip('\''' ') + '\','
  39.             if  ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] == num:          #num為列數(shù),要是小于***的列數(shù),后面均加);
  40.                 lines[3] = lines[3].split('=',1)[-1].strip()
  41.                 if lines[3].find('\'') <> -1: 
  42.                     lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #同上
  43.                     lines[3] = '\'' + lines[3] + '\');'
  44.                 elif lines[3].find('INT meta') <> -1:                #同上
  45.                     lines[3] = lines[3].split('/*')[0].strip()
  46.                     lines[3] = lines[3].split(' ')[0] + ');'
  47.                 elif lines[3].find('NULL') <> -1:
  48.                     lines[3] = lines[3].split('/*')[0].strip()
  49.                     lines[3] = lines[3] + ');'
  50.                 else:
  51.                     lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #同上
  52.                     lines[3] = '\'' + lines[3].strip('\''' ') + '\');'
  53.             print ' '.join(lines[1:])
  54.         if lines == '':
  55.             break
  56. if __name__ == '__main__':
  57.     import sys
  58.     read_binlog(sys.argv[1],sys.argv[2])

執(zhí)行腳本:

python restore.py binlog.txt 36 > binlog.sql

命令行中的36 表示 需要還原的表的字段有36個,效果:

 
 
 
  1. INSERT INTO test.me_info
  2. VALUES (
  3.   2123269,
  4.   '1990:11:12',
  5.   NULL,
  6.   2,
  7.   '',
  8.   0,
  9.   '',
  10.   -1,
  11.   0,
  12.   340800,
  13.   1,
  14.   0,
  15.   '',
  16. ……
  17. ……
  18.   1,
  19.   NULL
  20. );

***還原:

mysql test < binlog.sql

總結(jié):

下次整理Row和STATEMENT的優(yōu)劣。


網(wǎng)站標(biāo)題:MySQL遭遇DELETE誤操作的回滾
URL鏈接:http://www.dlmjj.cn/article/cdojsde.html