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服务端拥有文件的读取权限,操作步骤:
- 先开启MySQL服务端的本地文件加载权限:
SET GLOBAL local_infile = 1;
- Python连接MySQL时指定开启本地文件加载参数,以pymysql为例:
import pymysql conn = pymysql.connect( host='你的主机地址', user='用户名', password='密码', database='库名', local_infile=True )
- 加载语句改为:
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
相关产品推荐
相关产品推荐

