如何在亚马逊 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 上“加载数据文件”?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Elasticbeanstalk 在亚马逊 RDS 中删除表并重新创建?
如何为 AWS RDS 加载数据 infile mysql 工作台?