MySQL Innodb資料庫誤刪ibdata1後MySQL資料庫的恢復案例

来源:https://www.cnblogs.com/kerrycode/archive/2018/08/19/9502209.html
-Advertisement-
Play Games

上周,以前公司的同事朋友找我幫忙,看看能否幫忙恢復一個MySQL 資料庫,具體情況為:資料庫版本為MySQL 5.6(具體版本不清楚),也不清楚具體的資料庫引擎; 沒有資料庫備份,只剩下資料庫下麵的一些文件(frm、idb),具體原因是因為出現問題的時候,重裝了MySQL,最要命的是ibdata1等... ...


 

上周,以前公司的同事朋友找我幫忙,看看能否幫忙恢復一個MySQL 資料庫,具體情況為:資料庫版本為MySQL 5.6(具體版本不清楚),也不清楚具體的資料庫引擎; 沒有資料庫備份,只剩下資料庫下麵的一些文件(frm、idb),具體原因是因為出現問題的時候,重裝了MySQL,最要命的是ibdata1等文件也沒有了,當然這中間細節過程如何,不清楚也不用去糾結了。大概就是這麼一個情況。

 

 

因為資料庫不大,將對應的文件拷貝到自己一臺測試伺服器的MySQL數據文件目錄下後(下麵實驗測試,對資料庫名等敏感信息做了一下混淆),如下所示,資料庫名為test,show tables可以看到相關的表。

 

 

clip_image002

 

 

其中有幾張表的存儲引擎為MyISAM,那麼這些表的數據是完全可以恢復的,但是大部分表的存儲引擎為InnoDB,訪問表或查看表都會提示ERROR 1146 (42S02): Table 'xxxx' doesn't exist 不存在。

 

mysql> desc think_cache;
ERROR 1146 (42S02): Table 'test.think_cache' doesn't exist
mysql> show create table think_cache;
ERROR 1146 (42S02): Table 'test.think_cache' doesn't exist
mysql> 

 

由於共用表空間的ibdata1數據文件不存在了,加之有沒有備份,所以我武斷的判斷這個資料庫真的無法恢復了,但是過後一天,這個朋友跟我說找了一家數據恢復公司將這個資料庫恢復了。 聽到這個消息頗有點學藝不精的尷尬(其實談不上尷尬吧,本來還在學習MySQL的路上,有些知識點不清楚也很正常。經驗是需要慢慢積累的),不過更多的是好奇別人是如何恢複數據的,既然別人能夠恢復,那麼自己下一次遇到這種情況也要能搞定。下麵就來複盤一下別人是如何恢複數據的(其實只要稍稍做點功課,發現這個其實挺簡單的)

 

首先,我們來瞭解一下MySQL 表空間數據文件idbdat1文件相關概念和知識點:

 

    InnoDB採用按表空間(tablespace)的方式進行存儲數據, 預設配置情況下會有一個初始大小為10MB, 名字為ibdata1的文件, 該文件就是預設的表空間文件(tablespce file),用戶可以通過參數innodb_data_file_path對其進行設置,可以有多個數據文件,如果沒有設置innodb_file_per_table的話, 那些Innodb存儲類型的表的數據都放在這個共用表空間中,而系統變數innodb_file_per_table=1的話,那麼InnoDB存儲引擎類型的表就會產生一個獨立表空間,獨立表空間的命名規則為:表名.idb. 這些單獨的表空間文件僅存儲該表的數據、索引和插入緩衝BITMAP等信息,其它信息還是存放在共用表空間中。

 

    其實當時主要是對這個概念有點模糊了,以為這個系統變數innodb_file_per_table預設是關閉的,數據都會存儲在共用表空間中,那麼這些文件刪除了,數據就無法恢復。所以武斷的下結論,其實從MySQL 5.6.6開始, 系統變數innodb_file_per_table預設是啟用的。只要再多瞭解一點或者說更深入瞭解一點的話,情況就會立馬就會反轉。也就是說如果開啟了獨立表空間,可從ibd文件中恢複數據。即使共用表空間的數據文件idbdata1丟失也不要緊,反之,如果未開啟獨立表空間時,idbdat1被刪除了,數據也會被刪除,只能從備份中恢復,真的沒有其他辦法。

 

 

那麼我們接下來看看,如何從idb文件中恢複數據吧,我們需要用到mysqlfrm工具, 需要安裝MySQL Utilities,下麵是安裝MySQL Utilities 1.5.5

 

# tar -xvf mysql-utilities-1.5.5.tar.gz

# cd mysql-utilities-1.5.5

# python ./setup.py build

# python ./setup.py install

 

 

提取frm文件的表結構信息

 

mysqlfrm 是一個恢復性質的工具,用來讀取.frm文件並從該文件中找到表定義數據生成CREATE語句。此處不對mysqlfrm工具做過多介紹,我們使用msqlfrm來生成該資料庫的表的CREATE語句

 

[root@DB-Server ~]# service mysql stop
Shutting down MySQL.... SUCCESS! 
[root@DB-Server ~]# /usr/local/bin/mysqlfrm --basedir=/usr --port=3306 --user=root /data/mysql/test/ > test_frm.sql
[root@DB-Server ~]# 

 

檢查導出的SQL語句發現都是ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode這類錯誤

 

[root@DB-Server ~]# more test_frm.sql 
# Spawning server with --user=root.
# Starting the spawned server on port 3306 ... done.
# Reading .frm files
#
# Reading the think_cache.frm file.
ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.
#
# Reading the think_session.frm file.
ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.
#
# Reading the wx_activity_config.frm file.
ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.
#
........................................................................................

 

從中可以看到這個資料庫之前的版本為MySQL5.6.29而我這裡的MySQL版本比這個低MySQL 5.6.20。所以必須找一個跟這個版本相同或高的MySQL資料庫操作才行。於是在另外一臺測試伺服器安裝了MySQL

 

[root@gettestlnx02 ~]# service mysqld stop
 
Stopping mysqld:  [  OK  ]
 
[root@gettestlnx02 tmp]# mv test  /data/mysqldata/mysql/test
 
[root@gettestlnx02 tmp]# cd /data/mysqldata/mysql/

 

/usr/bin/mysqlfrm --basedir=/usr --port=3306 --user=root /data/mysqldata/mysql/test/ > test_frm.sql

 

如何要查看輸出信息,可以使用參數-vvv

 

/usr/bin/mysqlfrm --basedir=/usr --port=3306 --user=root -vvv /data/mysqldata/mysql/test/ > test_frm.sql

 

clip_image003

 

生成的SQL腳本沒有以分號結尾,本來想用sed命令給那些CREATE TABLE腳本加上分號結尾,但是發現其中大量CREATE TABLE的腳本結尾沒有規律,都是以COMMNET='xxxxx'結尾,只能手工添加分號(如下所示)

 

 

clip_image004

 

 

導入frm文件的表結構信息

 

mysql> use test;
Database changed
mysql> source test_frm.sql
Query OK, 0 rows affected (0.02 sec)
 
Query OK, 0 rows affected (0.01 sec)
 
Query OK, 0 rows affected (0.01 sec)
 
Query OK, 0 rows affected (0.00 sec)
.................................

 

然後我們檢查這個資料庫的各類文件frm、ibd、MYI、MYD文件數量,後續做對比驗證用途。

 

[root@gettestlnx02 test]# ls -lrt *.frm | wc -l

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;us ...
  • 有時候想在自己電腦、路由器或者樹莓派上搭建一些web、vpn等服務讓自己用,但是自己的電腦一般沒有外網ip,沒法在外部訪問這些服務,就像下圖,電腦能訪問到外網,但是沒法從外網訪問到電腦。 這時可以用一臺有外網ip的伺服器利用ngrok在中間做個跳板,如下圖,原理是搭有web服務的內網電腦A 與公網服 ...
  • 第1章 shell基礎 1.1 什麼是shell Shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出屏幕返回給用戶。 1.1.1 shell對話方式 交互的方式:從鍵盤輸入命令,通過/bin/bash的解析,可以 ...
  • 前言 最近沒更新新篇幅了,今天就來點幹活,過多的也不說了下麵著手乾!乾!乾! 準備環境 centos7.5 apr-1.6.3.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.34.tar.bz2 php-7.1.18.tar.bz2 mariadb-10.2.16-l ...
  • 註:轉載請標明文章來源,感謝支持作者勞動! 一、問題描述 用iphone手機上的nRF connect軟體調試藍牙通信。 1、nRF52藍牙demo電路板,燒錄一個SDK的程式,iphone手機可以成功連接及發現服務。如下圖, 2、之後燒錄另一個固件,發現掃描出現的藍牙名稱等信息均已經改變,但是點擊 ...
  • Linux下su與su -命令的區別 在啟動伺服器ntpd服務時遇到一個問題 使用 su root 切換到root用戶後,不可以使用service命令; 使用 su - 後,就可以使用service命令了。 原因: su命令和su -命令區別就是: su只是切換了root身份,但Shell環境仍然是 ...
  • 應朋友要求,寫個存儲過程說明,本篇比較簡單,適合新接觸存儲過程的同學 先來個簡單的 如果使用的是PL/SQL,執行後會在output中列印my first execute,那麼這裡就有了第一個功能 dbms_output.put_line,在output裡面列印結果,另外還有dbms_output. ...
  • 1、下載安裝 1.1 下載: 1.2 解壓 1.3 初始化 1.4 啟動mysql服務 1.5 啟動MySQL客戶端並連接MySQL服務 由於初始化時使用的【mysqld --initialize-insecure】命令,其預設未給root賬戶設置密碼 輸入回車,見下圖表示安裝成功: 1.6 添加環 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...