僅需導出符合特定條件的資料子集(如某時間範圍、某狀態、ID 區間),而非整庫整表。`mysqldump` 預設全量導出,需配合技巧實現精準導出。
-- 1. 建立目標結構表(可先 LIKE 來源表)
CREATE TABLE `export_tmp` LIKE `source_table`;
-- 2. 精準導入符合條件的資料
INSERT INTO `export_tmp`
SELECT `id`, `name`, `email`, `created_at`
FROM `source_table`
WHERE `status` = 1 AND `created_at` > '2023-01-01';
-- 3. 導出中間表
mysqldump -u root -p db_name export_tmp > /tmp/partial_export.sql
-- 4. 清理
DROP TABLE `export_tmp`;
優點:邏輯清晰、可複用中間表做多次導出、支援任意複雜 WHERE。缺點:需額外磁碟空間、兩階段操作。
-- 導出為 CSV(需 FILE 權限、目錄在 secure_file_priv 允許範圍)
SELECT `id`, `name`, `email`, `created_at`
INTO OUTFILE '/var/lib/mysql-files/export_2023.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `source_table`
WHERE `status` = 1 AND `created_at` > '2023-01-01';
LOAD DATA INFILE '/var/lib/mysql-files/export_2023.csv'
INTO TABLE `target_table`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES; -- 若第一行是標題
速度比 INSERT 快 10~20 倍,適合百萬行以上大量導出導入。注意字符集一致、外鍵/觸發器暫關閉(`SET FOREIGN_KEY_CHECKS=0`)。
# 僅導出 id > 2312387 的資料
mysqldump -u root -p db_name source_table \
--where="id > 2312387" > /tmp/partial.sql
# 多條件(注意引號嵌套轉義)
mysqldump -u root -p db_name source_table \
--where="status=1 AND created_at > '2023-01-01'" > /tmp/active.sql
# 導出多張表(同條件)
mysqldump -u root -p db_name table1 table2 \
--where="id > 10000" > /tmp/multi.sql
| 維度 | 中間表 + mysqldump | SELECT INTO OUTFILE | mysqldump --where |
|---|---|---|---|
| 適用資料量 | 中小(<100萬) | 大(>100萬,最高效) | 中小(<500萬) |
| 複雜條件支援 | ✅ 任意 SQL | ✅ 任意 SQL | ⚠️ 僅簡單 WHERE |
| 多表聯合導出 | ✅ 可 JOIN 後導入 | ✅ 可 JOIN 後導出 | ❌ 單表 |
| 檔案格式 | SQL (INSERT) | CSV/TSV (自定義) | SQL (INSERT) |
| 權限要求 | 標準 DML | FILE 權限 + secure_file_priv | 標準 SELECT |
| 導入速度 | 慢(SQL 解析) | 極快(LOAD DATA) | 慢(SQL 解析) |
| 操作複雜度 | 中(3步) | 低(1步) | 最低(1條命令) |
MySQL 部分資料導出三板斧:**中間表法(通用)、OUTFILE 法(高效)、--where 法(便捷)**。根據資料量、條件複雜度、目標格式、權限環境靈活選型。生產環境建議將導出導入流程**腳本化、參數化、監控化**,納入資料治理體系。