2009-10-29 23 views
28

Je ne sais pas si c'est une question mieux adaptée pour serverfault mais j'ai été en train de jouer avec amazon RDS ces derniers temps et j'avais du mal à obtenir les privilèges 'file' pour mon utilisateur web mysql.comment «charger des données infile» sur amazon RDS?

je suppose qu'une simple:

grant file on *.* to '[email protected]'%'; 

fonctionnerait, mais il ne le fait pas et je ne peux pas sembler le faire aussi bien avec mon utilisateur « root ». Ce qui donne? La raison pour laquelle nous utilisons des données de chargement est parce qu'il est super super rapide pour faire des milliers d'inserts à la fois.

quelqu'un sait comment y remédier ou dois-je trouver une autre façon?

Cette page, http://docs.amazonwebservices.com/AmazonRDS/latest/DeveloperGuide/index.html?Concepts.DBInstance.html semble suggérer que je dois trouver un autre moyen de contourner cela.

Aide?

MISE À JOUR Je ne cherche pas à importer une base de données - Je veux juste utiliser l'option de chargement de fichier à insérer plusieurs centaines de milliers de lignes à la fois.

après avoir creusé autour c'est ce que nous avons:

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   | 
+----------+-----------+------------+------------+ 

Répondre

5

Jolie que vous ne pouvez pas le faire encore, comme vous n'avez pas le plus haut niveau de privilèges de MySQL avec RDS. Nous avons seulement fait un peu de test, mais le moyen le plus simple d'importer une base de données semble être de l'extraire de la boîte source, par ex.

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

Yeh ... mais je suis juste essayer de charger deux cents à mille ou deux déclarations à la fois - pas vraiment charger un db – eyberg

+0

je les cours avec une déclaration préparée puis - ça ne prendra pas longtemps :) –

79

Vous devez utiliser LOAD DATA LOCAL INFILE que le fichier est pas sur le serveur MySQL, mais est sur la machine que vous exécutez la commande à partir.

Comme par commentaire ci-dessous, vous pouvez aussi avoir besoin d'inclure le drapeau:

--local-infile=1 
+2

c'était ce que j'avais besoin de faire, merci! – favo

+0

est l'exécution de ceci aussi bon que vous obtiendrez? – mcmillab

+11

Vous devez également utiliser l'indicateur --local-infile = 1 sur le client mysql, sinon vous obtenez "ERROR 1148 (42000): La commande utilisée n'est pas autorisée avec cette version de MySQL" –

0

je suis tombé sur des questions similaires. J'essayais en fait d'importer une base de données mais les conditions devaient être les mêmes - j'avais besoin d'utiliser des données de chargement en raison de la taille de certaines tables, d'une connexion inégale et du désir d'avoir une modeste fonctionnalité de reprise. Je suis d'accord avec chris finne que ne pas spécifier l'option locale peut conduire à cette erreur. Après de nombreux ajustements, j'ai découvert que l'outil mk-parallel-restore de Maatkit offrait ce dont j'avais besoin avec d'excellentes fonctionnalités supplémentaires. Ce pourrait être un bon match pour votre cas d'utilisation.

+0

des outils très cool! – eyberg

6

Pour tout ce que ça vaut ... Vous pouvez ajouter l'opérande LOCAL à LOAD DATA INFILE au lieu d'utiliser mysqlimport pour contourner ce problème.

LOAD DATA LOCAL INFILE ...

Cela fonctionne sans accorder des autorisations de fichier.

0

L'importation de données en masse dans Amazon MySQL RDS est possible de deux manières. Vous pouvez choisir n'importe qui d'en bas selon votre convenance.

  1. Utilisation de l'utilitaire d'importation.

    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. 
    
  2. Envoi d'un encart SQL en vrac dans la commande mysql.

    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');