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?

Tim Peterson
źródło
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.

Ross Smith II
źródło
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”.
arun-r
źródło
> 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
Anders
źródło
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.

Tak_To jest_Me
źródło
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ąć.

Josh Woodcock
źródło
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.

Damien Frances
źródło