一、MySQL資料庫遷移或備份
將相關資料庫資料檔案直接遷移方式
1. 瞭解使用InnoDB
引擎建立資料庫所產生的檔案
使用MySQL InnoDB
引擎所產生的檔案(三個檔案都很重要)
.ibd
:包含每個table的資料和索引.frm
:描述table的結構等ibdata1
:包含所有table的字典和歷史操作
在data
資料夾下,每個資料庫分別是一個資料夾(如:mosquitto
),ibdata1
檔案會記錄MySQL中所有InnoDB
資料庫中table
的字典和歷史操作:
在mosquitto
資料夾總,包含每個table
的.ibd
檔案和.frm
檔案
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
過程如圖所示:
- 執行所生成的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)檢視是否成功