首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 數據庫遷移實戰:文件級拷貝法 (含 ibdata1 關鍵步驟)

     編輯:MySQL 資料庫相關知識

適用場景

  • 同版本、同架構、同參數配置的 MySQL 實例間遷移
  • 大數據量 (百 GB+),邏輯導出導入耗時不可接受
  • 需極短停機窗口 (僅需停目標庫服務)

遷移前提條件

  1. 源/目標 MySQL 版本完全一致 (如均為 5.6.32)
  2. 編譯參數一致 (數據目錄結構、頁大小、壓縮算法等)
  3. 目標實例已初始化、服務停止

Windows 環境操作步驟

1. 目標機器準備

# 安裝同版本 MySQL
# 停止服務
net stop mysql

2. 源機器拷貝關鍵文件

進入源數據目錄 (如 C:\ProgramData\MySQL\MySQL Server 5.6\Data\):

# 必須拷貝的文件/目錄
- 目標數據庫目錄 (如 platform/)
- ibdata1                    # 核心系統表空間 (含數據字典、undo log、雙寫緩衝)
- ib_logfile0, ib_logfile1   # 重做日誌 (崩潰恢復必需)
- mysql/                     # 系統庫 (可選,遷移用戶權限時需拷貝)

# 不需拷貝
- *.err, *.pid, *.log        # 日誌/臨時文件
- auto.cnf                   # server_uuid 必須唯一
- performance_schema/        # 運行時動態生成

源數據目錄文件列表

3. 目標機器覆蓋文件並啟動

# 將上述文件覆蓋到目標數據目錄
# 關鍵:ibdata1 必須放到正確位置 (若目標配置 innodb_data_file_path 指向非默認路徑,拷貝到對應路徑)

net start mysql

Linux 環境補充

# 1. 停止服務
systemctl stop mysqld

# 2. 拷貝 (rsync 推薦)
rsync -av --exclude='*.err' --exclude='*.pid' --exclude='auto.cnf' \
  /var/lib/mysql/ target_server:/var/lib/mysql/

# 3. 修正權限 (關鍵!)
chown -R mysql:mysql /var/lib/mysql

# 4. 啟動
systemctl start mysqld

遷移後驗證

-- 1. 檢查數據庫列表
SHOW DATABASES;

-- 2. 核心表行數對比
SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES 
WHERE TABLE_SCHEMA='platform';

-- 3. 業務關鍵查詢測試
SELECT * FROM platform.test LIMIT 10;

-- 4. 檢查錯誤日誌無異常
tail -f /var/log/mysqld.log

常見失敗案例:遺漏 ibdata1

mysql> USE platform;
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_platform    |
+-----------------------+
| mobile_scanner        |
| sharer                |
+-----------------------+

mysql> DESC test;
ERROR 1146 (42S02): Table 'platform.test' doesn't exist
-- 表能查到 (frm 存在),但 DESC 失敗 (ibdata1 中數據字典缺失)
鐵律:ibdata1 必須完整拷貝到正確路徑。它是 InnoDB 核心,包含所有表的元數據、undo 日誌、雙寫緩衝區。缺失即意味著數據字典為空,表結構讀取失敗。

總結

文件級遷移「快、準、狠」但前提嚴苛:版本一致、配置一致、ibdata1/ib_logfile* 完整拷貝、權限修正。異構遷移 (版本升級/參數調整) 必須走 mysqldump/xtrabackup 邏輯/物理備份還原路線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved