我一直在想,地球上這麼多程式設計師,應該有很多人在團隊做專案的時候,出過很大的錯誤,比如說不小心刪了庫,活動福利欄位多寫了個零導致全伺服器玩家領到數倍獎勵,聽了沙雕群友的話執行rm -rf
命令。
記得有一本專門調侃的書,叫《mysql從入門到刪庫跑路》,各種能人異士。
所以掌握如何在資料庫被刪之後進行恢復,是很重要的。
mysql刪除資料有很多種方式,你可以刪除一條資料,可以刪除一張表,也可以刪除一整個庫,還有就是你在rm -rf
刪除磁碟的時候直接把mysql相關的所有檔案都給刪了。
如果你使用delete命令刪除了一行資料,可以使用flashback工具通過閃回來恢復資料。
如果你使用過git,應該知道它有乙個很有用的命令,revert
,回到之前的狀態。
對於資料庫也是類似,我們的每一步操作其實都是記錄在binlog中的,要恢復一條資料,只需要按照binlog中的操作記錄進行回滾。
對於binlog中delete的操作,回滾就會執行與之對應的insert操作。
同理,insert的回滾是delete。
update的回滾,是交換前後set和where的值,這個請思考一下update語句的where和set作用。
原始:updatetest
.user
setid
=3,name
='antz' whereid
=3 andname
='uhl';
回滾:updatetest
.user
setid
=3,name
='uhl' whereid
=3 andname
='antz';
所以說,我們只需要知道我們刪除時執行了哪些delete語句,就可以把這個delete反過來改寫成為insert語句,達到恢復的目的。
為了方便這裡使用binlog2sql工具來幫助我們分析binlog日誌。
git clone
cd binlog2sql
pip install -r requirements.txt
檢視開始時的binlog日誌狀態。
刪除一條資料之後的binlog。
執行指令碼解析binlog。
不過最好還是不要在主庫上這樣做,說不定越來越亂。
最好可以把你要恢復的庫拷貝出乙個備份,在這個庫上臨時進行恢復,確認恢復成功後,在恢復到主庫。
這是因為,乙個在執行線上邏輯的主庫,資料狀態的變更往往是有關聯的,可能發現資料問題的時間晚一點,就導致已經在之前誤操作的基礎上,業務邏輯**就繼續修改了其他資料,如果你直接在主庫恢復了這幾條資料,沒有經過確認的話,可能會導致資料出現更大問題。
你可以把sql_safe_updates引數設定為on,這樣你的delete和update在沒有寫where的情況下就會報錯。
這種情況下想要恢復資料就需要使用全量備份,加增量日誌的方式了。要求線上資料庫有定期的全量備份,並且實時備份binlog。
假如說有乙個人不小心刪掉乙個庫,我們就可以取最近的一次全量備份,恢復出乙個臨時庫,然後在拿出當前的日誌,從日誌中恢復全量備份中沒有的資料。
mysql自帶了乙個binlog檢視的工具,mysqlbinlog,在你mysql安裝目錄下的bin中就可以找到。
使用show master logs
檢視當前的binlog日誌,找到最近的一條,就可以使用mysqlbinlog來檢視了。
這類情況一般來說就只有跑路了,除非你使用了mysql集群,你可以從其他節點中恢復資料。
Mysql如何在刪庫後可以不用跑路
我一直在想,地球上這麼多程式設計師,應該有很多人在團隊做專案的時候,出過很大的錯誤,比如說不小心刪了庫,活動福利欄位多寫了個零導致全伺服器玩家領到數倍獎勵,聽了沙雕群友的話執行rm rf命令。記得有一本專門調侃的書,叫 mysql從入門到刪庫跑路 各種能人異士。所以掌握如何在資料庫被刪之後進行恢復,...
看完這篇,運維刪庫後再也不用跑路了
一 背景 yum y install bzip2 e2fsprogs devel e2fsprogs gcc c make configure make make install 動作 action 有 inode ino,顯示節點 ino 的資訊。block blk,顯示資料塊 blk 的資訊。r...
mysql刪庫後恢復資料流程
本文將介紹當我們使用mysql不小心刪庫之後,或者惡意被刪庫後,如何進行資料恢復 我們進行資料恢復的前提是 我們先來了解下binlog binlog是mysql server層提供的功能,和儲存引擎無關,binlog儲存了所有服務端執行的ddl和dml語句。所以在binlog完整的情況下,可以理解為...