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

Python3使用NamedTemporaryFile生成文件后MySQL LOAD DATA INFILE报权限错误如何解决

解决方案

你遇到的是Linux文件权限控制+MySQL服务端文件读取限制的问题,可按以下任一方案解决:

方案1:修改临时文件权限,给MySQL用户开放读取权限

NamedTemporaryFile默认创建的文件权限是0o600,仅创建者可读可写,你可以在写入完成后修改文件权限为其他用户可读:

import os
f = NamedTemporaryFile(suffix='.csv', delete=False)
s3.download_fileobj(bucket, f"{files_dir}/metadata/{table_name}.csv.gz", f)
f.close()
# 给所有用户加读取权限,权限变为0o644
os.chmod(f.name, 0o644)

修改权限后再执行LOAD DATA INFILE即可正常读取。

方案2:使用LOAD DATA LOCAL INFILE绕过服务端文件读取限制

使用带LOCAL参数的加载语句时,文件由运行Python代码的客户端进程读取后传给MySQL服务端,不需要MySQL服务端拥有文件的读取权限,操作步骤:

  1. 先开启MySQL服务端的本地文件加载权限:
SET GLOBAL local_infile = 1;
  1. Python连接MySQL时指定开启本地文件加载参数,以pymysql为例:
import pymysql
conn = pymysql.connect(
    host='你的主机地址',
    user='用户名',
    password='密码',
    database='库名',
    local_infile=True
)
  1. 加载语句改为:
LOAD DATA LOCAL INFILE '你的临时文件路径' INTO TABLE 表名 -- 其余参数保持不变

方案3:将临时文件生成到MySQL允许读取的目录

MySQL默认会限制服务端仅能读取secure_file_priv参数指定的目录下的文件,你可以先查询该目录路径:

SHOW VARIABLES LIKE 'secure_file_priv';

创建临时文件时指定dir参数为上述查询到的目录路径即可,该目录默认已经给MySQL用户开放了读取权限,不需要额外修改文件权限。

注意:你设置了delete=False,临时文件不会自动删除,处理完数据后建议手动调用os.unlink(f.name)清理文件,避免磁盘空间占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:36:04