歡迎點擊右上角 +關注,反正動動手指也不會懷孕,更重要是希望能在工作中幫助到您。
前言
[代碼筆記]為一系列的文章,從一個python ,django 完整項目的環境和工具講起,隨時供自己備查,進階全棧工程師的狂暴之路。
開始
阿里雲的RDS數據提供了默認的 自動數據庫備份功能, 但當面臨單表數據誤刪,或者單表誤drop的情況,如果使用物理全備進行恢復呢? 我就遇到這個麻煩問題。
因為這個備份文件的恢復並不是sql的全量備份,而是基於 innodb的文件備份。
下載備份文件
首先從阿里雲下載了 名字類似為 hins1751639_data_20170424063544.tar.gz 的備份文件到本地。
看到解壓縮開的一堆文件如下圖所示
tar -xzvf hins1751639_data_20170424063544.tar.gz hint
其中 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導入之前,務必先導出備份一下, 會有各種意想不到的麻煩逼你找回原有數據的,即使有方法解決也會非常被動