MySQL 資料庫的資料遷移與結構變更是日常運維的高頻操作。本文系統整理 mysqldump 匯出、mysql 匯入、以及資料庫重命名的三種主流方案,並針對各版本相容性、權限要求、最佳實踐給出建議。
mysql -u用戶名 -p密碼 資料庫名 < sql檔案路徑
範例:
mysql -uroot -p12345678 test < /root/test.sql
--max_allowed_packet=1G 參數mysql -uroot -p12345678
mysql> CREATE DATABASE abc;
mysql> USE abc;
mysql> SOURCE /root/test.sql
SOURCE 指令僅在 MySQL 客戶端互動模式下可用SET NAMES utf8mb4; 確保編碼一致mysqldump -u用戶名 -p密碼 資料庫名 > sql檔案路徑
範例:
mysqldump -uroot -p12345678 abc > /root/abc.sql
mysqldump -uroot -p \
--single-transaction \
--routines \
--triggers \
--events \
--hex-blob \
--master-data=2 \
--databases db_name > backup.sql
| 參數 | 說明 |
|---|---|
--single-transaction | InnoDB 熱備份必備,取得一致性快照不鎖表 |
--routines/triggers/events | 包含存儲過程、觸發器、事件調度器 |
--hex-blob | 二進制欄位以十六進制匯出,避免編碼問題 |
--master-data=2 | 輸出 CHANGE MASTER 註解(從庫建立必備) |
--databases | 輸出 CREATE DATABASE 與 USE 語句,便於重命名匯入 |
# 只匯出結構
mysqldump -uroot -p -d abc > abc_structure.sql
# 只匯出資料
mysqldump -uroot -p -t abc > abc_data.sql
RENAME DATABASE 舊資料庫名 TO 新資料庫名;
限制:
/var/lib/mysql/)風險: 僅適用 MyISAM 引擎;InnoDB 共享表空間模式下會導致資料字典不一致,必須配合 innodb_file_per_table=ON 且無外鍵依賴才可嘗試。
# 1. 匯出(含建庫語句)
mysqldump -uroot -p --databases old_db > old_db.sql
# 2. 修改 SQL 檔案中的資料庫名
sed -i 's/`old_db`/`new_db`/g' old_db.sql
# 3. 匯入新庫
mysql -uroot -p < old_db.sql
# 4. 驗證資料完整性
mysql -uroot -p -e "SELECT COUNT(*) FROM new_db.core_table;"
# 5. 確認無誤後刪除舊庫
mysql -uroot -p -e "DROP DATABASE old_db;"
優勢: 支援所有儲存引擎、跨版本遷移、可同步修改字元集、零風險。
| 問題 | 原因 | 解決方案 |
|---|---|---|
匯入報錯 Unknown collation | 來源與目標 MySQL 版本差異導致排序規則不支援 | 匯出時加 --skip-set-charset,匯入前手動 SET NAMES utf8mb4 |
| 大檔案匯入中斷 | max_allowed_packet 過小或網路超時 | 調大參數、使用 pv 監控進度、分檔案匯入 |
| 匯出耗時過長鎖表 | MyISAM 表或未使用 --single-transaction | 強制使用 InnoDB + 單事務熱備份 |
| 觸發器/存儲過程權限錯誤 | DEFINER 使用者在目標實例不存在 | 匯出加 --skip-definer 或匯入後重建 |
mysqldump --single-transaction --routines --triggers --events --master-data=2mysql < file.sql,大資料量考慮分表並行或 LOAD DATARENAME DATABASE 或直接改目錄,**標準流程:建新庫 → 改 SQL → 匯入 → 驗證 → 刪舊庫**