一、 mysqlimport:高效的文字檔匯入工具
基本語法
mysqlimport [options] db_name textfile1 [textfile2 ...]
- 文字檔名稱(第一個點號前)對應資料表名,如
Customers.txt → Customers 表。
- 檔案格式必須與表結構完全一致,否則報錯。
常用選項
| 選項 | 功能 |
-d, --delete | 匯入前清空資料表 |
-f, --force | 遇錯繼續執行 |
-i, --ignore | 跳過唯一鍵衝突的行 |
-l, --lock-tables | 匯入前鎖表,防止併發干擾 |
-r, --replace | 唯一鍵衝突時以新資料覆蓋 |
--fields-terminated-by=, | 指定欄位分隔符(預設 Tab) |
--fields-enclosed-by=\" | 指定欄位包裹字元(如雙引號) |
--lines-terminated-by=\n | 指定行結束符 |
範例:匯入 CSV 檔
# 檔案內容:"1","ORD89876","1 Dozen Roses","19991226"
mysqlimport --fields-terminated-by=, --fields-enclosed-by=\" --lock-tables --replace -p Meet_A_Geek Orders.txt
二、 批次模式:從 SQL 檔案匯入
# New_Data.sql 內含 USE、INSERT 等語句,每句以分號結尾
mysql -p < /home/mark/New_Data.sql
- 適合結構與資料同時遷移、版本控管 SQL 檔案。
- 可利用現有資料庫的 General/Update Log 直接作為匯入腳本。
三、 LOAD DATA INFILE:SQL 層面的彈性匯入
優勢
- 可在
mysql 客戶端、應用程式(JDBC、PHP 等)中直接執行。
- 支援
LOCAL 關鍵字:從客戶端本機讀取檔案上傳至遠端 Server,無需 FTP。
- 支援
REPLACE/IGNORE 處理重複鍵。
- 關鍵特性:可指定匯入欄位順序,解決來源檔案欄位與目標表不一致的問題。
語法範例
-- 基本用法
LOAD DATA INFILE '/home/mark/data.sql' INTO TABLE Orders;
-- 本地檔案上傳至遠端
LOAD DATA LOCAL INFILE 'C:/MyDoc/SQL.txt' INTO TABLE Orders;
-- 低優先級、覆蓋重複鍵、指定格式
LOAD DATA LOW_PRIORITY INFILE '/home/mark/Orders.txt' REPLACE
INTO TABLE Orders
FIELDS TERMINATED BY ',' ENCLOSED BY '\"';
-- 指定欄位對應(來源欄位少於目標表)
LOAD DATA INFILE '/home/Order.txt' INTO TABLE Orders
(Order_Number, Order_Date, Customer_ID);
四、 資料匯出方法
1. mysqldump:最通用的邏輯備份工具
# 完整備份單庫
mysqldump --opt db_name > backup.sql
# 僅備份特定表
mysqldump --opt db_name table1 table2 > tables.sql
# 條件導出(WHERE 子句)
mysqldump --opt --where="Order_ID > 2000" db_name Orders > special.sql
# 直接跨主機遷移(管道串流)
mysqldump --opt db_name | mysql --host=remote_host -C db_name
核心優化參數
| 參數 | 效果 |
--opt | 綜合優化(quick、extended-insert、lock-tables 等),最快導出導入 |
--quick | 不緩衝結果集,逐行寫入,防止大表 OOM |
--extended-insert | 多行 INSERT,大幅減小檔案 |
--single-transaction | InnoDB 熱備份必備,無需鎖表 |
--compress | 跨網路傳輸時壓縮 |
--tab=path | 產生 .sql (DDL) + .txt (DATA) 兩檔,適合大量資料並行載入 |
2. SELECT INTO OUTFILE:SQL 導出,支援複雜查詢與報表
SELECT * INTO OUTFILE '/home/mark/Orders.txt'
FIELDS TERMINATED BY ','
FROM Orders
WHERE Order_Date >= '2000-01-01';
- 本質是將
SELECT 結果導向檔案,支援 JOIN、GROUP BY 等複雜邏輯。
- 可結合批次模式產生動態報表:先
INSERT 測試資料,再 SELECT INTO OUTFILE 導出結果。
五、 實戰建議速查表
| 場景 | 推薦工具/語法 | 關鍵參數 |
| 大量 CSV 匯入既有表 | mysqlimport / LOAD DATA | --fields-terminated-by=, --lock-tables --replace |
| 跨版本/異構遷移 | mysqldump --compatible=mysql323 | --default-character-set 雙端一致 |
| 線上熱備份 (InnoDB) | mysqldump --single-transaction --opt | --flush-logs 建立恢復點 |
| 應用程式動態匯出報表 | SELECT INTO OUTFILE | 支援 JOIN、WHERE、欄位指定 |
| 遠端 Server 匯入本地大檔 | LOAD DATA LOCAL INFILE | 無需 FTP,客戶端直傳 |