问题:
我的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调用而没有问题,我可以做其他查询和执行语句
我错过了什么?有什么建议?在此先感谢:)
答案 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 :(