在 mysql 服務器上,可以通過 load data infile ‘file_name’ into table table_name; 命令將一個文本文件中的所有數據存到指定表中。最粗略形式的例子:
load data infile ‘test.txt’ into table test_table;
默認情況下,load data infile 對於文本中行為是:
比如某一行文本:
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 命令
至此問題應該解決了。不過這可能是個不安全的解決辦法,需要慎重。具體參考第三條鏈接。