首頁 > 軟體

MySQL資料庫誤刪回滾的解決

2022-06-30 18:05:52

某次一不小心,用了delete from xxx 刪除了幾條重要資料,在網上找了很多方法,但都比較零散,打算記錄本次資料找回的過程。
大致分為以下幾步

1、檢視binlog是否開啟

# log_bin是ON,就說明開啟了 OFF就是關閉狀態,以下操作,只有為 ON 時有效。
show variables like 'log_bin';

2、找到binlog檔名

show master logs;

執行以上程式碼,如下圖 TS1-bin.000009 就是我們要找的檔名

3、檢視binlog紀錄檔位置

show variables like '%datadir%';

4、根據上面得到的位置,去找到 TS1-bin.000009 檔案

5、進入到mysql安裝目錄的bin目錄下,執行以下命令根據誤刪除的時間範圍從TS1-bin.000009檔案匯出成sql檔案

mysqlbinlog --base64-output=decode-rows -v --database=資料庫名 --start-datetime="2022-06-29 15:35:00" --stop-datetime="2022-06-29 15:45:00" C:/Users/Administrator/Desktop/TS1-bin.000009 > C:/Users/Administrator/Desktop/mysqllog.sql

這裡我把 TS1-bin.000009 檔案拷貝到了桌面,因為該檔案原始存放路徑有空格,導致命令執行失敗,無法找到路徑。
得到 mysqllog.sql 檔案後,可以用記事本開啟,搜尋 DELETE 關鍵字,找到刪除資料的記錄

6、將 DELETE 語句改造成 INSERT 語句,在windows下用vbs來實現,把下面程式碼複製儲存為:deleteToinsert.vbs 檔案(一定要是.vbs格式檔案) 與mysqllog.sql在同一目錄下,然後雙擊執行,會生成mysqllogOK.sql檔案就是我們要的INSERT語句

'========================== 
'用VBS實現 MYSQL binglog DELETE轉INSERT 
'========================== 
function replaceregex(patern,str,tagstr) 
    dim regex,matches 
    set regex=new regExp 
    regex.pattern=patern 
    regex.IgnoreCase=true 
    regex.global=true 
    matches=regex.replace(str,tagstr) 
    replaceregex=matches 
end function
 
'======Mysql binlog DELETE轉INSERT================
'VBS開啟文字檔案
Set oldStream = CreateObject("ADODB.Stream")
oldStream.CharSet = "utf-8"
oldStream.Open
oldStream.LoadFromFile("mysqllog.sql") 'binLog生成的DELETE原紀錄檔檔案
oldText = oldStream.ReadText()
    newText=replace(oldText,"### DELETE FROM", ";INSERT INTO")
    newText=replace(newText,"### WHERE", "SELECT")
    newText=replace(newText,"###", "")
    newText=replace(newText,"@1=", "")
    newText=replaceregex("@[1-9]=",newText, ",")
    newText=replaceregex("@[1-9][0-9]=",newText, ",")
oldStream.Close
'VBS儲存檔案
Set newStream = CreateObject("ADODB.Stream")
newStream.Type = 2 'Specify stream type - we want To save text/string data.
newStream.Charset = "utf-8" 'Specify charset For the source text data.
newStream.Open 'Open the stream And write binary data To the object
newStream.WriteText newText
newStream.SaveToFile "mysqllogOK.sql", 2 'DELETE轉成INSERT以後的新的SQL檔名
newStream.Close

7、拿到對應的 INSERT 語句後執行。

參考文章

https://blog.csdn.net/qq_36602951/article/details/120729047
https://juejin.cn/post/7028955574242902023

到此這篇關於MySQL資料庫誤刪回滾的解決的文章就介紹到這了,更多相關MySQL資料庫誤刪回滾內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com