前段時間,磁碟格式化,忘了吧資料庫備份。而且格式化後有寫入資料,導致恢復出來的資料庫檔案有些許損壞,資料庫無法正常啟動。
必須滿足的條件:
1、本方法只針對採用獨立表空間方式儲存資料的mysql資料庫的恢復。
2、無論如何,ibdata1檔案必須存在。
3、本方法適用單個表資料恢復,你可以不知道整個資料庫的所有表定義,但必須知道你要提取資料的表的定義,憑記憶在其他資料庫重新建乙個表也行。
可以應對以下場景:
1、資料庫服務無法啟動。
2、服務可以啟動(或通過配置innodb_force_recovery方式啟動),但關鍵資料庫或資料表無法開啟。
3、資料庫表結構丟失,只剩下ibdata1及其同型別檔案。
1、如果因意外斷電或其他情況,導致mysql無法正確啟動,可嘗試配置innodb_force_recovery,忽略啟動時的一些常規檢測,強行啟動。
2、如果表結構和資料檔案都完整而無法正常啟動資料庫的,盡可能使用常見的簡單的修復方法修復。本方法略微複雜些,也是萬般無奈時才會使用。
mysql是開源的,其底層的資料儲存和查詢方式是公開的。所以,可以按照mysql查詢資料的方式進行提取資料。具體流程如下:
1、獲取要提取資料的表的表定義。原資料庫裡的表定義也好,自己又憑記憶建立的也罷,只要有就好,不過盡量準確,不然可能會因型別轉換錯誤導致亂碼。
2、提取需要的頁。innodb頁的預設大小是16k,每個頁屬於乙個特定表中的乙個特定的index。也就是你的表的資料儲存在很多頁中,每個頁存16k的資料,你需要找到你需要的資料儲存在哪些頁裡。這裡如何獲取可分兩種情況,一種是mysql服務可以啟動,一種是無法啟動。具體方法下面介紹。
3、將得到的頁的資料按照第一步中取到的表定義轉換成對應的資料記錄,如果你的表資料分布在n多頁中,可以先合併這些頁,在提取資料。
4、資料拿到,下一步如何操作就可以跟進實際情況做了,重建資料庫,乙個表乙個表的恢復也好,就只要這乙個表的資料也罷。
思路如上,由於我們不是很了解mysql的儲存查詢原理,只能借助專業的工具。也就是:percona data recovery tool for innodb。
具體如何使用,可以參考:
不過上面提到的部落格中獲取頁的方式是在資料庫服務尚能啟動的情況。而當資料庫服務無法啟動時,只要你對你的資料足夠了解,其實也是可以提取到資料所在的page的。
具體如何在離線的情況下獲取頁,可參考如下:
簡單說下我用的一種,找乙個基本唯一的資料關鍵字,通過遍歷所有頁的方式,找到對應的頁。
在使用percona data recovery tool for innodb工具時,首先會將ibdata1檔案進行切分頁,切出來的頁會分布在n多資料夾中,每個資料夾中的頁都屬於同乙個表。所以,只要你通過關鍵字的方式,鎖定乙個page頁,那麼它所在的資料夾下的所有頁都是這個表的資料,基本上就可用拿到該錶的所有資料了。
linux下,使用命令:
$ grep -r "你的關鍵字" pages-1217332715/
這裡的 pages-1217332715/是切分頁時生成的目錄,替換成你自己的就可以,該命令會對該資料夾下所有檔案以及子資料夾下的檔案進行遍歷,找出匹配到的檔案。
之後再結合上文提到的部落格裡的方法合併多個頁,再提取資料就可以了。
其他的方法,我沒試,可以自行試試。
MySQL資料庫恢復
使用mysql命令 mysql u root p test home bak 2019 04 11 stumysql1.sql enter password song123 使用source命令恢復資料庫的說明 進入mysql資料庫控制台後,切換到想恢復資料的資料庫。mysql use 資料庫 接著...
mysql資料庫受損恢復 MySQL資料庫恢復
資料庫恢復是指以備份為基礎,與備份相對應的系統維護和管理操作。系統進行恢復操作時,先執行一些系統安全性的檢查,包括檢查所要恢復的資料庫是否存在 資料庫是否變化及資料庫檔案是否相容等,然後根據所採用的資料庫備份型別採取相應的恢復措施。資料庫恢復機制設計的兩個關鍵問題是 第一,如何建立冗餘資料 第二,如...
mysql資料庫備份,恢復
生產的資料庫可能因為以下情況導致資料丟失 硬體故障 軟體故障 自然災害 黑客攻擊 誤操作 佔比例最大 1.能夠容忍丟失多少資料 2.恢復資料需要多長時間 3.需要恢復哪一些資料 備份整個資料庫 增量備份 備份自從上次備份以來變化的資料。節約空間,還原麻煩 差異備份 備份上次完全備份以來變化的資料。浪...