Jak utworzyć użytkownika MySQL tylko do odczytu do celów tworzenia kopii zapasowych za pomocą mysqldump?

14

Korzystam ze automysqlbackupskryptu, aby zrzucić moje bazy danych mysql, ale chcę mieć do tego użytkownika tylko do odczytu, aby nie przechowywać hasła mojej głównej bazy danych w pliku zwykłego tekstu.

Stworzyłem takiego użytkownika:

grant select, lock tables on *.* to 'username'@'localhost' identified by 'password';

Po uruchomieniu mysqldump( automysqlbackupbezpośrednio lub bezpośrednio) pojawia się następujące ostrzeżenie:

mysqldump: Got error: 1044: Access denied for user 'username'@'localhost' to database 'information_schema' when using LOCK TABLES

Czy robię to źle? Czy potrzebuję dodatkowych dotacji dla mojego użytkownika tylko do odczytu? Czy może tylko rootzablokować information_schemastół? Co się dzieje?

Edytować:

GAH i teraz to działa. Być może wcześniej nie uruchomiłem FLUSH PRIVILEGES.

Nawiasem mówiąc, jak często dzieje się to automatycznie?

Edytować:

Nie, to nie działa. Uruchamianie mysqldump -u username -p --all-databases > dump.sqlręczne nie generuje błędu, ale nie zrzuca schematu informacji. automysqlbackupzgłasza błąd.

stickmangumby
źródło
Ups ... ze strony podręcznika dla mysqldump: mysqldump nie zrzuca bazy danych Information_SCHEMA. Jeśli nazwiesz tę bazę danych wprost w wierszu poleceń, mysqldump po cichu ignoruje ją. Wygląda na to, że albo strona podręcznika jest nieaktualna (i wyświetla ostrzeżenie), albo automysqlbackupwykonuje dodatkowe kontrole zrzutu information_schema. Nie jestem pewien, co to jest, ale nie ma to związku z przyznawaniem dotacji przez użytkowników.
stickmangumby
1
To nie jest problem GRANT. Nie trzeba wykonywać kopii zapasowej INFORMACJE_SCHEMA (patrz: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger
1
Aby dodać do tego, co powiedział SmallClanger, INFORMACJE_SCHEMA jest wirtualną bazą danych, przebudowywaną przy każdym ponownym uruchomieniu MySQL, więc nie ma sensu tworzyć kopii zapasowej, ponieważ i tak nie można go przywrócić.
John Gardeniers,

Odpowiedzi:

4

Te uprawnienia powinny być wszystkim, czego potrzeba do mysqldump.

Ponieważ przyznałeś LOCK TABLES, a na LOCK TABLES występuje błąd, wygląda na to, że uprawnienia są niespójne. Czy prowadziłeś FLUSH PRIVILEGES?

Shane Madden
źródło
1

Ups ... ze strony podręcznika dla mysqldump:

mysqldump does not dump the INFORMATION_SCHEMA database. If you name that database explicitly on the command line, mysqldump silently ignores it

Wygląda na to, że albo strona podręcznika jest nieaktualna (i wywołuje ostrzeżenie), albo automysqlbackupwykonuje dodatkowe kontrole zrzutu information_schema.

Nie jestem pewien, co to jest, ale nie ma to związku z przyznawaniem dotacji przez użytkowników.

Edytować

Tak, to błąd w automysqlbackupwersji 2.5.1 (korzystający z MySQL 5.1.41 pod Ubuntu 10.04) - próbuje wykonać kopię zapasową, information_schemakiedy nie powinien.

POPRAWKA: Dodaj information_schemado DBEXCLUDElinii 76 skryptu.

stickmangumby
źródło
To nie jest problem GRANT. Nie trzeba wykonywać kopii zapasowej INFORMACJE_SCHEMA (patrz: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger
Aby dodać do tego, co powiedział SmallClanger, INFORMACJE_SCHEMA jest wirtualną bazą danych, przebudowywaną przy każdym ponownym uruchomieniu MySQL, więc nie ma sensu tworzyć kopii zapasowej, ponieważ i tak nie można go przywrócić.
John Gardeniers,
0

Stwórz użytkownika

GRANT USAGE ON *.* TO 'dump'@'localhost' IDENTIFIED BY 'plaintext-pass';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `my-db`.* TO 'dump'@'localhost';

Sprawdź uprawnienia

mysql> SHOW GRANTS FOR dump@'localhost';
+-----------------------------------------------------------------------------------------------+
| Grants for dump@localhost                                                                     |
+-----------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dump'@'localhost'                                                      |
| GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `my-db`.* TO 'dump'@'localhost' |
+-----------------------------------------------------------------------------------------------+

Użyj yor ulubiony edytor do tworzenia pliku ~/.my.cnfzchmod 400

[client]
user=dump
password=plaintext-pass

Utwórz folder dla zrzutów, tak jak w przykładzie

mkdir ~/db-dumps

Sprawdź, czy to działa

mysqldump -u dump --hex-blob --routines --triggers my-db | gzip > ~/db-dumps/manual-my-db-dump-`date +%F`.sql.gz

Opcjonalnie możesz zrobić zrzuty, dailya weeklynastępnie usunąć wszystkie dailystarsze niż miesiąc

#m h  dom mon dow   command
0  3  *   *   0,2-6 /usr/bin/mysqldump -u dump --hex-blob --routines --triggers my-db | gzip > ~/db-dumps/daily-my-db-dump-`date +%F`.sql.gz;
0  3  *   *   1     /usr/bin/mysqldump -u dump --hex-blob --routines --triggers my-db | gzip > ~/db-dumps/weekly-my-db-dump-`date +%F`.sql.gz;
0  4  *   *   *     /usr/bin/find ~/db-dumps/ -name "daily-*" -type f -mtime +30 -exec rm -f {} \;
Vasilii Suricov
źródło