如何通过多文件导入批量更新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
相关产品推荐
相关产品推荐

