MySQL 8.0.27使用LOAD DATA INFILE与mysqlimport导入数据报错求助
MySQL 8.0 数据导入报错解决方案
问题1:LOAD DATA INFILE 报错 ERROR 29 (HY000) 权限拒绝
即使文件权限设为777依然报错,由两个默认安全配置导致,对应解决方法如下:
- 检查
secure_file_priv参数限制
MySQL 8.0默认通过该参数限制LOAD DATA操作仅能读取指定目录的文件,执行以下命令查看配置:SHOW VARIABLES LIKE 'secure_file_priv';- 如果返回值为指定目录(默认为
/var/lib/mysql-files/):将people.txt移动到该目录下,再执行导入命令即可 - 如果需要自定义允许目录:修改MySQL配置文件
my.cnf,在[mysqld]段下添加secure_file_priv = /tmp,保存后重启MySQL服务生效
- 如果返回值为指定目录(默认为
- 关闭SELinux限制或添加权限
服务器开启SELinux的情况下,会拦截MySQL对非授权目录的访问请求,可通过两种方式解决:- 临时关闭SELinux测试:执行
setenforce 0后重试导入,确认是该问题后可选择永久配置权限 - 给目标文件添加MySQL可读的SELinux上下文:
chcon -t mysqld_db_t /tmp/people.txt
- 临时关闭SELinux测试:执行
快捷规避方案:使用客户端本地导入模式,绕过服务端目录限制
- 先开启服务端本地导入权限:
SET GLOBAL local_infile = 1;
- 退出MySQL后,用
--local-infile=1参数重新连接:
mysql -u your_username -p --local-infile=1 soverflow
- 执行本地导入命令,同时指定字段分隔符适配你的txt文件格式:
LOAD DATA LOCAL INFILE '/tmp/people.txt' INTO TABLE people FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
问题2:mysqlimport 报错找不到文件
报错原因是不加--local参数时,mysqlimport默认会从服务端的数据库存储目录(默认/var/lib/mysql/你的库名/)下查找文件,所以会尝试读取/var/lib/mysql/soverflow/people.txt导致找不到文件。
解决方法:执行命令时添加--local参数,指定从客户端路径读取文件:
mysqlimport --local soverflow /tmp/people.txt -u your_username -p
如果要使用服务端读取模式,将people.txt移动到/var/lib/mysql/soverflow/目录下,同时将文件所有者改为mysql用户即可。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

