某天,我正在快樂的敲著代碼
突然旁邊的馬大哈同事一聲慘叫,好事的我,連忙把頭伸過去問問怎么了,馬大哈說,他不小心在表上點了清空表
這個時候,要鎮靜,假裝不慌,,,
但是沒有兩分鐘,對面的同事說,怎么訪問不了了……
好吧,這里直接說方案
由于navicat的清空表,實際上就是執行的是delete,更狠的截斷表先不說,那個更難恢復
首先查看一下MySQL自帶的bin日志
登陸你的mysql執行下面這個命令
先看看最新的日志文件名字
show master status;
在看看日志位置
show variables like 'log_bin_basename%';
如果你也是centos系統安裝的,而且默認,那么直接cd到這個路徑即可
然后嘗試回憶一下你刪除的時間
mysqlbinlog 命令的參數說明
- -base64-output=decode-rows //數據轉換正常的字符,如果不設置這個參數將顯示base64的數據
- -database=DBName //數據庫名(一個mysql數據庫比較多,指定方便恢復)
- -start-datetime="2019-11-26 18:00:00" //恢復起始時間
- -stop-datetime="2019-11-26 18:10:00" //恢復結束時間
cd /var/lib/mysql/
mysqlbinlog -d=要恢復的數據庫名字 --no-defaults --start-datetime='2020-03-16 12:56:00' --stop-datetime='2020-03-16 14:57:00' -vv mysql-bin.000001 > result.txt
打開這個result.txt你應該可以看到刪除的記錄
現在使用sed過濾一下目標庫表
cat result.txt | sed -n '/### DELETE FROM `數據庫`.`表名`/,/COMMIT/p' > delete.txt
然后你得到的delete.txt應該是這樣
如果是,那么請繼續
將delete.txt替換成insert語句即可
cat delete.txt | sed -n '/###/p' | sed 's/### //g;s//*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@6.*),/1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-9][0-9]=//g' | sed '0~5s/,/;/' > insert.sql
如果執行成功應該是這樣
到這里基本結束了
登陸mysql導入這個腳本
. insert.sql
數據又都回來了
nice