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 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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章