萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Ubuntu MySQL LOAD DATA INFILE 高效導入大量資料實戰

常見錯誤與原因

ERROR 29 (HY000): File '/home/user/data.txt' not found (Errcode: 13)

Errcode 13 = Permission denied。MySQL 服務進程(通常以 mysql 用戶運行)無權讀取用戶目錄下的檔案。

標準解決流程

1. 將檔案移至 MySQL 可讀目錄

# 查詢 MySQL 安全目錄
SHOW VARIABLES LIKE 'secure_file_priv';
-- 輸出通常為 /var/lib/mysql-files/ 或 NULL(不限制)

# 移動檔案
sudo cp /home/user/Downloads/data.txt /var/lib/mysql-files/
sudo chown mysql:mysql /var/lib/mysql-files/data.txt
sudo chmod 644 /var/lib/mysql-files/data.txt

2. 使用相對路徑載入

LOAD DATA INFILE 'data.txt' INTO TABLE my_table
  CHARACTER SET gbk
  FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
  LINES TERMINATED BY '\n'
  (col1, col2, col3);
  • CHARACTER SET gbk:指定來源檔案編碼,MySQL 會自動轉換至表字符集
  • FIELDS/LINES:精確匹配檔案格式
  • 欄位列表:僅導入指定欄位,適應表結構多欄位情況

大數據量導入加速技巧(測試 2.5GB / 942 萬行)

Session 級參數調優

SET SESSION bulk_insert_buffer_size = 256M;
SET SESSION myisam_sort_buffer_size = 256M;

Global 級 + 禁用索引(MyISAM 專用)

SET GLOBAL key_buffer_size = 256M;
ALTER TABLE my_table DISABLE KEYS;
LOAD DATA INFILE ...;
ALTER TABLE my_table ENABLE KEYS;

實測效果:從 10 分鐘降至 3 分 55 秒。

InnoDB 表優化建議

  • SET SESSION innodb_flush_log_at_trx_commit = 2;(匯入期間暫犧牲持久性換速度)
  • SET SESSION unique_checks=0; SET SESSION foreign_key_checks=0;
  • 按主鍵順序排序來源檔案,減少頁分裂
  • 分批提交:每 10 萬行 COMMIT 一次(需腳本控制)

跨編碼導入範例

-- 來源 GBK,目標表 utf8mb4
LOAD DATA INFILE 'data.txt' INTO TABLE target_table
  CHARACTER SET gbk
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'
  IGNORE 1 LINES  -- 跳過標題行
  (col1, col2, col3);

權限要求

  • 執行用戶需 FILE 權限:GRANT FILE ON *.* TO 'user'@'host';
  • secure_file_priv 限制目錄時,檔案必須置於該目錄
  • 若無 FILE 權限,改用 LOAD DATA LOCAL INFILE(客戶端讀檔傳輸),需客戶端與伺服器均啟用 local_infile=1
copyright © 萬盛學電腦網 all rights reserved