Comment créer un utilisateur MySQL en lecture seule à des fins de sauvegarde avec mysqldump?

14

J'utilise le automysqlbackupscript pour vider mes bases de données mysql, mais je veux avoir un utilisateur en lecture seule pour le faire afin que je ne stocke pas mon mot de passe de base de données racine dans un fichier en clair.

J'ai créé un utilisateur comme ça:

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

Lorsque je cours mysqldump( automysqlbackupdirectement ou directement), j'obtiens l'avertissement suivant:

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

Suis-je en train de mal faire? Ai-je besoin de subventions supplémentaires pour mon utilisateur en lecture seule? Ou ne peut que rootverrouiller la information_schematable? Que se passe-t-il?

Éditer:

GAH et maintenant ça marche. Je n'ai peut-être pas exécuté FLUSH PRIVILEGES auparavant.

En passant, à quelle fréquence cela se produit-il automatiquement?

Éditer:

Non, ça ne marche pas. L'exécution mysqldump -u username -p --all-databases > dump.sqlmanuelle ne génère pas d'erreur, mais ne vide pas le schéma d'informations. automysqlbackupsoulève une erreur.

stickmangumby
la source
Oups ... à partir de la page de manuel de mysqldump: mysqldump ne vide pas la base de données INFORMATION_SCHEMA. Si vous nommez cette base de données explicitement sur la ligne de commande, mysqldump l'ignore silencieusement. Semble que la page de manuel est obsolète (et qu'elle déclenche un avertissement), ou automysqlbackupeffectue des vérifications supplémentaires sur le vidage pour information_schema. Je ne sais pas de quoi il s'agit, mais ce n'est pas lié aux subventions des utilisateurs.
stickmangumby
1
Ce n'est pas un problème GRANT. Vous n'avez pas besoin de sauvegarder INFORMATION_SCHEMA (Voir: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger
1
Pour ajouter à ce que SmallClanger a dit, INFORMATION_SCHEMA est une base de données virtuelle, reconstruite à chaque redémarrage de MySQL, il est donc inutile de la sauvegarder car vous ne pouvez pas la restaurer de toute façon.
John Gardeniers

Réponses:

4

Ces autorisations devraient être tout ce dont vous avez besoin pour mysqldump.

Étant donné que vous avez accordé LOCK TABLES, et qu'il est erroné sur LOCK TABLES, il semble que les autorisations soient incohérentes. Avez-vous exécuté un FLUSH PRIVILEGES?

Shane Madden
la source
1

Oups ... de la page de manuel pour mysqldump:

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

Il semble que la page de manuel soit obsolète (et déclenche un avertissement) ou automysqlbackupeffectue des vérifications supplémentaires sur le vidage information_schema.

Je ne sais pas de quoi il s'agit, mais ce n'est pas lié aux subventions des utilisateurs.

Éditer

Oui, c'est un bogue dans la automysqlbackupversion 2.5.1 (en utilisant MySQL 5.1.41 sous Ubuntu 10.04) - il essaie de sauvegarder information_schemaquand il ne devrait pas.

CORRECTIF: ajoutez information_schemaà à la DBEXCLUDEligne 76 du script.

stickmangumby
la source
Ce n'est pas un problème GRANT. Vous n'avez pas besoin de sauvegarder INFORMATION_SCHEMA (Voir: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger
Pour ajouter à ce que SmallClanger a dit, INFORMATION_SCHEMA est une base de données virtuelle, reconstruite à chaque redémarrage de MySQL, il est donc inutile de la sauvegarder car vous ne pouvez pas la restaurer de toute façon.
John Gardeniers
0

Créer un utilisateur

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

Vérifier les privilèges

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

Utilisez votre éditeur préféré pour créer un fichier ~/.my.cnfavecchmod 400

[client]
user=dump
password=plaintext-pass

Créer un dossier pour les vidages, comme exemple

mkdir ~/db-dumps

Vérifiez si cela fonctionne

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

En option , vous pouvez faire des décharges dailyet weeklypuis tout le dailymois plus alors

#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
la source