SQL 文件導入是遷移、恢復、初始化的高頻動作。本文匯總 source、管道重定向、編碼控制、遠程導入、大文件優化等全場景實戰技巧,避開亂碼、卡頓、權限不足等常見坑。
# 本地 Socket (最快)
mysql -u root -p -S /var/lib/mysql/mysql.sock
# 遠程 TCP
mysql -h 10.0.1.50 -u root -p -P 3306
# 指定默認庫 (可省略 USE db)
mysql -u root -p db_name
mysql> USE target_db;
mysql> SET NAMES utf8mb4; -- 關鍵:設置連接字符集,防亂碼
mysql> SOURCE /full/path/dump.sql;
Ctrl+C 中斷,但已執行部分不可回滾 (除非文件含事務)。# 基礎
mysql -u root -p db_name < dump.sql
# 遠程導入 (壓縮傳輸)
mysql -h 10.0.1.50 -u root -p --compress db_name < dump.sql
# 顯式指定字符集 (防亂碼核心)
mysql -u root -p --default-character-set=utf8mb4 db_name < dump.sql
SET CHARACTER SET utf8,必須用 SET NAMES utf8mb4 或 --default-character-set。SOURCE 不可用,但可在 SQL 文件頭部加 SET NAMES utf8mb4;。# Linux
cd /usr/local/mysql/bin
./mysql -u root -p db_name < /backup/dump.sql
# Windows (進入 bin 目錄)
mysql -u root -p db_name < D:\backup\dump.sql
SET AUTOCOMMIT=0; ... COMMIT;。SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0; 導入後恢復。innodb_buffer_pool_size、innodb_log_file_size。split -l 100000 dump.sql part_ 拆分,分批導入,便於斷點續傳。pv dump.sql | mysql -u root -p db_name。| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| 中文亂碼 | 連接字符集非 utf8mb4 | 導入前 SET NAMES utf8mb4 或 --default-character-set=utf8mb4 |
| ERROR 2006 (MySQL server has gone away) | 包過大 / 超時 | 增大 max_allowed_packet (如 256M)、wait_timeout |
| Access denied | 權限不足 | 授予 CREATE, DROP, INDEX, ALTER, INSERT, UPDATE, DELETE, SELECT, LOCK TABLES |
| Unknown database | 目標庫不存在 | 先 CREATE DATABASE db_name CHARSET utf8mb4; |
| 文件讀取權限拒絕 | mysqld 用戶無讀權限 | chmod 644 dump.sql 或放入 mysqld 可讀目錄 |
# 應用服推送 (推薦,避免數據經由跳板機)
pv dump.sql | ssh db_server "mysql -u root -p --default-character-set=utf8mb4 db_name"
# 或 db_server 拉取 (需應用服開 rsync/HTTP)
mysql -h app_server -u root -p --default-character-set=utf8mb4 db_name < /remote/path/dump.sql
導入三板斧:1. 字符集對齊 (utf8mb4) 2. 選對方式 (source 交互 / 管道腳本 / 遠程 SSH) 3. 大文件優化 (關檢查、分片、進度條)。將導入命令封裝為標準化腳本 (參數化 DB/路徑/編碼),納入發布/遷移流水線,實現「零手工、可審計、可重試」。