首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 資料匯入匯出利器:mysqlimport 與批次處理深度實戰

     編輯:MySQL 綜合教學

工具定位:mysqlimport = LOAD DATA INFILE 的命令列封裝

  • 專為**大量文字檔高速載入**設計,繞過 SQL 解析層
  • 支援 CSV/TSV/固定寬度等多種格式
  • 內建平行處理、錯誤跳過、鎖表優化等生產級特性

核心語法與參數全解析

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詳細輸出除錯監控

實戰範例:CSV 匯入訂單表

檔案 `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

參數解析:

  • `--local`:檔案在本機,透過協定傳送至伺服器
  • `--replace`:訂單號唯一鍵衝突時以新檔資料為準(覆蓋更新)
  • `--lock-tables`:匯入期間鎖定 `orders` 表,防止並發查詢髒讀
  • 格式參數精確匹配 CSV RFC 4180 標準

批次模式:SQL 腳本非互動式執行

適用場景:定時任務、部署腳本、版本控管的 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

腳本檔案規範 (`script.sql`)

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

進階:參數化 Shell 腳本產生動態 SQL

#!/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 <

大檔案匯入效能優化清單

  1. ✅ **關閉二進位日誌**(僅會話):`SET SESSION sql_log_bin=0;` 減少 Binlog I/O
  2. ✅ **關閉外鍵檢查**:`SET FOREIGN_KEY_CHECKS=0;` 匯入完成後重開
  3. ✅ **關閉唯一性檢查**:`SET UNIQUE_CHECKS=0;` (確定資料無衝突時)
  4. ✅ **調大 `bulk_insert_buffer_size`**:`SET SESSION bulk_insert_buffer_size=256M;` (MyISAM)
  5. ✅ **InnoDB 調優**:`innodb_flush_log_at_trx_commit=2` `innodb_buffer_pool_size` 足夠大
  6. ✅ **分割大檔**:`split -l 100000 big.csv chunk_` → 平行匯入多 chunk
  7. ✅ **使用 `--local` + 壓縮**:跨網路時 `mysqlimport --compress --local ...`

常見錯誤與解決

錯誤訊息原因解決
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 需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved