为什么LOAD DATA LOCAL INFILE可以在CLI中运行,但不能在应用程序中运行?

时间:2013-04-06 03:09:15

标签: c++ mysql linux

问题:

我的C ++应用程序连接到MySQL服务器,读取每个db export.txt的第一个/标题行,创建一个create table语句来准备导入并对数据库执行(没有问题,表出现正如预期的那样) - 但是当我尝试执行LOAD DATA LOCAL INFILE将数据导入新创建的表时,我收到错误“此MySQL版本不允许使用的命令”。但是,这适用于CLI!当我使用mysql -u <user> -p<password> -e "LOAD DATA LOCAL INFILE 'myfile.txt' INTO TABLE mytable FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n';"在CLI上执行此命令时,它可以正常工作吗?

情况:

我的公司每月从我们的供应商那里获得大量的数据库导出(160个文件/ 10gb的.txt文件,这些文件是'|'分隔的),必须替换旧的供应商列表。我正在研究一个小型C ++应用程序,以便在我的工作桌面上处理它。该应用程序旨在设置所需的表,导入数据,然后针对多个表执行一系列中间查询,以在一系列最终表中汇集信息,然后将其自身导出并上载到生产环境,以供在公司电子商务网站。

我的设置:

Ubuntu 12.04

MySQL Server 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-server,但这是我的本地开发环境,所以我只是希望它永久打开)

2。)如果目标导入文件没有启用执行权限(使用chmod + x target_file.txt修复),LOAD DATA LOCAL INFILE似乎无法执行导入(来自CLI)

3。)我在我的应用程序代码中使用mysql root帐户(因为它是我的本地主机,而不是生产,这个特定的程序永远不会在生产服务器上运行。)

4.。)我尝试使用sudo命令执行我编译的二进制程序(没有更改,同样的错误“此MySQL版本不允许使用的命令”)

5.。)我已经尝试将二进制文件的所有权从我的正常登录更改为root(没有更改,同样的错误“此MySQL版本不允许使用该命令”)

6。)我知道libcppmysqlconn正在工作,因为我能够连接并执行CREATE TABLE调用而没有问题,我可以做其他查询和执行语句

我错过了什么?有什么建议?在此先感谢:)

1 个答案:

答案 0 :(得分:1)

使用/etc/mysql/my.cfg文件进行了大量的努力尝试和错误(我知道这是一个权限问题,因为它适用于命令行,但不是来自连接器)并经过大量的谷歌搜索并找到一些返回胡同技术支持帖我得出结论,MySQL C ++连接器(无论出于何种原因)决定实现开发人员能够允许来自C ++连接器的local-infile = 1选项的能力。

显然有些人已经能够破解/分叉MySQL C ++连接器以公开其功能,但没有人发布他们的源代码 - 只是说它有效。显然,在初始化您将使用它的连接后,MySQL C API中有一个解决方法:

mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 1 );

显然允许LOAD DATA LOCAL INFILE语句与MySQL C API一起使用。

以下是一些引导我得出这个结论的参考文章:

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或黑客/分叉现有的mysql C ++ api来公开连接结构。或者只是坚持从命令行执行LOAD DATA LOCAL INFILE :(