程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysqlloaddata命令解析、處理error29(ErrCode:13)錯誤(在ubuntu環境下)

Mysqlloaddata命令解析、處理error29(ErrCode:13)錯誤(在ubuntu環境下)

編輯:MySQL綜合教程

Mysqlloaddata命令解析、處理error29(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 對於文本中行為是:

一行對應數據庫表中的一條記錄 各個字段之間以tab鍵分開 每個字段的值沒有被任何字符括起來 行沒有前綴可以忽略

比如某一行文本:
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 命令
至此問題應該解決了。不過這可能是個不安全的解決辦法,需要慎重。具體參考第三條鏈接。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved