当前位置: 代码迷 >> Ruby/Rails >> Mysql load data 命令解析、处理 error 29 (ErrCode: 13) 异常(在ubuntu环境下)
  详细解决方案

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

热度:296   发布时间:2016-04-29 02:11:38.0
Mysql load data 命令解析、处理 error 29 (ErrCode: 13) 错误(在ubuntu环境下)

在 mysql 服务器上,可以通过命令:

load data infile 'file_name' into table table_name; 

将一个文本文件中的所有数据存到指定表中。最粗略形式的例子:

load data infile 'test.txt' into table test_table;

默认情况下,load data infile 对于文本中行为是:

  1. 一行对应数据库表中的一条记录
  2. 各个字段之间以tab键分开
  3. 每个字段的值没有被任何字符括起来
  4. 行没有前缀可以忽略

比如某一行文本:
1 test “xx”
读入数据库之后,第三个字段的值是 “xx”,而不是 xx。当然这些字段都可以设置,完整的 load data infile 命令是:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'   [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 13OS 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/

  相关解决方案