Mysql 5.5 LOAD DATA INFILE 权限

4

错误:该MySQL版本不允许使用所用的命令

我正在尝试将一些mysqlclient C++代码从Mysql 5.1迁移到5.5(使用soci)。C++部分并不是很重要-问题在于编写一些mysqlclient代码,可以成功地在MySQL 5.5上执行LOAD DATA INFILE。

以下是我的笔记(LOAD DATA INFILE失败,但正常查询可以):

  1. 下面的代码在Mysql 5.1,gcc 4.6.1,Oneiric上运行良好

  2. 相同的代码在Mysql 5.5,gcc 4.7.2,Quantal上失败了

  3. 如果我从mysql(命令行客户端)中加载数据,则可以正常工作(我已经使用local-infile = 1更新了my.cnf)

  4. mysql> show variables like '%local_infile%'; 的结果为ON

如果有一个SOCI或配置解决方案,那就太棒了,但如果有人已经成功地使用libmysqlclient使其工作,那也是很好的...


#include <soci.h>
#include <mysql/soci-mysql.h>
#include <string>
#include <iostream>

using soci::use;

using namespace std;
using namespace soci;

main()
{
  string val =
    "mysql://"          +
    "host=127.0.0.1"    +
    " dbname=tmp_db"    +
    " user=root"        +
    " password=open_sasame";

    int sum;

    session sql( val );
    sql  << "SELECT 1+1", into( sum );
    cerr << "RESULT=" << sum << endl;     // works fine

    // NEXT LINE FAILS WITH:
    //   The used command is not allowed with this MySQL version
    sql  << "LOAD DATA LOCAL INFILE '/tmp/junk3.txt' INTO TABLE tmp_db.example_tbl FIELDS TERMINATED BY '|' LINES TERMINATED BY '\\n'";
}
1个回答

3
答案是,我们需要下面这行代码:

mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 0 );

mysql_init()mysql_real_connect()之间插入以下代码。

下面是一段C代码片段供参考。请注意,使用此行代码可以修补SOCI的mysql后端以使其正常工作。

在Mysql 5.5、gcc 4.7.2和Quantal上进行了测试并且可行。

#include <mysql.h>
#include <stdio.h>

main()
{
  MYSQL mysql;

  mysql_init( &mysql );
  mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 0 );
  if ( !mysql_real_connect( &mysql,"127.0.0.1","root","open_sasame","tmp_db",0,NULL,0 ))
  {
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
      mysql_error( &mysql ));
  }

  if ( mysql_query( &mysql, "LOAD DATA LOCAL INFILE '/tmp/junk4.txt' "
    "INTO TABLE tmp_db.example_tbl FIELDS TERMINATED BY '|' "
    "LINES TERMINATED BY '\\n'" ))
  {
    fprintf( stderr, "ERROR DURING LOAD DATA LOCAL INFILE\n" );
  }

  mysql_close( &mysql );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接