You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过多文件导入批量更新MySQL表?

解决MySQL批量导入多个CSV文件的方案

我之前刚好处理过类似的批量CSV导入场景,MySQL原生确实没有遍历目录自动加载所有CSV的功能,不过我们可以借助外部脚本或者工具来实现,给你几个实用的方案:

1. Shell脚本(Linux/Unix环境首选)

如果你的服务器是Linux或Unix系统,写个简单的Shell脚本就能搞定遍历和批量导入,逻辑清晰且轻量:

#!/bin/bash

# 配置你的数据库和文件路径
DB_USER="your_db_user"
DB_PASS="your_db_password"
DB_NAME="target_database"
TABLE_NAME="your_target_table"
CSV_DIR="/opt/csv_files"
# 可选:创建归档目录,避免重复导入
ARCHIVE_DIR="$CSV_DIR/archived"
mkdir -p "$ARCHIVE_DIR"

# 遍历目录下所有.csv文件
for csv_file in "$CSV_DIR"/*.csv; do
    # 跳过目录下没有CSV的情况
    [ -f "$csv_file" ] || continue

    echo "开始导入文件: $(basename $csv_file)"
    # 执行LOAD DATA INFILE命令
    mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" << EOF
LOAD DATA INFILE '$csv_file'
INTO TABLE $TABLE_NAME
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS; -- 如果CSV有表头就保留这行,没有则删除
EOF

    # 检查导入结果
    if [ $? -eq 0 ]; then
        echo "$(basename $csv_file) 导入成功,已归档"
        mv "$csv_file" "$ARCHIVE_DIR/"
    else
        echo "$(basename $csv_file) 导入失败,请检查文件格式或数据库配置"
    fi
done

使用步骤:

  • 把脚本保存为batch_load_csv.sh,执行chmod +x batch_load_csv.sh赋予执行权限
  • 用crontab -e添加定时任务,比如每周一、三、五凌晨1点执行:
    0 1 * * 1,3,5 /opt/scripts/batch_load_csv.sh
    

2. Python脚本(跨平台,更灵活)

如果需要跨Windows/Linux运行,或者要做更复杂的逻辑(比如过滤特定命名的CSV、数据预处理),Python是更好的选择:

import os
import pymysql

# 配置参数
DB_SETTINGS = {
    "user": "your_db_user",
    "password": "your_db_password",
    "database": "target_database",
    "host": "localhost"
}
TARGET_TABLE = "your_target_table"
CSV_FOLDER = "C:/csv_files"  # Windows路径示例,Linux写绝对路径即可
ARCHIVE_FOLDER = os.path.join(CSV_FOLDER, "archived")
os.makedirs(ARCHIVE_FOLDER, exist_ok=True)

# 连接数据库
try:
    conn = pymysql.connect(**DB_SETTINGS)
    cursor = conn.cursor()
    print("数据库连接成功")
except Exception as e:
    print(f"数据库连接失败: {str(e)}")
    exit(1)

# 遍历并处理CSV文件
for file_name in os.listdir(CSV_FOLDER):
    if file_name.lower().endswith(".csv"):
        file_path = os.path.join(CSV_FOLDER, file_name)
        print(f"正在处理文件: {file_name}")

        # 构造LOAD DATA语句
        load_query = f"""
        LOAD DATA INFILE '{file_path}'
        INTO TABLE {TARGET_TABLE}
        FIELDS TERMINATED BY ',' 
        ENCLOSED BY '"'
        LINES TERMINATED BY '\\n'
        IGNORE 1 ROWS;
        """

        try:
            cursor.execute(load_query)
            conn.commit()
            print(f"{file_name} 导入成功")
            # 移动到归档目录
            os.rename(file_path, os.path.join(ARCHIVE_FOLDER, file_name))
        except Exception as e:
            conn.rollback()
            print(f"{file_name} 导入失败: {str(e)}")

# 清理资源
cursor.close()
conn.close()
print("批量导入任务完成")

使用步骤:

  • 先安装依赖:pip install pymysql
  • Windows下可以用「任务计划程序」创建定时任务,指定Python解释器运行这个脚本;Linux下同样用crontab定时执行

3. ETL工具(企业级复杂场景)

如果以后业务量持续增长,需要数据校验、失败重试、监控告警等更复杂的功能,推荐用专业的ETL工具,比如:

  • Apache Airflow:可以编排复杂的数据流任务,支持遍历文件、批量导入、任务依赖和监控
  • DataX:阿里开源的异构数据源同步工具,配置简单,支持CSV到MySQL的批量同步

关键注意事项

  • 检查MySQL的secure_file_priv参数:执行SHOW VARIABLES LIKE 'secure_file_priv';查看,如果该参数设置了特定目录,你的CSV文件必须放在这个目录下才能被LOAD DATA读取;如果需要取消限制,可以修改my.cnf(Linux)或my.ini(Windows),设置secure_file_priv = ""后重启MySQL
  • 导入前验证CSV格式:确保分隔符、字段包围符和行终止符和脚本中的配置一致,避免因格式错误导致导入失败
  • 避开业务高峰期执行定时任务:避免批量导入占用过多数据库资源,影响线上业务

内容的提问来源于stack exchange,提问作者File

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:22:54