2009-10-29 24 views
28

Nie jestem pewien, czy jest to pytanie lepiej dostosowane do serwera serverfault, ale ostatnio miewałem problemy z Amazon RDS i miałem problem z uzyskaniem uprawnień do "pliku" do mojego mysql użytkownika hostingowego.jak załadować dane infile na Amazon RDS?

Chciałbym założyć, że to proste:

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

będzie działać, ale tak nie jest i nie może wydawać się to zrobić z moim „root” użytkownika, jak również. Co daje? Powodem, dla którego używamy danych obciążenia jest to, że jest super super szybki do robienia tysięcy wstawek na raz.

Ktoś wie, jak temu zaradzić, czy muszę znaleźć inny sposób?

Ta strona, http://docs.amazonwebservices.com/AmazonRDS/latest/DeveloperGuide/index.html?Concepts.DBInstance.html wydaje się sugerować, że muszę znaleźć inny sposób obejścia tego problemu.

Pomoc?

UPDATE Nie próbuję zaimportować bazę danych - po prostu chcą skorzystać z opcji ładowania pliku do wstawienia kilkaset tysięcy wierszy naraz.

po kopanie wokół to co mamy:

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

Odpowiedz

5

pewien, że nie można zrobić tego jeszcze, jak nie mają najwyższy poziom uprawnień MySQL z RDS. Przeprowadziliśmy tylko małe testy, ale najprostszym sposobem na zaimportowanie bazy danych wydaje się być wyprowadzenie jej z pola źródłowego, np.

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

yeh ... ale ja po prostu staramy się ładować kilkaset do kilku tysięcy oświadczeń a jednocześnie - nie naprawdę wczytać db – eyberg

+0

Chciałbym uruchomić je z przygotowanym oświadczeniu następnie - to nie potrwa długo :) –

79

Trzeba użyć LOAD DATA LOCAL INFILE jako plik nie znajduje się na serwerze MySQL, ale jest na komputerze uruchomiony jest polecenie.

Zgodnie komentarzu poniżej może trzeba także zawierać flagę:

--local-infile=1 
+2

to było to, co musiałem zrobić, dziękuję! – favo

+0

jest wydajność tego tak dobre, jak otrzymasz? – mcmillab

+11

Musisz również użyć flagi -local-infile = 1 na kliencie mysql, w przeciwnym razie pojawi się "ERROR 1148 (42000): Używane polecenie nie jest dozwolone w tej wersji MySQL" –

0

wpadłem podobnych zagadnień. W rzeczywistości próbowałem zaimportować bazę danych, ale warunki powinny być takie same - musiałem użyć danych obciążenia z powodu rozmiaru niektórych tabel, niecodziennego połączenia i chęci do skromnej funkcji wznowienia.

Zgadzam się z chris finne, że brak określenia opcji lokalnej może prowadzić do tego błędu. Po wielu próbach i uruchomieniach odkryłem, że narzędzie do przywracania równoległości mk od Maatkit zapewniało to, czego potrzebowałem, z kilkoma doskonałymi dodatkowymi funkcjami. Może to być świetne dopasowanie do twojego przypadku użycia.

+0

bardzo fajne narzędzia! – eyberg

6

Cokolwiek jest warte ... Możesz dodać LOCAL operand do LOAD DATA INFILE zamiast używać mysqlimport, aby ominąć ten problem.

LOAD DATA LOCAL INFILE ...

to będzie działać bez przyznawania uprawnień do plików.

0

Importowanie danych masowych do Amazon RDS MySQL jest możliwe na dwa sposoby. Możesz wybrać dowolną osobę poniżej, zgodnie z twoją wygodą.

  1. Korzystanie z narzędzia do importowania.

    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. Wysyłanie SQL wstawiając luźne wstawiając do komendy 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');