遷移全流程概覽
- 源端:phpMyAdmin / `mysqldump` 導出 `.sql`
- 傳輸:SFTP (FileZilla/WinSCP) 上傳至目標主機 `/tmp`
- 目標端:SSH 登入 → MySQL 客戶端 → `SOURCE` 導入
- 驗證:核對表數量、行數、關鍵業務查詢
- 清理:刪除傳輸的 `.sql` 檔案
步驟 1:源端導出(推薦參數)
# 單庫導出(含結構+資料+存儲過程+觸發器+事件)
mysqldump -u root -p --single-transaction --quick --routines --triggers --events \
--default-character-set=utf8mb4 --databases src_db > /tmp/src_db_$(date +%F).sql
# 僅導出特定表
mysqldump -u root -p --single-transaction --quick src_db table1 table2 > /tmp/tables.sql
步驟 2:SFTP 上傳(FileZilla 範例)
- 協議:SFTP(SSH File Transfer Protocol)
- 主機:目標主機公網/內網 IP
- 用戶:root 或有寫入 `/tmp` 權限的用戶
- 遠端目錄:`/tmp`
- 本地檔案:剛導出的 `.sql`
安全提示:生產環境禁用 FTP,僅開放 SSH/SFTP;傳輸後驗證 `md5sum` 一致性。
步驟 3:目標端建庫並導入
# 1. SSH 登入
ssh root@target_host
# 2. 進入 MySQL 建立目標庫(若不存在)
mysql -u root -p
mysql> CREATE DATABASE `dst_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> EXIT;
# 3. 導入(三步合一,避免編碼問題)
mysql -u root -p -D dst_db --default-character-set=utf8mb4 < /tmp/src_db_2023-01-15.sql
# 或交互模式(可見進度)
mysql -u root -p
mysql> USE dst_db;
mysql> SET NAMES utf8mb4;
mysql> SOURCE /tmp/src_db_2023-01-15.sql;
步驟 4:驗證遷移結果
# 表數量對比
mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='dst_db';"
mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='src_db';"
# 核心表行數對比
mysql -u root -p -e "SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='dst_db' ORDER BY TABLE_ROWS DESC LIMIT 10;"
# 關鍵業務查詢抽樣
mysql -u root -p -e "SELECT COUNT(*) FROM dst_db.orders WHERE created_at > '2023-01-01';"
步驟 5:清理現場
rm -f /tmp/src_db_2023-01-15.sql
大檔案導入優化技巧(>1GB)
| 優化點 | 做法 | 效果 |
| 關閉 Binlog(當前會話) | 導入前 `SET SESSION sql_log_bin=0;` | 省去 Binlog 寫入、減少磁碟 I/O、加速 30%+ |
| 關閉外鍵/唯一檢查 | `SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;` 導入後恢復 | 避免逐行檢查、大幅提速 |
| 關閉自動提交 | `SET AUTOCOMMIT=0;` 導入後 `COMMIT;` | 減少 fsync 次數 |
| 調大網絡緩衝 | `SET GLOBAL max_allowed_packet=1073741824;` (1GB) | 防大 SQL 封包斷裂 |
| 並行導入 | 拆分 `.sql` 為多檔,多終端並行 `SOURCE` | 利用多核 CPU、縮短總耗時 |
| 物理備份替代 | `xtrabackup`/`mariabackup` 熱備 + 恢復 | TB 級最快、不影響主庫 |
常見報錯與解決
| 報錯 | 原因 | 解決 |
| ERROR 2006 (HY000): MySQL server has gone away | 導入大 SQL 超過 `max_allowed_packet` 或 `wait_timeout` | 調大 `max_allowed_packet`、`net_read_timeout`、`net_write_timeout` |
| ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes | 單條 INSERT 過大(如巨大 BLOB) | 同上,或拆分大行 |
| ERROR 1062 (23000): Duplicate entry 'x' for key 'PRIMARY' | 目標庫已有資料、主鍵衝突 | `TRUNCATE` 目標表、或 `INSERT IGNORE`/`REPLACE`、或 `--skip-add-drop-table` 導出 |
| ERROR 1213 (40001): Deadlock found when trying to get lock | 並行導入觸發死鎖 | 串行導入、或按主鍵範圍分檔無重疊 |
| 字符集亂碼 | 導出/導入/庫/表/連線字符集不一致 | 全鏈路 `utf8mb4`:`--default-character-set=utf8mb4`、`SET NAMES utf8mb4`、庫表 `CHARSET=utf8mb4` |
總結
Linux 命令行遷移 MySQL 核心口訣:**`mysqldump --single-transaction --quick` 導出 → SFTP 傳輸 → `SET NAMES utf8mb4` + `SOURCE` 導入 → 核對行數/業務查詢 → 清理檔案**。大庫必加「關閉 Binlog/外鍵/自動提交」三件套,TB 級直上 `xtrabackup` 物理備份。將上述流程封裝為參數化 Shell 腳本,納入發布流水線,才是成熟團隊的標準動作。
- 上一篇文章: MySQL 運行狀態監控的兩種核心方法與自動化巡檢腳本
- 下一篇文章: MySQL-MMM 高可用架構部署全攻略:多主同步、虛擬 IP、自動故障轉移
Copyright ©
程式碼之家 All Rights Reserved