468 votes

Comment passer un mot de passe à pg_dump ?

J'essaie de créer un cronjob pour sauvegarder ma base de données chaque nuit avant que quelque chose de catastrophique ne se produise. Il semble que cette commande devrait répondre à mes besoins :

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

Sauf qu'après avoir lancé ça, il me demande de taper un mot de passe. Je ne peux pas le faire si je l'exécute à partir de cron. Comment puis-je en transmettre un automatiquement ?

1 votes

Peut-être un post utile que j'ai écrit sur l'automatisation de pg_restore ! medium.com/@trinity/

1 votes

Répondre en utilisant une chaîne de connexion ici : stackoverflow.com/a/29101292/1579667

470voto

araqnid Points 33350

Créer un .pgpass dans le répertoire personnel du compte qui pg_dump fonctionnera comme.

Le format est le suivant :

hostname:port:database:username:password

Ensuite, réglez le mode du fichier sur 0600 . Sinon, il sera ignoré.

chmod 600 ~/.pgpass

Voir la documentation de Postgresql libpq-pgpass pour plus de détails.

122 votes

Créez ~/.pgpass avec localhost:5432:mydbname:postgres:mypass Puis chmod 600 ~/.pgpass

10 votes

Possiblement utile : Sur Ubuntu, "sudo su postgres" pour passer à l'utilisateur "postgres", puis créer le fichier .pgpass et exécuter le dump.

1 votes

J'ai suivi votre réponse mais je n'ai toujours pas réussi à créer mon fichier de sauvegarde. Veuillez voir mon lien : unix.stackexchange.com/questions/257898/ . Merci.

327voto

Max Points 1836

Ou vous pouvez configurer crontab pour exécuter un script. A l'intérieur de ce script vous pouvez définir une variable d'environnement comme ceci : export PGPASSWORD="$put_here_the_password"

De cette façon, si vous avez plusieurs commandes qui nécessiteraient un mot de passe, vous pouvez les mettre toutes dans le script. Si le mot de passe change, vous ne devez le changer qu'à un seul endroit (le script).

Et je suis d'accord avec Joshua, utiliser pg_dump -Fc génère le format d'exportation le plus flexible et est déjà compressé. Pour plus d'informations, voir : Documentation sur pg_dump

Par exemple

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

3 votes

Ce n'est pas l'idéal. le jeter dans .pgpass gardera tout en un seul endroit, sans ajouter une couche supplémentaire d'indirection. de plus, si tout ce que je voulais faire était d'exporter une variable, je le ferais dans mon fichier .bashrc ou quoi que ce soit d'autre.

17 votes

Je peux voir pourquoi le .pgpass serait une meilleure solution. Je donnais juste une alternative, je ne suis pas sûr qu'elle mérite un downvote :)

19 votes

Je n'ai pas rétrogradé. C'était quelqu'un d'autre ; je ne pensais pas non plus que cela justifiait un downvote. J'ai un +1 pour me rattraper.

297voto

rednaw Points 3856

Si vous voulez le faire en une seule commande :

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

39 votes

La définition de la variable d'environnement PGPASSWORD n'est pas une pratique recommandée. par la documentation ( postgresql.org/docs/current/static/libpq-envars.html ) : L'utilisation de cette variable d'environnement n'est pas recommandée pour des raisons de sécurité, car certains systèmes d'exploitation permettent aux utilisateurs non-Root de voir les variables d'environnement des processus via ps ; envisagez plutôt d'utiliser le fichier ~/.pgpass

46 votes

C'est toujours un commentaire utile. Il y a beaucoup de cas de déploiement où cela est encore utile.

2 votes

J'ai toujours obtenu l'erreur "Peer authentication failed for user "username"". La solution était : PGPASSWORD="mypass" pg_dump -U nom d'utilisateur -h localhost > mydb.dump

55voto

Francisco Luz Points 323
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename

0 votes

Sympa, mais malheureusement ça ne marche pas pour moi, j'obtiens "query failed : ERROR : permission denied for relation direction_lookup"

0 votes

@Doc avez-vous essayé de donner les permissions nécessaires à l'utilisateur pg ?

17voto

user698585 Points 3019

Oubliez toutes ces conneries de .pgpass, il est presque impossible de les faire fonctionner dans un environnement web de production (pas comme une tâche cron). Le moyen le plus simple est de créer un script de sauvegarde autonome comme celui-ci (Python utilisé juste pour l'illustration) :

import os
password = 'the_password'
database = 'the_database'
username = 'the_username'
filename = 'the_filename'
command = 'export PGPASSWORD=%s\npg_dump %s -U %s --file="%s" -h localhost' % (password, database, username, filename)
os.system(command)

Notez qu'il est nécessaire de mettre ' \n entre le chunk d'exportation et le chunk pg_dump. Vous pouvez ensuite exécuter ce script dans une tâche cron (ou n'importe où ailleurs d'ailleurs).

Vous pouvez également ajouter un " \nunset PGPASSWORD" à commande pour une utilisation plus sûre, je ne suis pas sûr que cela soit nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X