Minimalne GRANTs potrzebne mysqldump do zrzucenia pełnego schematu? (Brakuje TRIGGERów !!)

79

Mam użytkownika MySQL o nazwie dump z następującymi uprawnieniami:

GRANT USAGE ON *.* TO 'dump'@'%' IDENTIFIED BY ...
GRANT SELECT, LOCK TABLES ON `mysql`.* TO 'dump'@'%'
GRANT SELECT, LOCK TABLES ON `myschema`.* TO 'dump'@'%'

Chcę zrzucić wszystkie dane (w tym wyzwalacze i procedury) za pomocą użytkownika zrzutu . Wywołuję mysqldump w następujący sposób:

mysqldump -u dump -p --routines --triggers --quote-names --opt \
    --add-drop-database --databases myschema > myschema.sql

Wszystko jest w porządku z zrzuconym plikiem z wyjątkiem wyzwalaczy, brakuje ich !!

Wyzwalacze są zrzucane poprawnie, jeśli spróbuję mysqldump z użytkownikiem root MySQL:

mysqldump -u root -p --routines --triggers --quote-names --opt \
    --add-drop-database --databases myschema > myschema.sql

Więc wydaje mi się, że jest to problem z uprawnieniami ... jakie dodatkowe uprawnienia potrzebuje użytkownik MySQL dla mojego zrzutu, aby poprawnie wykonać pełny zrzut?

Emilio Nicolás
źródło

Odpowiedzi:

111

Zakładając, że pełny zrzut masz na myśli również VIEWs i EVENTs, potrzebujesz:

GRANT USAGE ON *.* TO 'dump'@'%' IDENTIFIED BY ...;
GRANT SELECT, LOCK TABLES ON `mysql`.* TO 'dump'@'%';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `myschema`.* TO 'dump'@'%';

a jeśli masz VIEWs, które wykonują funkcję, to niestety również potrzebujesz EXECUTE.

Mój własny problem jest następujący: po co mi to, SELECTskoro chcę tylko zrobić zrzut bez danych?

Jannes
źródło
2
W przypadku wersji 5.5 i nowszych faktycznie nie potrzebujesz uprawnienia TRIGGER, aby zrzucić kod wyzwalacza.
bluecollarcoder
1
Używam 5.5 i potrzebowałem uprawnienia TRIGGER, aby zrzucić kod wyzwalacza.
heuri,
W moim przypadku wygląda na to, że potrzebuję również LOCK TABLESw bazie danych próbuję się zrzucić ... używając5.5.49-MariaDB
0xC0000022L
1
Odnośnie @ komentarzu 0xC0000022L, Stoły blokowania lub nie jest obowiązkowe dla mysqldump, w zależności od parametrów mysqldump (odpowiednie parametry --opt, --lock-tables, --lock-all-tables, --single-transactioni poszczególne --skip-*warianty.
Moment obrotowy
8

Znalazłem dodatkową dotację, której potrzebowałem !!

  GRANT TRIGGER ON `myschema`.* TO 'dump'@'%'

Tutaj masz odniesienie do oficjalnego dokumentu: http://dev.mysql.com/doc/refman/5.5/en/privileges-provided.html#priv_trigger

Uprawnienie TRIGGER umożliwia wykonywanie operacji wyzwalania. Musisz mieć to uprawnienie, aby tabela mogła tworzyć, usuwać lub wykonywać wyzwalacze dla tej tabeli.

Emilio Nicolás
źródło
3
W rzeczywistości nazwa to TRIGGER, a nie
TRIGGERS
Choć może to być odpowiedzią na problem autora, nie odpowiada na pytanie: „jakie są minimalne wymagania GRANT-u, aby wykonać pełny zrzut”. Po pierwsze: brakuje EVENT i SHOW VIEW.
Jannes
W przypadku wersji 5.5 i nowszych w rzeczywistości nie potrzebujesz TRIGGERuprawnień do zrzucenia kodu wyzwalacza.
bluecollarcoder
5
Używam 5.5 i faktycznie tego potrzebowałem
Emilio Nicolás
1

Odkryłem, że czasami, jeśli użytkownik VIEW DEFINER nie istnieje, zrzut się nie powiedzie.

Zmień to, jak tam opisano

BaZZiliO
źródło
Nie jestem pewien, dlaczego głosowano w dół, rozwiązałem mój problem. Podałem definer jako person zamiast person@localhost. Dzięki!
stianlik
1

Oprócz Jannes odpowiedź, przy użyciu mysqldump z --tab opcji (produkuje plik tekstowy kartę rozdzielone dla każdej tabeli dumpingowych), twój użytkownik MySQL musi być udzielone na FILEprzywilej, a także:

GRANT FILE ON *.* TO 'dump'@'%';

Odniesienie do oficjalnej dokumentacji: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_tab

Wspomniane w tej sekcji:

Tej opcji należy używać tylko wtedy, gdy mysqldump działa na tej samej maszynie, co serwer mysqld. Ponieważ serwer tworzy pliki * .txt w określonym katalogu, serwer musi mieć możliwość zapisu w katalogu, a konto MySQL, którego używasz, musi mieć uprawnienie PLIK. Ponieważ mysqldump tworzy * .sql w tym samym katalogu, musi mieć możliwość zapisu na koncie logowania do systemu.

Rotem Ad
źródło