如何在亚马逊 RDS 上“加载数据文件”?

Posted

技术标签:

【中文标题】如何在亚马逊 RDS 上“加载数据文件”?【英文标题】:how to 'load data infile' on amazon RDS? 【发布时间】:2010-12-11 02:25:24 【问题描述】:

不确定这是否是一个更适合服务器故障的问题,但我最近一直在搞乱亚马逊 RDS,并且无法为我的网络主机 mysql 用户获取“文件”权限。

我假设一个简单的:

grant file on *.* to 'webuser@'%';

会起作用,但它不起作用,而且我似乎也无法对我的“root”用户执行此操作。是什么赋予了?我们使用加载数据的原因是因为它一次执行数千次插入非常快。

有人知道如何解决这个问题,还是我需要找到其他方法?

这个页面,http://docs.amazonwebservices.com/AmazonRDS/latest/DeveloperGuide/index.html?Concepts.DBInstance.html 似乎暗示我需要找到一种不同的方法来解决这个问题。

帮助?

更新 我不是要导入数据库——我只是想使用文件加载选项一次插入几十万行。

经过挖掘,这就是我们所拥有的:

 mysql> grant file on *.* to 'devuser'@'%';
 ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)


 mysql> select User, File_priv, Grant_priv, Super_priv from mysql.user;
 +----------+-----------+------------+------------+
 | User     | File_priv | Grant_priv | Super_priv |
 +----------+-----------+------------+------------+
 | rdsadmin | Y         | Y          | Y          |
 | root     | N         | Y          | N          |
 | devuser  | N         | N          | N          |
 +----------+-----------+------------+------------+

【问题讨论】:

你是怎么解决这个问题的? 【参考方案1】:

您需要使用LOAD DATA LOCAL INFILE,因为该文件不在 MySQL 服务器上,而是在您运行命令的机器上。

根据下面的评论,您可能还需要包含标志:

--local-infile=1

【讨论】:

你还需要在mysql客户端使用--local-infile=1标志,否则你会得到“ERROR 1148 (42000): The used command is not allowed with this MySQL version”跨度> @chrisfinne 我收到 php 警告:PDOStatement::execute(): LOAD DATA LOCAL INFILE disabled in /...Statement.php on line 165 @eyberg 你能“接受”这个答案吗? 如果使用 MySql Workbench,请参阅:***.com/a/59408954/1033684【参考方案2】:

不管它值多少钱...您可以将 LOCAL 操作数添加到 LOAD DATA INFILE 而不是使用mysqlimport 来解决这个问题。

加载数据本地 INFILE ...

这将在不授予 FILE 权限的情况下工作。

【讨论】:

感谢您突出显示 LOCAL,比较我的陈述时错过了它【参考方案3】:

很确定你还不能这样做,因为你没有使用 RDS 的***别的 MySQL 权限。我们只做了一点测试,但导入数据库的最简单方法似乎是从源框中通过管道传输它,例如

mysqldump MYDB | mysql -h rds-amazon-blah.com --user=youruser --pass=thepass

【讨论】:

是的......但我只是想一次加载几百到几千条语句——而不是真正加载数据库 我会用准备好的语句运行它们 - 不会花很长时间 :)【参考方案4】:

也遇到了这个问题,尝试在 Windows 上使用 MySQL Workbench 将 .csv 数据从我的本地机器上传到 AWS RDS 实例。

我需要添加OPT_LOCAL_INFILE=1 到:连接> 高级> 其他。注意大写是必需的。

我通过PeterMag in AWS Developer Forums找到了这个答案。


更多信息:

SHOW VARIABLES LIKE 'local_infile'; 已经返回 ON 查询是:

LOAD DATA LOCAL INFILE 'filepath/file.csv' 
    INTO TABLE `table_name`
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS;

从上面引用的答案来源复制:

显然这是 MYSQL Workbench V8.X 中的一个错误。除了 此线程前面显示的配置,您还需要更改 Workbench中的MYSQL连接如下:

    转到显示所有连接的 MYSQL 的欢迎页面 选择管理服务器连接(小扳手图标) 选择您的连接 选择高级选项卡 在“其他”框中,添加 OPT_LOCAL_INFILE=1

现在我可以在 MYSQL RDS 上使用 LOAD DATA LOCAL INFILE 查询。它似乎 不需要 File_priv 权限。*

【讨论】:

【参考方案5】:

可以通过两种方式将批量数据导入 Amazon MySQL RDS。您可以根据自己的方便选择以下任何一个。

    使用导入实用程序。

    mysqlimport --local --compress  -u <user-name> -p<password> -h <host-address> <database-name> --fields-terminated-by=',' TEST_TABLE.csv
    --Make sure, here the utility will be inserting the data into TEST_TABLE only.
    

    通过管道发送到 mysql 命令的批量插入 SQL。

    mysql -u <user-name> -p<password> -h <host-address> <database-name> < TEST_TABLE_INSERT.SQL
    --Here file TEST_TABLE_INSERT.SQL will have bulk import sql statement like below
    --insert into TEST_TABLE values('1','test1','2017-09-08'),('2','test2','2017-09-08'),('3','test3','2017-09-08'),('3','test3','2017-09-08');
    

【讨论】:

【参考方案6】:

我遇到了类似的问题。我实际上是在尝试导入数据库,但条件应该是相同的 - 由于某些表的大小、不稳定的连接以及对适度恢复功能的需求,我需要使用加载数据。

我同意 chris finne 的观点,即不指定本地选项会导致该错误。经过多次反复试验,我发现来自Maatkit 的 mk-parallel-restore 工具提供了我需要的一些出色的额外功能。它可能非常适合您的用例。

【讨论】:

以上是关于如何在亚马逊 RDS 上“加载数据文件”?的主要内容,如果未能解决你的问题,请参考以下文章

我需要亚马逊的 EC2、Cloudfront、RDS 吗?

如何使用 Elasticbeanstalk 在亚马逊 RDS 中删除表并重新创建?

如何为 AWS RDS 加载数据 infile mysql 工作台?

将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS

在 Amazon RDS 上设置 PostGis

如何通过 SSL 连接到 Amazon RDS?