異構作業系統間遷移 MySQL 數據,核心挑戰在於文件路徑大小寫、字符集一致性、大數據量傳輸效率。本文提供標準化遷移流程與優化技巧。
SHOW VARIABLES LIKE 'character_set%',目標庫建庫時顯式指定 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci。# 單庫導出(含建庫語句、事件、觸發器、主從位置) mysqldump -h 127.0.0.1 -u root -p --databases mydb \ --events --routines --triggers --master-data=2 \ --single-transaction --quick --hex-blob \ --default-character-set=utf8mb4 > mydb_$(date +%F).sql # 壓縮傳輸(大文件建議) gzip mydb_2024-01-15.sql
# 方式一:scp(內網) scp mydb_2024-01-15.sql.gz user@linux-host:/data/backup/ # 方式二:rsync(斷點續傳、增量同步) rsync -avzP mydb_2024-01-15.sql.gz user@linux-host:/data/backup/
# 登錄 Linux MySQL mysql -u root -p -- 創建同名數據庫(字符集顯式指定) CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 檢查字符集 SHOW CREATE DATABASE mydb;
# 解壓並導入(建議開啟事務批量提交加速) gunzip -c mydb_2024-01-15.sql.gz | mysql -u root -p mydb # 或分步 gunzip mydb_2024-01-15.sql.gz mysql -u root -p mydb < mydb_2024-01-15.sql
# 表數量 SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb'; # 行數抽樣 SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb'; # 關鍵表 checksum 對比 CHECKSUM TABLE mydb.core_table;
| 痛點 | 優化手段 |
|---|---|
| 單線程導入慢 | 使用 mydumper/myloader 多線程並行導出導入(表級並發) |
| 網絡帶寬瓶頸 | 源端壓縮 gzip -1,或使用 xtrabackup 物理備份 + rsync 增量同步 |
| 導入過程中斷需斷點續傳 | myloader 支援斷點續傳;或分表導出分批導入 |
| 主從同步延遲 | 遷移期間源庫停寫,或使用雙寫工具(如 Canal+Kafka)同步增量 |
# 1. 源庫加鎖刷盤 FLUSH TABLES WITH READ LOCK; # 2. 複製 datadir(含 ibdata1、ib_logfile、.ibd 文件) # 3. 解鎖 UNLOCK TABLES; # 4. 目標端停服務,覆蓋 datadir,修正擁有者 chown -R mysql:mysql /var/lib/mysql # 5. 啟動,執行 mysql_upgrade(跨小版本)
風險:文件級複製極易因頁損壞、版本不匹配導致不可用,非專家團隊不建議。