当前位置:Gxlcms > 数据库问题 > Mysql load data 命令解析、处理 error 29 (ErrCode: 13) 错误(在ubuntu环境下)

Mysql load data 命令解析、处理 error 29 (ErrCode: 13) 错误(在ubuntu环境下)

时间:2021-07-01 10:21:17 帮助过:50人阅读

[REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY ‘string‘] [[OPTIONALLY] ENCLOSED BY ‘char‘] [ESCAPED BY ‘char‘ ] ] [LINES [STARTING BY ‘string‘] [TERMINATED BY ‘string‘] ] [IGNORE number LINES] [(col_name_or_user_var,...)] [SET col_name = expr,...]]

ignore 和 replace 用于区别当读入文本和原有表格中主键冲突的记录时候的处理方式。
fields 之后的 terminated by 设置字段终结符(分隔符),enclosed by 设置外括字符,escape by 设置转义字符(这一点不是很确定)。
lines 之后的 starting by 设置行前缀,读入时候忽略掉, terminated by 设置换行符。更多细节参考第一条链接。

然后在使用过程中,很容易出现错误:
ERROR 29 (HY000): File ‘test.txt’ not found (Errcode: 13)
网上有很多说在命令中加local关键字,可惜在我的电脑上。。。然并卵。。。在命令行下可以知道errcode 13指的是访问权限问题:
xyb@xyb-computer:~$ perror 13
OS error code 13: Permission denied

就算改变了test.txt文件的访问权限,例如 chmod o+r test.txt 依然会出现上述问题。要解决这个问题会扯到 AppArmor。这是一个保护机制,限制每个程序对特定目录和文件的访问权限。也即是说,当前 mysql 程序访问这个文件的权限被 AppArmor 限制住了。关于 AppArmor 参考第二条链接(维基百科)。
真正可以做的是给mysql程序读取这个文件的权限,按照以下几个步骤可以做到:
1)打开 /etc/apparmor.d/usr.sbin.mysqld 文件
2)此时能看到很多关于mysql能够读写为目录和文件的记录,比如:

#Other contents
/usr/sbin/mysqld {
    #Other contents
    /var/log/mysql.log rw,
    /var/log/mysql.err rw,

    #Other contents

    #This will be your dir definition
    /tmp/ r,
    /tmp/* rw,

    #Other contents
}

在最后加上需要读写的文件的相应权限,保存并退出。
3)重新导入 AppArmor 配置,利用 /etc/init.d/apparmor reload 命令
4)重新启动 mysql,利用 service mysql restart 命令
至此问题应该解决了。不过这可能是个不安全的解决办法,需要慎重。具体参考第三条链接。

参考链接:
http://www.2cto.com/database/201108/99655.html
https://en.wikipedia.org/wiki/AppArmor
https://oldwildissue.wordpress.com/2013/12/11/fixing-mysql-error-29-errcode-13-in-ubuntu/

Mysql load data 命令解析、处理 error 29 (ErrCode: 13) 错误(在ubuntu环境下)

标签:mysql   load-data   error-29   

人气教程排行