全棧之路:從阿里雲自動備份文件ibd,frm中恢復數據庫數據

MySQL Mac 技術 代碼筆記 2017-04-26

歡迎點擊右上角 +關注,反正動動手指也不會懷孕,更重要是希望能在工作中幫助到您。

前言

[代碼筆記]為一系列的文章,從一個python ,django 完整項目的環境和工具講起,隨時供自己備查,進階全棧工程師的狂暴之路。

開始

阿里雲的RDS數據提供了默認的 自動數據庫備份功能, 但當面臨單表數據誤刪,或者單表誤drop的情況,如果使用物理全備進行恢復呢? 我就遇到這個麻煩問題。

因為這個備份文件的恢復並不是sql的全量備份,而是基於 innodb的文件備份。

下載備份文件

  1. 首先從阿里雲下載了 名字類似為 hins1751639_data_20170424063544.tar.gz 的備份文件到本地。

  2. 看到解壓縮開的一堆文件如下圖所示

tar -xzvf hins1751639_data_20170424063544.tar.gz hint



全棧之路:從阿里雲自動備份文件ibd,frm中恢復數據庫數據

備份文件解壓

其中 wonderland 目錄下是當前的數據庫裡數據文件

我要用到的是web_store表, 對應的文件為 web_store.ibd 和 web_store.frm

找回表結構

表結構沒丟的話直接跳過本節 ,看下一步

1 進入mysql ,創建一個新的臨時數據庫

CREATE DATABASE sstest DEFAULT CHARACTER SET utf8;

2 創建一個表結構,和要恢復的表名是一樣的。表裡的字段無所謂,一定要是innodb引擎的

CREATE TABLE web_store (

id int(11) NOT NULL AUTO_INCREMENT,

name varchar(128) NOT NULL,

) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

3 關閉mysql

mysql.service stop

4 用需要恢復的 web_store.frm 覆蓋新建的frm文件, 我在mac本地的數據文件路徑在 /usr/local/mysql/data/sstest/

cp web_store.frm /usr/local/mysql/data/sstest/web_store.frm

5 參考資料說要 修改my.ini 裡 innodb_force_recovery=1 , 如果不成修改為 2,3,4,5,6。 ,我在本地沒有這個文件,跳過了這一步

6 啟動mysql

mysql.service start

show create table web_store

看到表結構

找回數據

1 進入mysql ,創建一個新的臨時數據庫

2 廢掉表空間, 使當前的ibd和frm分離

alter table web_store discard tablespace;

3 把之前要恢復的.ibd文件複製到新的表結構文件下,使當前的ibd 和frm發生關係

alter table web_store import tablespace;

這裡沒錯誤的話就已經建立好了。

4 把所有數據導出後,在新的數據庫導入

參考命令

1 導出一個表,包括表結構和數據

mysqldump -u用戶名 -p 密碼 數據庫名 表名> 導出的文件名

mysqldump -uroot -p test web_store> web_store.sql

2 在mysql 裡導入 sql語句

source ~/web_store.sql

3 改變文件擁有者和群組權限,mysql有可能因為權限問題讀去不了 對應的frm和 ibd文件

sudo chown _mysql:wheel web_store.frm

個人警醒

在做任何的數據庫sql導入之前,務必先導出備份一下, 會有各種意想不到的麻煩逼你找回原有數據的,即使有方法解決也會非常被動

相關推薦

推薦中...