mysql ERROR 1148: The used command is not allowed with this MySQL version

 關於MYSQL LOAD DATA LOCAL INFILE 支持問題

1.執行報錯:ERROR 1148 (42000): The used command is not allowed with this MySQL version

解決方法:

先進入MYSQL檢查一下版本號:5.1或者以上的都支持。
mysql> select version()


1.由於MYSQL編譯安裝時默認不允許執行這個命令。

1)安裝時加上 --enable-local-infile 參數就可以了執行了。
./configure --prefix=/usr/local/mysql --enable-local-infile
make
make install


2.可以在執行命中加上--local-infile=1 參數即可解決。
如:/usr/local/mysql/bin/mysql -uroot -h192.168.0.2 -proot databaseName --local-infile=1 -e "LOAD DATA LOCAL INFILE 'data.txt' into table test(name,sex) "

 

 

使用mysql 的時候用到了load data infile 的命令,爲什麼用這個命令和命令怎麼用不解釋,參考手冊已經很詳細了,之說出現的問題。

 

1.被處理的文件需要嚴謹的文件格式。

 

2.路徑問題,注意windows 下\\和linux 下/的區別。

 

3.權限問題,主要針對linux,其實也是程序處理linux文件都要考慮的問題。

 

4.安全問題,重點,我就爲了解決這個問題搞了兩天,網絡上,就把文檔上的東西貼上去完事,說的太模糊而且也不容易懂。

 

 

比如主機A上裝了MYSQL,待處理文件F在A上,在A上用程序處理load data infile 是沒有問題的。事情往往比想象的困難,現在主機B來了,需要用程序把B上的文件用程序處理 load data infile到A中的數據庫中,如果不加任何處理的話是不能成功的,當你運行程序的時候,會給出找不到文件的錯誤提示。你會很奇怪明明文件就在那裏怎麼能 找不到呢?

 

 

且看文檔中的內容。

如果指定了LOCAL,則文件會被客戶主機上的客戶端讀取,並被髮送到服務器。文件會被給予一個完整的路徑
名稱,以指定確切的位置。如果給定的是一個相對的路徑名稱,則此名稱會被理解爲相對於啓動客戶端時所在的目錄。

· 如果LOCAL沒有被指定,則文件必須位於服務器主機上,並且被服務器直接讀取。

當在服務器主機上爲文件定位時,服務器使用以下規則:

· 如果給定了一個絕對的路徑名稱,則服務器使用此路徑名稱。

· 如果給定了帶有一個或多個引導組件的相對路徑名稱,則服務器會搜索相對於服務器數據目錄的文件。

· 如果給定了一個不帶引導組件的文件名稱,則服務器會在默認數據庫的數據庫目錄中尋找文件。

注意,這些規則意味着名爲./myfile.txt的文件會從服務器數據目錄中被讀取,而名爲myfile.txt的同樣的文件會從
默認數據庫的數據庫目錄中讀取。例如,下面的LOAD DATA語句會從db1數據庫目錄中讀取文件data.txt,因爲
db1是當前數據庫。即使語句明確把文件載入到db2數據庫中的表裏,也會從db1目錄中讀取。

mysql> USE db1;
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
注意,使用正斜槓指定Windows路徑名稱,而不是使用反斜槓。如果您使用反斜槓,您必須使用兩個。

出於安全原因,當讀取位於服務器中的文本文件時,文件必須位於數據庫目錄中,或者是全體可讀的。另外,要對服務
器文件使用LOAD DATA INFILE,您必須擁有FILE權限。


上面說的很多,剛開始看不好懂,簡要說明下,就是說如果使用load data infile 命令加載文件的時候,不管你文件在哪裏它只加載裝了mysql 的機器上的本地文件,因此想上面說的 調用B機器上的程序處理load data infile 的命令的時候,A機器接收到這個命令就會從A機器上找這個文件,因此file not found exception 也是理所當然的,對數據來說它就是沒有知道文件嘛。

說了這麼多那怎麼辦呢,當然有辦法

使用local關鍵字,即load data local infile

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