mysqlimport [options] db_name textfile1 [textfile2 ...]
表名推導規則:檔名第一個 `.` 前的字串 → 表名。例:`customers.txt` → `customers` 表;`cus.tom.ers.txt` → `cus` 表
| 參數 | 短參 | 功能 | 典型值/說明 |
|---|---|---|---|
| --delete | -d | 匯入前清空表 | 全量刷新場景 |
| --force | -f | 忽略錯誤繼續 | 髒資料容錯 |
| --ignore | -i | 跳過主鍵/唯一鍵衝突行 | 保留舊資料 |
| --replace | -r | 替換主鍵/唯一鍵衝突行 | 以新資料為準 |
| --lock-tables | -l | 匯入期間鎖表 | 一致性保障,**生產建議開啟** |
| --fields-terminated-by | - | 欄位分隔符 | `\t`(預設)、`、`、`|` |
| --fields-enclosed-by | - | 欄位包圍字元 | `"`、`'`、空(預設) |
| --fields-escaped-by | - | 跳脫字元 | `\`(預設) |
| --lines-terminated-by | - | 行結束符 | `\n`(Unix)、`\r\n`(Win)、`\r`(Mac) |
| --columns | - | 指定匯入欄位順序/子集 | `col1,col3,col2` |
| --local | -L | 從客戶端讀取檔案 | 檔案在應用端而非伺服器 |
| --compress | -C | 壓縮傳輸 | 跨網路匯入 |
| --verbose | -v | 詳細輸出 | 除錯監控 |
檔案 `orders.csv` 內容:
"1","ORD89876","1 Dozen Roses","1999-12-26" "2","ORD89877","2 Dozen Tulips","1999-12-27"
執行指令:
mysqlimport --local --replace --lock-tables \ --fields-terminated-by=, --fields-enclosed-by='"' \ --lines-terminated-by='\r\n' \ -u root -p meet_a_geek orders.csv
參數解析:
適用場景:定時任務、部署腳本、版本控管的 Schema 變更
# 直接導向標準輸入 mysql -u root -p db_name < script.sql # 管道串流 cat script.sql | mysql -u root -p db_name # 多腳本序列執行 for f in /deploy/scripts/*.sql; do mysql -u root -p db_name < "$f"; done
USE meet_a_geek; INSERT INTO customers (customer_id, last_name) VALUES (NULL, 'Block'); INSERT INTO customers (customer_id, last_name) VALUES (NULL, 'Newton'); -- 註解支援 /* 多行註解 */ SELECT 'Deployment completed' AS status;
關鍵要求:每句以 `;` 結尾、編碼為 UTF-8、無 BOM
#!/bin/bash
# import_orders.sh
# 例:./import_orders.sh 2024-01-15 orders_20240115.csv
DATE=$1
FILE=$2
DB="meet_a_geek"
# 1. 驗證檔案存在
[ -f "$FILE" ] || { echo "File not found: $FILE"; exit 1; }
# 2. 建立暫存表隔離匯入風險
mysql -u root -p"$DB_PASS" $DB <
| 錯誤訊息 | 原因 | 解決 |
|---|---|---|
| File not found / Access denied | 伺服器端找不到檔案/權限不足 | 加 `--local` 從客戶端讀取;或確認 `secure_file_priv` 目錄 |
| Incorrect integer value: '' for column 'id' | 空字串匯入整數欄位 | CSV 空值用 `\N` 或 `--fields-escaped-by` 處理;或預處理檔案 |
| Duplicate entry 'X' for key 'PRIMARY' | 主鍵衝突 | 用 `--replace` 覆蓋或 `--ignore` 跳過 |
| Data truncated for column 'col' | 資料超出欄位長度/精度 | 檢查欄位定義、預處理截斷/四捨五入 |
| LOAD DATA INFILE failed: errno 13 | 作業系統權限拒絕 | 確認 MySQL 進程使用者對檔案/目錄有讀取權限 |
`mysqlimport` 配合 `LOAD DATA` 參數微調,是 MySQL 生態中**最高效、最穩定**的大量資料載入方案。批次模式則將 SQL 腳本納入版本控管與 CI/CD 流程。掌握「格式精確匹配、參數精準控制、交易原子化切換、效能參數調優」四大核心,即可應對 TB 級資料遷移與日常 ETL 需求。