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

Linux 環境下命令行導入 SQL 檔遷移 MySQL 資料庫完整實戰

     編輯:MySQL 資料庫相關知識

遷移全流程概覽

  1. 源端:phpMyAdmin / `mysqldump` 導出 `.sql`
  2. 傳輸:SFTP (FileZilla/WinSCP) 上傳至目標主機 `/tmp`
  3. 目標端:SSH 登入 → MySQL 客戶端 → `SOURCE` 導入
  4. 驗證:核對表數量、行數、關鍵業務查詢
  5. 清理:刪除傳輸的 `.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 級最快、不影響主庫

總結

Linux 命令行遷移 MySQL 核心口訣:**`mysqldump --single-transaction --quick` 導出 → SFTP 傳輸 → `SET NAMES utf8mb4` + `SOURCE` 導入 → 核對行數/業務查詢 → 清理檔案**。大庫必加「關閉 Binlog/外鍵/自動提交」三件套,TB 級直上 `xtrabackup` 物理備份。將上述流程封裝為參數化 Shell 腳本,納入發布流水線,才是成熟團隊的標準動作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
報錯原因解決
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`