MySQL數據恢復新姿式

1、背景

1.一、需求來源

須要給客戶將生產環境的數據恢復到測試環境,可是線上環境的xtrabackup全備數據量太大,拷貝下來比較麻煩,而且須要恢復的數據只有整庫中的兩張表的數據,因此客戶只是將全備中的對應表的ibd文件以及frm文件拷貝下來了,要求根據ibd文件以及frm文件進行數據恢復。mysql

1.二、環境介紹

  • 數據庫版本:MySQL-5.7.22
  • 數據庫要求:innodb_file_per_table=1

2、解決方案步驟

2.一、準備工做

  • 準備好須要進行數據恢復的表ibd文件以及frm文件
  • 安裝一個新的MySQL實例
  • innodb_file_per_table

安裝步驟省略git

2.二、表結構恢復

  • 在數據庫中建立一張表名與被恢復表表名一致的表,表結構不限制

  • 將新建表的ibd文件以及frm文件拷貝到tmp目錄下備份
# cp message_index.* /tmp/
複製代碼
  • 使用被恢復的frm文件替換新建立的同名表的frm文件
# cp /data2/message_index.frm ./
cp:是否覆蓋"./message_index.frm"? y
# chown -R mysql:mysql ./*
複製代碼
  • 在數據庫中執行show create table語句 注意須要在show create table 查看錶結構以前執行flush tables語句,由於若是message_index表以前被打開過,那麼表結構會被緩存在內存中,show create table不會報錯,也就沒法從錯誤日誌中拿到咱們須要的信息。

  • 查看error.log,獲取被恢復表的字段數 錯誤日誌中會打印咱們須要恢復的表的字段數,這邊能夠看到咱們須要恢復的表中含有6個字段

  • 刪除message_index表,並從新建立message_index表

從上面的步驟中咱們知道被恢復表中含有6個字段,因此從新建立的message_index表須要含有6個字段,字段名以及字段類型不限制github

  • 再次使用被恢復的frm文件替換新建立的同名表的frm文件
# cp /data2/message_index.frm ./
cp:是否覆蓋"./message_index.frm"? y
# chown -R mysql:mysql ./*
複製代碼
  • 在MySQL配置文件中添加innodb_force_recovery=6,並重啓數據庫

  • 經過show create table語句拿到message_index表的表結構

至此,咱們就拿到了咱們須要進行恢復的表的表結構。sql

2.三、表數據恢復

拿到表結構以後,表數據恢復步驟相對錶結構恢復步驟而言會簡單一些數據庫

  • 將innodb_force_recovery=6從配置文件中去掉、使用/tmp目錄下的ibd文件以及frm文件覆蓋當前的對應文件、重啓數據庫
  • 在數據庫中按照獲取到的表結構新建一張message_index表
  • 執行alter table discard tablespace語句
mysql> alter table message_index discard tablespace;
複製代碼

  • 將要恢復的表的ibd文件拷貝到當前庫下,並更改屬主以及屬組
# chown -R mysql:mysql ./*
複製代碼
  • 執行alter table import tablespace語句
mysql> alter table message_index import tablespace;
複製代碼

能夠看到數據已經都恢復回來了。緩存

3、總結

  • 以上咱們經過xtrabackup全備中的ibd文件以及frm文件恢復了數據,這樣也就表明着xtrabackup就算備份失敗,只要有部分ibd文件以及frm文件保證無缺,MySQL也是能夠進行數據恢復的,在極端狀況下也能儘量的減小損失。可是因爲xtrabackup是經過記錄redo日誌的方式來保存備份過程當中產生的增量數據,這一部分增量數據目前尚未辦法恢復。
  • 導入表空間的方式,也給MySQL大數據量遷移方案提供了一種思路:直接拷貝ibd文件的方式

博客地址:win-man.github.io/
公衆號:歡迎關注bash

相關文章
相關標籤/搜索