MySQL資料庫遷移與MySQL資料庫批量恢復

晨星1032發表於2021-02-04

作者:晨星1032

一、MySQL資料庫遷移或備份

將相關資料庫資料檔案直接遷移方式

1. 瞭解使用InnoDB引擎建立資料庫所產生的檔案

使用MySQL InnoDB引擎所產生的檔案(三個檔案都很重要)

  • .ibd:包含每個table的資料和索引
  • .frm:描述table的結構等
  • ibdata1:包含所有table的字典和歷史操作

data資料夾下,每個資料庫分別是一個資料夾(如:mosquitto),ibdata1檔案會記錄MySQL中所有InnoDB資料庫中table的字典和歷史操作:

MySQL資料庫遷移與MySQL資料庫批量恢復

mosquitto資料夾總,包含每個table.ibd檔案和.frm檔案

MySQL資料庫遷移與MySQL資料庫批量恢復

2. 遷移資料庫步驟

基本要求:

  • 保證MySQL版本基本一致,安裝配置基本一致
  • 停止兩邊的MySQL服務

(1)從A伺服器遷移至B伺服器

  • 清空B伺服器MySQL的data目錄下所有檔案
  • 拷貝A伺服器MySQL的data目錄下除了ib_logfile和.err之外的檔案到B伺服器data下
  • 啟動B伺服器的MySQL服務,檢測是否發生異常

(2)MySQL重灌並匯入之前資料庫

  • 備份MySQL的data目錄下除了ib_logfile和.err之外的所有檔案到其他目錄
  • 清空MySQL的data目錄下所有檔案
  • 拷貝備份的資料檔案到data目錄下
  • 啟動MySQL服務,檢測是否發生異常

注意:

遷移時將每個資料庫資料夾時一定不能忘記ibdata1檔案,若不小心刪除ibdata1檔案可以繼續看以下內容恢復。

二、MySQL資料庫批量恢復(通過.frm.ibd檔案批量恢復)

若不小心刪除ibdata1檔案,即目前只有.frm.ibd檔案如何恢復資料?同時資料庫表格過多又如何批量恢復?

1. 通過.frm檔案批量恢復表結構資訊(使用mysqlfrm)

mysqlfrm其他版本(windows等)下載地址:https://downloads.mysql.com/archives/utilities/

(1)mysqlfrm安裝

下載

wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz

解壓

tar -xvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5/

安裝(需要Python環境,python2.6及以上)

python ./setup.py build
python ./setup.py install

檢查是否安裝成功

mysqlfrm --version

(2)使用mysqlfrm檢視錶結構建立語句

​ mysqlfrm有--basedir模式以及--server模式,但推薦--server,能夠還原最為準確的資訊

  • 使用方式(啟動MySQL服務)

格式:mysqlfrm --server=使用者名稱:密碼@資料庫地址:埠 需恢復的frm檔案目錄 --diagnostic > 儲存SQL檔名.sql

mysqlfrm --server=root:123456@192.168.11.130:3306 /mnt/mysql/mysql_data/mosquitto/*.frm --diagnostic > mosquitto_frm.sql

過程如圖所示:

image-20210202113017354

  • 執行所生成的SQL檔案

注:mysqlfrm僅顯示整個資料庫的表結構建立語句,可以顯示在控制檯也可以輸出到檔案,不過仍需要手動執行這些表建立SQL語句。

先建立資料庫

CREATE DATABASE `mosquitto`

可以檢視生成的sql檔案手動刪除相關無用資訊等,可命令列執行或者客戶端執行等

命令列

mysql -uroot -p123456 mosquitto < mosquitto_frm.sql

2. 通過.ibd檔案批量恢復表資料資訊

(1)讓表結構和表空間脫離

注:

使用不了mysql命令或者執行mysql出現Can't connect to local MySQL server through socket '/tmp/mysql.sock'等問題時,請檢視這一篇文章解決https://www.cnblogs.com/maogen/p/14353778.html

生成

mysql -uroot -p123456 -e " SELECT concat('alter table ', table_name, ' discard tablespace;') FROM information_schema.tables WHERE table_schema = 'mosquitto';" > tem_discard.sql

刪除多餘資訊

sed '/^c/d' tem_discard.sql > discard.sql

執行命令

mysql -uroot -p123456 mosquitto < discard.sql

(2)將需要恢復的.ibd替換到相關目錄下

cp /mnt/mysql/mosquitto/*.ibd /mnt/mysql/mysql_data/mosquitto/

(3)許可權設定

chown -R mysql.mysql /mnt/mysql/*

(4)匯入表空間

生成

mysql -uroot -p123456 -e " SELECT concat('alter table ', table_name, ' import tablespace;') FROM information_schema.tables WHERE table_schema = 'mosquitto1';" > tem_import.sql

刪除多餘資訊

sed '/^c/d' tem_import.sql > import.sql

執行命令

mysql -uroot -p123456 mosquitto < import.sql

(5)檢視是否成功

作者:晨星1032

參考

MySQL資料庫遷移(資料檔案直接遷移)-CSDN

MySQL直接拷貝資料庫檔案後出現table xxx doesn't exist解決方法-Penguin

Mysql,innodb使用.ibd檔案快速批量恢復資料---批量快速-CSDN

相關文章