對比 mysqldump 邏輯備份,SELECT ... INTO OUTFILE + LOAD DATA INFILE 以文本流方式直接讀寫存儲引擎,速度提升 5-10 倍,適合大批量數據遷移、ETL 落地、分區表數據搬遷。
SELECT [字段列表]
FROM 表名
INTO OUTFILE '文件路徑'
[CHARACTER SET charset]
[FIELDS TERMINATED BY '\t'
[[OPTIONALLY] ENCLOSED BY '"']
ESCAPED BY '\\']
[LINES TERMINATED BY '\n'];
-- 1. 全表導出,默認分隔符 \t,換行 \n
SELECT * FROM phpernote INTO OUTFILE '/tmp/phpernote.txt';
-- 2. 指定字段、CSV 格式 (Excel 友好)
SELECT id, name, email, created_at
FROM users
INTO OUTFILE '/tmp/users.csv'
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\r\n';
-- 3. 條件導出
SELECT * FROM orders
WHERE created_at >= '2024-01-01'
INTO OUTFILE '/tmp/orders_2024.txt';
FILE 權限 (極高危,僅 DBA/ETL 賬號持有)。secure_file_priv 目錄下 (MySQL 5.6+ 默認限制),SHOW VARIABLES LIKE 'secure_file_priv'; 查看。File already exists。mysql,應用層需注意讀取權限。
LOAD DATA [LOCAL] INFILE '文件路徑'
[REPLACE | IGNORE]
INTO TABLE 表名
[CHARACTER SET charset]
[FIELDS TERMINATED BY '\t'
[[OPTIONALLY] ENCLOSED BY '"']
ESCAPED BY '\\']
[LINES TERMINATED BY '\n']
[IGNORE number LINES]
[(字段列表)]
[SET col_name = expr, ...];
-- 1. 全字段導入 (文件列順序 = 表結構順序)
LOAD DATA INFILE '/tmp/phpernote.txt' INTO TABLE phpernote;
-- 2. 指定字段映射 (文件列順序 ≠ 表結構)
LOAD DATA INFILE '/tmp/users.csv'
INTO TABLE users
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES -- 跳過 CSV 標題行
(id, name, email, @created_str)
SET created_at = STR_TO_DATE(@created_str, '%Y-%m-%d %H:%i:%s');
-- 3. 本地文件導入 (客戶端讀取文件發送給服務端,無需 FILE 權限)
LOAD DATA LOCAL INFILE 'C:/data/users.csv' INTO TABLE users ...;
| 參數 | 作用 |
|---|---|
REPLACE | 主鍵/唯一鍵衝突時,新行替換舊行 |
IGNORE | 衝突時跳過新行,保留舊行 |
IGNORE n LINES | 跳過文件前 n 行 (如 CSV 標題) |
SET | 導入時衍生列值 (類型轉換、函數計算、默認值) |
LOCAL | 客戶端讀取文件,適用於應用服務器與 DB 分離場景 |
SET FOREIGN_KEY_CHECKS=0;
SET UNIQUE_CHECKS=0;
ALTER TABLE tbl DISABLE KEYS; -- 僅 MyISAM 有效,InnoDB 無此語法
SET GLOBAL bulk_insert_buffer_size = 256*1024*1024; -- 256MB
LOAD DATA。LOAD DATA 即一個事務,超大文件建議拆分 split -l 100000 避免長事務膨脹 Undo Log。CHARACTER SET 參數、表字符集三者統一,防止亂碼。| 維度 | mysqldump | SELECT/LOAD DATA |
|---|---|---|
| 速度 | 慢 (SQL 解析、索引維護、事務開銷) | 極快 (直接頁寫入、批量提交) |
| 輸出格式 | SQL 腳本 | 純文本 (CSV/TSV/自定義) |
| 跨版本遷移 | 優 (兼容性強) | 需注意類型/字符集兼容 |
| 權限要求 | SELECT/LOCK TABLES | FILE (高危) / LOCAL (安全) |
| 適用場景 | 備份、小表遷移、跨版本 | 大表遷移、數據倉庫入庫、分區維護 |
掌握 SELECT INTO OUTFILE / LOAD DATA INFILE 參數微調,是 MySQL 大數據量搬遷的核心技能。