最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實(shí)現(xiàn)MySQL回滾的Python腳本的編寫(xiě)教程

 更新時(shí)間:2015年11月25日 12:17:01   投稿:goldensun  
這篇文章主要介紹了實(shí)現(xiàn)MySQL回滾的Python腳本的編寫(xiě)教程,文中的回滾針對(duì)的是DELETE語(yǔ)句的數(shù)據(jù)庫(kù)誤操作,需要的朋友可以參考下

操作數(shù)據(jù)庫(kù)時(shí)候難免會(huì)因?yàn)椤按笠狻倍`操作,需要快速恢復(fù)的話通過(guò)備份來(lái)恢復(fù)是不太可能的,因?yàn)樾枰€原和binlog差來(lái)恢復(fù),等不了,很費(fèi)時(shí)。這里先說(shuō)明下因?yàn)镈elete 操作的恢復(fù)方法:主要還是通過(guò)binlog來(lái)進(jìn)行恢復(fù),前提是binlog_format必須是Row格式,否則只能通過(guò)備份來(lái)恢復(fù)數(shù)據(jù)了。
方法:

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

步驟:

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

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.數(shù)據(jù)取出來(lái)之后,需要把數(shù)據(jù)解析反轉(zhuǎn),原始數(shù)據(jù):

### 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的操作轉(zhuǎn)換成Insert操作,發(fā)上面的都是有一定規(guī)律的,并且需要注意的是:

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

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

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

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

#!/bin/env python 
# -*- encoding: utf-8 -*- 
#------------------------------------------------------------------------------- 
# Name:    restore.py 
# Purpose:   通過(guò)Binlog恢復(fù)Delete誤操作數(shù)據(jù) 
# 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為列數(shù),要是小于最大的列數(shù),后面均加, 
        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('\'','\\\'') #這里過(guò)濾掉轉(zhuǎn)義的字符串 
          lines[3] = '\'' + lines[3] + '\',' 
        elif lines[3].find('INT meta') <> -1:        #過(guò)濾Int類(lèi)型的字段為負(fù)數(shù)后帶的(),正數(shù)不受影響 
          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('\'','\\\'') #這里過(guò)濾掉轉(zhuǎn)義的字符串 
          lines[3] = '\'' + lines[3].strip('\''' ') + '\',' 
      if ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] == num:     #num為列數(shù),要是小于最大的列數(shù),后面均加); 
        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]) 

執(zhí)行腳本:
python restore.py binlog.txt 36 > binlog.sql

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

INSERT INTO test.me_info 
VALUES ( 
 2123269, 
 '1990:11:12', 
 NULL, 
 2, 
 '', 
 0, 
 '', 
 -1, 
 0, 
 340800, 
 1, 
 0, 
 '', 
…… 
…… 
 1, 
 NULL 
); 

最后還原:

mysql test < binlog.sql

相關(guān)文章

  • 關(guān)于mysql create routine 權(quán)限的一些說(shuō)明

    關(guān)于mysql create routine 權(quán)限的一些說(shuō)明

    下面小編就為大家?guī)?lái)一篇關(guān)于mysql create routine 權(quán)限的一些說(shuō)明。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 分享MySQL的自動(dòng)化安裝部署的方法

    分享MySQL的自動(dòng)化安裝部署的方法

    線上的MySQL一般都采用源碼編譯,雖然MySQL的源碼編譯挺簡(jiǎn)單的,但是試想一下,如果你有幾百臺(tái)服務(wù)器同時(shí)要安裝MySQL,難道你還一臺(tái)臺(tái)去手動(dòng)編譯、編寫(xiě)配置文件嗎?這顯然太低效了,本文討論MySQL的自動(dòng)化安裝部署。
    2014-07-07
  • mysql+Spring數(shù)據(jù)庫(kù)隔離級(jí)別與性能分析

    mysql+Spring數(shù)據(jù)庫(kù)隔離級(jí)別與性能分析

    數(shù)據(jù)庫(kù)隔離級(jí)別與Spring配置事務(wù)的聯(lián)系及性能影響,以下是個(gè)人理解,如果有瑕疵請(qǐng)及時(shí)指正
    2014-05-05
  • MySQL多實(shí)例配置方案

    MySQL多實(shí)例配置方案

    MySQL多實(shí)例就是,在一臺(tái)機(jī)器上開(kāi)啟多個(gè)不同的服務(wù)端口(如:3306,3307,3308...),運(yùn)行多個(gè)MySQL服務(wù)進(jìn)程,這些服務(wù)進(jìn)程通過(guò)不同的socket監(jiān)聽(tīng)不同的端口提供服務(wù)。
    2018-04-04
  • mysql啟動(dòng)報(bào)錯(cuò)Failed?to?start?LSB:start?and?stop?MySQL的問(wèn)題解決

    mysql啟動(dòng)報(bào)錯(cuò)Failed?to?start?LSB:start?and?stop?MySQL的問(wèn)題解決

    本文主要介紹了mysql啟動(dòng)報(bào)錯(cuò)Failed?to?start?LSB:start?and?stop?MySQL的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • MySQL 全文索引使用指南

    MySQL 全文索引使用指南

    在 MySQL 中,我們經(jīng)常使用 WHERE 條件用于進(jìn)行值的相等比較、范圍過(guò)濾。然而,我們也會(huì)使用關(guān)鍵字進(jìn)行搜索,這個(gè)基于搜索值與其他值的相關(guān)性來(lái)進(jìn)行過(guò)濾。MySQL全文檢索即用于這種場(chǎng)景。本篇將介紹如何使用全文檢索。
    2021-05-05
  • 教你如何使用MySQL8遞歸的方法

    教你如何使用MySQL8遞歸的方法

    這篇文章主要介紹了教你如何使用MySQL8遞歸的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Windows10下MySQL5.7.19安裝教程 MySQL忘記root密碼修改方法

    Windows10下MySQL5.7.19安裝教程 MySQL忘記root密碼修改方法

    這篇文章主要為大家詳細(xì)介紹了Windows10下MySQL5.7.19安裝教程,以及MySQL忘記root密碼的修改方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • mysql查詢(xún)表是否被鎖的方法

    mysql查詢(xún)表是否被鎖的方法

    在本篇文章里小編給大家分享的是關(guān)于mysql查詢(xún)表是否被鎖的方法,有需要的朋友們可以參考下。
    2020-10-10
  • mysql字符集亂碼問(wèn)題解決方法介紹

    mysql字符集亂碼問(wèn)題解決方法介紹

    解決亂碼的方法是,在執(zhí)行SQL語(yǔ)句之前,將MySQL以下三個(gè)系統(tǒng)參數(shù)設(shè)置為與服務(wù)器字符集character-set-server相同的字符集
    2012-05-05

最新評(píng)論

福海县| 石河子市| 稷山县| 达孜县| 南和县| 台江县| 尤溪县| 黄龙县| 安义县| 定西市| 河池市| 田林县| 洱源县| 太谷县| 隆化县| 时尚| 阿合奇县| 清流县| 吉林市| 襄垣县| 新营市| 兰西县| 辽源市| 历史| 蓬溪县| 当雄县| 阳江市| 大余县| 敦化市| 彭阳县| 安塞县| 伊川县| 宝应县| 天全县| 邵武市| 斗六市| 淮北市| 时尚| 伊金霍洛旗| 浮山县| 新建县|