1. 程式人生 > >記一次MySQL刪庫的資料恢復

記一次MySQL刪庫的資料恢復

這裡寫圖片描述
昨天因為不可描述的原因,資料庫直接被 drop database刪除。在第一時間停止資料庫服務和Web服務,備份MySQL資料目錄下的所有檔案之後,開始走上資料恢復之路。

第一次幹這種事,各種不得法。因為我們既沒有備份,也沒有開啟binlog,連innodb_file_per_tabe_也沒有。一番折騰後向萬能的朋友圈求救,朋友給了兩個連結,最終救了一下命。以下先按編號記下 URL,後續引用之。

其中URL1和URL3的內容基本上相同,是整個恢復工作的藍本。URL2是URL1中引用的一個twindb團隊開發的一個工具,現在他們官方已經刪除了,URL2是該工具的一個fork,或者說是備份。

恢復過程以URL3為藍本,先去URL2 git clone一份程式碼下來,然後按其說明編譯,我們在ubuntu server 14.04 64bit 版本的情況下,成功編譯完成,編譯中需要安裝各種依賴不表。

然後用 stream_parser 處理ibdata1 檔案,接下來恢復SYS_TABLESSYS_INDEXES,建議此過程中嚴格遵守參考資料,比如把這些資料恢復到dumps/default 目錄中,而不是隨意起名,以免橫生枝節。

這裡還有一個坑,就是URL3裡用的c_parser -4f 是會出錯的,而URL1裡用的是c_parser -4Df ,就不會出錯,所以大家做的時候一定要把這個D加上。感嘆一下,如果不細心的人真的沒法做這事!摔!

接下來按URL3的說明把資料字典匯入 MySQL。這一步可以不做,按URL1裡高票答案的方法來獲取索引ID,比較麻煩。URL3的方法應該會出這樣的錯:

ERROR 1148 (42000) at line 2: The used command is not allowed with this MySQL version

這是因為MySQL預設不啟用LOAD DATA LOCAL INFILE 導致的,需要給mysql 命令加上--local-infile 引數。這是參考文獻的一個坑。趟過這個坑以後,我可以告訴你一個捷徑,就是URL2裡的程式碼裡其實有一個檔案recover_dictionary.sh

,它乾的就是恢復資料字典的事情,所以你只要把這個shell腳本里的mysql 都替換成mysql --local-infile -uroot -pxxxxx 就行,其中xxxx是指你的root賬號密碼,不過前提是你很聽話的用了前面說的dumps/default 目錄,不然就再多一輪替換。

接下來的內容,大部分是參考文獻裡沒有的了。

恢復資料字典後,就可以用URL3介紹的方式找出你對應的所有資料庫和表的索引ID了。這個時候就遇到為 c_parser 提供資料表建表語句的問題了,這個問題難就難在先有雞還是先有蛋,一般來說,資料庫都被刪掉了,哪還有辦法去搞出CREATE TABLE 這種建表語句呢?好就好在我們用的是django,它對資料遷移的完美支援救了我一命。在這裡講一句題外話,使用類似django/ror/laravel等有資料遷移框架在此就看出多麼重要了。只要在根據原有專案做一次migrate,資料表就建好了,這時候只要用mysqldump匯出對應表的建表語句即可:

mysqldump --add-drop-table=0 --add-lock=0 -d DBNAME TABLENAME -uroot -p > xxxx.sql

因為c_parser 非常弱,只處理CREATE TABLE 語句,多一點干擾都不行,所以上面的引數都是必要的。

接下來就是參考URL1把某一個表的資料恢復出來,這裡有一個坑,URL1裡說把資料恢復到dump.tsv裡,其實是不對的,這裡應該用dumps/default/TABLENAME,別問我為什麼知道,我不會告訴你我找這個原因找瞎了眼,好吧,跟你說,因為生成的load_cmd.sql 裡直接引用 dumps/default/TABLENAME,無法設定。所以最後我們這裡可用的命令是:

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000002410.page -t xxxx.sql > dumps/default/TABLENAME 2> load_cmd.sql

把資料恢復出來以後,執行

mysql --local-infile -uroot -p DBNAME < load_cmd.sql

就可以把資料導進去了,記得在資料庫裡查詢一下有沒有成功,如果沒有資料恢復出來,應該是其中的某些環節出了問題。

這樣就成功恢復了某一個表,只要按這裡最後三條命令(匯出建表語句、恢復資料、匯入資料)重複地做下去,你就能把基本上所有的資料都恢復出來了。之所以說是“基本上”,原因是我係統中使用了utf8mb4 編碼(為了相容emoji),結果是如果資料中有emoji的內容就會在匯入資料的環節出錯,暫時沒有找到辦法恢復這個資料。

以上就是整個恢復過程,枯燥、壓力山大,這種事情我不想再經歷了。如果你也遇到這樣的資料恢復需求,希望這篇筆記能夠幫到你。但也不要指望我能幫到你更多了,我的經驗也僅止於此,天大地大,就此別過,不要找我。謝謝!

相關推薦

MySQL資料恢復

昨天因為不可描述的原因,資料庫直接被 drop database刪除。在第一時間停止資料庫服務和Web服務,備份MySQL資料目錄下的所有檔案之後,開始走上資料恢復之路。 第一次幹這種事,各種不得法。因為我們既沒有備份,也沒有開啟binlog,連innod

差點跑路的事故

Go 不能 題解 數據庫連接 use 項目 root 不一致 流量 故事這樣發生的,那是一個中午。。。。 老板:小a呀,咱測試項目部署在百度雲服務器上,測試數據庫部署在阿裏雲上,為了節省點流量,你把阿裏雲上的測試數據庫遷移到百度雲上吧。 小a : 好的,老板。 小a登陸測試

有驚無險的Linux資料恢復過程

問題階段 起因: 昨天晚上思路不是很清晰(上了一天班回來有點蒙),還是強忍著疲憊想搞事情,結果悲劇了… … 本來想拿SD卡做一張linux燒錄卡,燒錄指令碼是很久以前寫的,有git記錄,一直不成功,就回退了幾次提交,然後執行的時候沒有給指令碼傳參(/dev

誤刪除系列三:有道筆記資料恢復過程

1. 環境: 三個有道雲筆記客戶端分別是windows7、iphone、MAC   2. 事件發生過程: 今天早上在win7的有道雲筆記下記錄一些筆記時,出現誤刪除操作,當時我使用的是它的markdown模組進行記錄操作,剛好一個文件記錄了我一週一些學習過程的筆記,就在某一個時刻敲鍵盤時,

MySQL資料-恢復體驗

資料誤刪了怎麼辦?本文也許能給您一定的提示。 一、檢視日誌 資料無意中發現不見了,怎麼辦? 也許首先想到的是去查日誌,找到問題原因,但是這個時間有可能會比較長,並且線上的業務在這段時間會收到影響。 因此,先不要去管什麼原因,首先應該做的第一件事情應當是資料恢復,保證正常的業務不受影響,而後再回過來查詢原

mysql數據刪除恢復的案例

mysql 數據恢復 linux emmmmm 今天晚上十一點有個朋友說他的數據庫刪除了。是昨天刪除的。我就日了mmp 了數據庫不做備份的??????????what fuck 那就登陸服務器看看吧看到還有一個4 月22 號的。那麽就新建一個數據庫導入進去唄導入導入之後改下源代碼看看能不能訪問e

資料

js中 0、' '、FALSE是等價的,null 和 undefined等價,那有沒有考慮過0 和 null什麼時間會等價呢,我用血淋淋的教訓告訴你; 業務場景是這樣的: 現在需要設定一個代理人,在員工請假有事時可以由此代理人提供服務;在設定代理人時,會把該員工所有許

mysql事故---紀念逝去的一上午

not 路徑 內部 oca oss ica relay its scala 虛擬機關機後第二天mysql起不來,回想一下我關機前和關機後的操作發現:關機前沒關閉mysqld服務就直接init 0了,關機後將虛擬機內存由1G降到724M。筆者保證再也做過別的騷操作了。

mysql中文字符亂碼的問題排查

mysql mysql中文亂碼 mysql字符集 今天開發反應兩樣的程序往一個庫裏面插入數據正常,往另外一個庫裏面插入數據有亂碼。第一反應就是兩個數據庫關於字符集的配置不一樣。在兩個庫分別查看參數:show variables like "%char%";+--------------------

MySQL存儲過程和遊標的使用

MySQL存儲過程 MySQL遊標 需求: 有三張表:Player、Consumption、Consumption_other。Player表中記錄用戶信息(playerid、origin等字段),Consumption和Consumption_other記錄用戶的消費信息。現需要根據Playe

Mysql魔鬼實訓

設置 分享 add onf 數據庫 9.png where con mysqldump 1.查看某個Mysql數據庫當前使用的字符集 show create database 【庫名稱】 2.查看當前書庫版本信息 #mysql -V MariaDB [(none)]>

MySQL遷移並從MySQL5.6升級到5.7後查詢慢了幾十倍的問題

打印 ins 狀態 sql語句 top 引用 為什麽 區別 image 起因 因為生產環境數據量越來越大,客戶越來越多,項目功能也越來越多,項目本身也越來越多,導致之前的服務器內存、硬盤都已經漸漸的不夠用了,當時出現了2種解決方案,增加服務器配置和新購服務器,但是就算是新增

MySQL安裝出現的坑爹問題。。。

    關鍵詞:mysql安裝 msvcr100.dll缺失  vc++2010 ;    win10系統首次安裝mysql,圖方便下載了圖形介面的安裝包(5.6.4),本以為小事一樁:裝一半失敗、解除安裝清登錄檔、重灌、換zip免裝包,調配置檔案..

MySQL semaphore crash 的分析(有彩蛋)

文章來源:愛可生雲資料庫作者:洪斌 DBA應該對InnoDB: Semaphore wait has lasted > 600 seconds. We intentionally crash the server because it appears to b

Mysql佔用記憶體過高的優化過程

一.環境說明: 作業系統:CentOS 6.5 x86_64 資料庫:Mysql 5.6.22 伺服器:阿里雲VPS,32G Mem,0 swap 二.問題情況: 1.某日發現公司線上系統的Mysql某個例項的從庫長時間記憶體佔用達到60%如下圖 2.於是開始

資料庫伺服器中毒癱瘓恢復感受

         前陣子,滿血復活數次,大戰4天4夜,從11月6號早上中毒開始我司與現場IT對接召開緊急會議,響應一級故障,採取臨時緊急預案,由於伺服器上檔案包括備份全部被勒索病毒Gandcrab5.0.4加密感染,部分伺服器包括雙機熱備也遭遇癱

MHA主從不同步恢復過程

背景: 根據生產環境故障模擬,由於生產環境主機mysql資料目錄滿,造成業務側連線mysql異常。維護人員在排查時,誤將MHA中主master的二進位制日誌全部清除,造成兩個從庫向主庫同步拉取日誌失敗,報找不到日誌錯誤。為解決該問題,同時又考慮到生產庫不能停庫,所以準備在主master庫上對相關

MYSQL建表失敗得bug(暫未解決!,求助)

CREATE TABLE `SUIT` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT, `acId` INTEGER(11) NULL COMMENT '活動ID', `name` VARCHAR(64) NULL COMMENT '套裝名稱', `dis

mysql去重查詢與刪除重複記錄

查詢: select *,id,count(*) as count from artist group by id having count>1; 刪除(刪除order_id值大的): delete from artist where id in( SELECT * from

mysql物理備份

由於一些原因,需要備份一個數據檔案,但是由於沒有建立分表,導致ibdata1檔案巨大。所以通過複製壓縮到本地備份。 備份過程:我直接吧ibdata1,和ib_logfile0,ib_logfile1進