Błąd MySQL / Amazon RDS: „nie masz SUPER uprawnień…”


98

Próbuję skopiować moją bazę danych mysql z Amazon EC2 do RDS:

Pomyślnie wprowadziłem mysqldumpmoją bazę danych do folderu głównego, używając tego:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Następnie próbowałem przenieść ten plik .sql do mojej nowej bazy danych RDS:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Niestety otrzymuję następujący komunikat o błędzie:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

Próbowałem na GRANT SUPER..różne sposoby, ale otrzymuję błędy, gdy próbuję to zrobić. Pisanie mysql > FLUSH privileges;też nie działa.

Jestem początkującym mysql, przepraszam za tak łatwe pytanie. Myśli?


9
Nie możesz GRANT SUPERw RDS. RDS nie daje możliwości uzyskania SUPER uprawnień.
— ceejayoz

Użyj tej samej nazwy użytkownika MySQL do tworzenia zrzutu i przywracania go (dla połączenia i słowa kluczowego DEFINER w zrzucie). Zmiana log_bin_trust_function_creators nie jest pożądanym rozwiązaniem. Najgorsze jest użycie parametru -f w tym przypadku
— ad4s

w moim przypadku mój sqlplik zawiera CREATE FUNCTIONinstrukcję, która wymaga uprzywilejowanego użytkownika. zobacz to
— Księgowy م

Odpowiedzi:


63

Na http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , musisz ustawić log_bin_trust_function_creatorsna 1 w konsoli AWS , aby załadować plik zrzutu bez błędów.

Jeśli chcesz zignorować te błędy i załadować resztę pliku zrzutu, możesz skorzystać z -fopcji:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

-fBędzie raportować błędy, ale będzie kontynuować przetwarzanie pozostałą część pliku zrzutu.


cześć @ Ross, dzięki za to. Niestety używanie -fnie pomogło. Mam ten sam błąd. Używając twojego linku, mam problem ze składnią narzędzi RDS Cli. To znaczy, kiedy idę zmienić uprawnienia, pojawia się następujący błąd:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
— tim peterson

oto moje polecenie, które daje mi powyższy błąd: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"wiem, że musi to być problem z cudzysłowem lub podwójnym myślnikiem, ale żadna z tych zmian do tej pory nie działa, ugh!
— tim Peterson

4
Ta -fopcja nie usunie błędów, po prostu pozwoli na przetworzenie nieszkodliwych instrukcji SQL w pliku. Z tego, co przeczytałem, RDS dławi się procedurami składowanymi w pliku zrzutu. Spróbuj utworzyć plik zrzutu bez procedur przechowywania i sprawdź, czy ładuje się dobrze:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
— Ross Smith II,

2
- @ Ross, świetnie, że zadziałało, moja baza danych jest tam, wow to irytujący problem, czuję, że AWS powinno coś z tym zrobić.
— tim Peterson

Przynajmniej mogę załadować wszystkie dane za pomocą -fopcji. Druga faza może polegać na oddzielnym zrzucaniu tylko procedur / proc stred itp.
— Kaymaz

134
  1. Otwórz konsolę internetową RDS.
  2. Otwórz zakładkę „Grupy parametrów”.
  3. Utwórz nową grupę parametrów. W oknie dialogowym wybierz rodzinę MySQL zgodną z wersją Twojej bazy danych MySQL, nadaj jej nazwę i potwierdź. Wybierz właśnie utworzoną grupę parametrów i wprowadź „Edytuj parametry”.
  4. Poszukaj parametru „log_bin_trust_function_creators” i ustaw jego wartość na „1”.
  5. Zapisz zmiany.
  6. Otwórz zakładkę „Instances”. Rozwiń swoją instancję MySQL i wydaj „Akcję instancji” o nazwie „Modyfikuj”.
  7. Wybierz właśnie utworzoną grupę parametrów i włącz opcję „Zastosuj natychmiast”.
  8. Kliknij „Kontynuuj” i potwierdź zmiany.
  9. Poczekaj na zakończenie operacji „Modyfikowanie”.
  10. Ponownie otwórz kartę „Instancje”. Rozwiń swoją instancję MySQL, rozwiń zakładkę „Instance Action” i wybierz „Reboot”.

> co robi punkt 9 ... dostosowujesz swoją instancję do używania grupy parametrów zdefiniowanej wcześniej. Aby uzyskać więcej informacji, zobacz ten oryginalny post na blogu autorstwa Daniela Ferbersa
— AndrewL

Czy to zatrzyma replikację RDS MySQL?
— Ramratan Gupta

cześć @ arun-r, przechodzę przez kroki, które wyjaśniłeś, ale parametr `` log_bin_trust_function_creators '' nie jest dostępny w przypadku. Myślę, że w najnowszym AWS RDS coś się zmieniło. Czy możesz mi pomóc, jak mogę to teraz zrobić? dzięki,
— Pawan Developers

@RamratanGupta To się nie skończy
— arun-r

1
@ arun-r dzięki za odpowiedź. Rozwiązałem swój problem. Właściwie znalazłem na liście log_bin_trust_function_creators. ale mój problem został rozwiązany, kontaktując się ze wsparciem AWS
— Pawan Developers

33

Problem z wyzwalaczami i procedurami składowanymi w pliku zrzutu polega na tym, że te definicje obejmują użytkownika, który powinien utworzyć procedurę składowaną, czyli DEFINER. Użytkownik najprawdopodobniej nie istnieje w RDS, więc wtedy zgłaszany jest błąd. Aby móc załadować plik zrzutu, można usunąć DEFINER za pomocą seda lub Perla i utworzyć procedurę składowaną / wyzwalacz z użytkownikiem wykonującym import.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Teraz powinieneś móc załadować naprawiony plik zrzutu

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Jak wspomniano we wcześniejszej odpowiedzi, powinieneś ustawić parametr DB:

log_bin_trust_function_creators = 1

1
Czyszczenie definicji można również przeprowadzić za pomocą sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
— siliconrockstar

16

Dla mnie w moim pliku zrzutu były tylko 2 polecenia, które wymagały uprawnień SUPER:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

Zgodnie z dokumentacją mysqldump możesz je wyłączyć za pomocą --set-gtid-purged=OFF.

Następnie patrząc na man mysqldump :

Użyj opcji WŁ., Jeśli zamierzasz wdrożyć nowe urządzenie podrzędne replikacji przy użyciu tylko niektórych danych z zrzuconego serwera. Użyj opcji OFF, jeśli zamierzasz naprawić tabelę przez skopiowanie jej w topologii. Użyj opcji OFF, jeśli zamierzasz skopiować tabelę między topologiami replikacji, które są rozłączne i takie pozostaną.

Dlatego zdecydowałem się dodać --set-gtid-purged=OFFdo mojego mysqldumppolecenia, a następnie mogłem pomyślnie zaimportować wynikowy plik zrzutu.


1
Tak, to było to. Mój plik zrzutu był stosunkowo mały, więc usunąłem z niego wszystkie wystąpienia tych 2 poleceń.
— Zolbayar,

6

Zgodnie z definicją w dokumentacji AWS wyzwalacze, procedury i funkcje są domyślnie wyłączone, ponieważ rejestrowanie binarne jest domyślnie włączone. Wyłączenie w zasadzie sprawia, że ​​twoja baza danych jest bezpieczniejsza, ale jeśli dobrze zabezpieczono ją przez sieć, nie ma to znaczenia.

Wykonaj poniższe czynności, a problem zostanie rozwiązany https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Nie powinieneś także używać definicji podczas tworzenia procedur. Proste polecenie sed może je usunąć.



1

Po zastosowaniu odpowiedzi arun-r, jeśli problem nie został rozwiązany, musisz zmodyfikować plik zrzutu. To jest proste.

W pliku zrzutu znajdziesz linie takie jak:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Musisz wymienić:

  • username_from_dumped_database przez twoją nazwę użytkownika w bazie danych rds.
  • host_from_dumped_databse przez %

Nie wiem dlaczego, ale ta sztuczka zadziałała na mnie. Do tego wystarczy prosty edytor tekstu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.