2013-04-06 20 views
0

問題:爲什麼LOAD DATA LOCAL INFILE將從CLI工作,但不在應用程序中?

我的C++應用程序連接到MySQL服務器,讀取每個數據庫的第一個/標題行export.txt,創建一個create table語句以準備導入並執行對數據庫的操作(沒問題那麼這個表就像預期的那樣) - 但是當我嘗試執行LOAD DATA LOCAL INFILE將數據導入到新創建的表中時,出現錯誤「使用的命令不允許使用此MySQL版本」。但是,這適用於CLI!當我在CLI上使用mysql -u <user> -p<password> -e "LOAD DATA LOCAL INFILE 'myfile.txt' INTO TABLE mytable FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n';"執行此命令時,它的工作原理完美無瑕?

現狀:

我公司獲得數據庫導出大量(160個文件/的是.txt文件10GB「|」分隔)從我們按月廠商,他們以取代舊的供應商名單。我正在開發一個小巧的C++應用程序,以在我的工作桌面上處理它。該應用程序旨在設置所需的表格,導入數據,然後針對多個表格執行一系列中間查詢,以彙集一系列最終表格中的信息,然後將其自身導出並上載到生產環境中,以便用於公司電子商務網站。

我的設置:

的Ubuntu 12.04

的MySQL v服務器+ 5.5.29 MySQL命令行客戶

Linux的GNU C++編譯器

libmysqlcppconn安裝和我有需要mysqlconn。圖書館鏈接英寸

我已經克服/嘗試以下問題/組合:

1.)我已經發現(困難的方式)必須在配置中啓用LOAD DATA [LOCAL] INFILE語句 - 我在客戶端和客戶端的配置文件中設置了「local-infile」選項服務器。 (通過使用客戶端和服務器的「local-infile」語句更新/etc/mysql/my.cnf來修復。注意:我可以使用--local-infile = 1重新啓動mysql服務器,但這是我的本地開發環境,所以我只是想讓它永久打開)

2.)LOAD DATA LOCAL INFILE似乎無法執行導入(從CLI)如果目標導入文件沒有啓用執行權限(固定與使用chmod + X target_file.txt)

3)我使用的是MySQL的root帳號在我的應用程序代碼(因爲它我的本地主機,不生產這種特殊的程序將永遠不會在生產服務器上運行。)

4.)我試過執行我編譯的二進制程序使用sudo命令(沒有變化,同樣的錯誤「使用的命令不允許與這個MySQL版本」)

5.)我試圖改變二進制文件的所有權從我的正常登錄到根(沒有改變,同樣的錯誤「使用的命令不允許這個MySQL版本」)

6.)我知道libcppmysqlconn工作,因爲我能夠連接和執行CREATE TABLE調用沒有問題,我可以做其他查詢和執行語句

我錯過了什麼?有什麼建議麼?在此先感謝:)

+0

您是否嘗試傳遞文件'myfile.txt'的完整實際路徑?您是否查看MySQL服務器的日誌文件? – 2013-04-06 05:51:02

+0

更重要的是,並且由於在實踐中部署的MySQL服務器運行在不同於MySQL客戶端應用程序的機器上,你不能重寫你的應用程序來發布普通的'INSERT'語句嗎?另外,你確定你沒有對請求的大小數據? – 2013-04-06 05:59:44

+0

@Basile Starynkevitch:其實是的,我確實使用了myfile.txt的完整路徑,但仍然沒有工作......儘管我應該查看MySQL日誌,看看能否找到任何東西。在實踐中說MySQL服務器運行在不同的機器上 - 但是這是Web服務器環境的一項支持任務 - 它不會在生產環境中運行,它只是ru ns在我的本地機器上。是的,我嘗試的第一件事是解析文件並創建插入 - 與LOAD DATA INFILE方法相比,這需要FOREVER。 – hypervisor666 2013-04-06 17:43:48

回答

1

經過與/etc/mysql/my.cfg文件(我知道這是一個權限問題,因爲它在命令行,但不是從連接器)工作和經過大量的搜索和發現一些後面的技術支持帖子後,我得出結論,MySQL C++連接器沒有(無論出於何種原因)決定實現開發人員能夠允許local-infile = 1選項的能力C++連接器。

顯然有些人已經能夠破解/分叉MySQL C++連接器來公開功能,但沒有人張貼他們的源代碼 - 只是說它的工作。顯然有MySQL的C API的解決辦法初始化,將使用該連接後:這顯然允許LOAD DATA LOCAL INFILE語句用MySQL C API工作

mysql_options(&mysql, MYSQL_OPT_LOCAL_INFILE, 1); 

這是導致我這個結論有一定的參考文章:

1)How can I get the native C API connection structure from MySQL Connector/C++?

2)Mysql 5.5 LOAD DATA INFILE Permissions

3)http://osdir.com/ml/db.mysql.c++/2004-04/msg00097.html

從本質上講,如果你想的能力,要使用編程式連接器API的LOAD DATA LOCAL INFILE功能 - 必須使用mysql C API或hack/fork現有的mysql C++ api來公開連接結構。或者只是堅持從命令行執行LOAD DATA LOCAL INFILE :(

+0

請注意,我沒有嘗試重新編譯MySQL C++連接器 - 我只是嘗試在/etc/mysql/my.cfg文件或命令行選項中設置標誌 - 如果您需要有關如何使用重新編譯mysql二進制文件:[遵循此鏈接](http://www.sudo-juice.com/install-mysql-5-5-from-source-ubuntu-linux/) – hypervisor666 2013-04-09 05:35:15

+0

+1用於粘貼3天到問題並解決它。 :) – scones 2013-04-09 05:48:17

+0

@scones謝謝你 - 如果你或其他人想出了一個純粹的C++解決方案mysqlcppconn問題,請讓我知道 - 即使從現在開始的兩年:) – hypervisor666 2013-04-10 19:29:57