Debian Stretch环境下MySQL 5.7 LOAD_FILE返回NULL插入报错问题求助
MySQL 5.7(Debian Stretch环境)LOAD_FILE返回NULL排查步骤
- 验证文件系统权限
LOAD_FILE要求MySQL运行用户(默认是mysql)对目标文件有可读权限,同时对文件所在父目录有执行权限。
先确认MySQL运行用户:
再模拟MySQL用户读取目标文件验证权限:ps aux | grep mysqld | grep -v grep
如果执行报错Permission denied,修改文件权限即可:sudo -u mysql cat /tmp/advantagesSocial.pdf > /dev/nullchmod o+r /tmp/advantagesSocial.pdf chmod o+x /tmp - 检查
secure_file_priv系统参数
这是MySQL 5.7版本中LOAD_FILE异常的最常见诱因,MySQL默认通过该参数限制LOAD_FILE的可读取目录,执行以下SQL查看配置:SHOW VARIABLES LIKE 'secure_file_priv';- 如果返回值为
NULL:说明系统完全禁用了LOAD_FILE功能 - 如果返回值为指定目录(如
/var/lib/mysql-files/):说明仅允许读取该目录下的文件,可将目标文件移入该目录,或修改配置
修改方式:编辑/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段落添加配置:
改完重启MySQL服务生效:# 允许读取/tmp目录下的文件,留空则表示不限制目录(生产环境不建议) secure_file_priv = /tmpsystemctl restart mysql - 如果返回值为
- 检查
max_allowed_packet大小限制
LOAD_FILE读取的文件大小不能超过该参数的配置值,执行以下SQL查看:
如果返回值小于目标文件的大小,修改SHOW VARIABLES LIKE 'max_allowed_packet';/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段落添加配置:
改完重启MySQL服务生效。# 按实际文件大小调整,最大支持1G max_allowed_packet = 64M - 排查AppArmor访问限制
Debian Stretch默认开启AppArmor,会限制MySQL进程的文件访问路径,可临时关闭MySQL的AppArmor规则验证:
如果此时LOAD_FILE能正常返回内容,说明是AppArmor拦截,可编辑aa-complain /usr/sbin/mysqld/etc/apparmor.d/usr.sbin.mysqld,添加读取规则:
重载AppArmor规则生效:/tmp/* r,systemctl reload apparmor - 验证文件本身有效性
确认文件路径为绝对路径、文件名大小写完全匹配(Debian文件系统大小写敏感),文件未损坏、未被其他进程独占锁定。
内容的提问来源于stack exchange,提问作者ModernArt
相关产品推荐
相关产品推荐

