J'essaie de créer un cronjob pour sauvegarder ma base de données tous les soirs 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 après avoir exécuté cela, il s'attend à ce que je tape un mot de passe. Je ne peux pas faire ça si je le lance depuis cron. Comment puis-je en transmettre un automatiquement?
bash
postgresql
shell
crontab
mpen
la source
la source
Réponses:
Créez un
.pgpass
fichier dans le répertoire personnel du compte quipg_dump
s'exécutera en tant que. Voir la documentation de Postgresql libpq-pgpass pour plus de détails sur le format (y compris le dernier paragraphe où il explique qu'il sera ignoré si vous ne définissez pas le mode sur0600
).la source
sudo su postgres
: cet utilisateur Unix n'existe pas nécessairement. Il n'en a pas besoin. Mais l'utilisateur DB devrait.Ou vous pouvez configurer crontab pour exécuter un script. À l'intérieur de ce script, vous pouvez définir une variable d'environnement comme celle-ci:
export PGPASSWORD="$put_here_the_password"
De cette façon, si vous avez plusieurs commandes nécessitant un mot de passe, vous pouvez toutes les mettre dans le script. Si le mot de passe change, vous n'avez qu'à le changer en un seul endroit (le script).
Et je suis d'accord avec Joshua, l'utilisation
pg_dump -Fc
génère le format d'exportation le plus flexible et est déjà compressé. Pour plus d'informations, voir: documentation pg_dumpPar exemple
la source
.pgpass
gardera tout au même endroit, sans ajouter une couche supplémentaire d'indirection. De plus, si tout ce que je voulais faire avec l'exportation d'une variable, je le ferais dans mon.bashrc
fichier, ou quoi que ce soit..pgpass
fichier serait une meilleure solution. Je donnais juste une alternative, je ne sais pas si elle mérite un downvote cependant :)Si vous voulez le faire en une seule commande:
la source
postgres://
syntaxe. N'a pas essayé.pgpass
car mon utilisateur postgress n'a pas de répertoire personnel.Pour une ligne unique, comme la migration d'une base de données, vous pouvez utiliser
--dbname
suivi d'une chaîne de connexion (y compris le mot de passe) comme indiqué dans le manuel pg_dumpEn substance.
pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase
Remarque: assurez-vous que vous utilisez l'option
--dbname
au lieu de la plus courte-d
et utilisez un préfixe URI valide,postgresql://
oupostgres://
.Le formulaire URI général est:
postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
Meilleure pratique dans votre cas (tâche répétitive dans cron), cela ne devrait pas être fait en raison de problèmes de sécurité. Si ce n'était pas pour le
.pgpass
fichier, je sauvegarderais la chaîne de connexion en tant que variable d'environnement.export MYDB=postgresql://username:[email protected]:5432/mydatabase
alors ayez dans votre crontab
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
la source
la source
Cette doublure m'aide tout en créant le vidage d'une seule base de données.
la source
La réponse @Josue Alexander Ibarra fonctionne sur centos 7 et la version 9.5 si --dbname n'est pas transmis.
la source
--dbname
Notez que, dans Windows, le
pgpass.conf
fichier doit se trouver dans le dossier suivant:s'il n'y a pas de
postgresql
dossier à l'intérieur du%APPDATA%
dossier, créez-le.le
pgpass.conf
contenu du fichier est quelque chose comme:à votre santé
la source
Corrigez-moi si je me trompe, mais si l'utilisateur du système est le même que l'utilisateur de la base de données, PostgreSQL ne demandera pas le mot de passe - il s'appuie sur le système pour l'authentification. Cela peut être une question de configuration.
Ainsi, quand je voulais que le propriétaire de la base
postgres
de ses bases de données de sauvegarde tous les soirs, je pouvais créer un crontab pour elle:crontab -e -u postgres
. Bien sûr,postgres
il faudrait être autorisé à exécuter des tâches cron; il doit donc être répertorié dans/etc/cron.allow
, ou/etc/cron.deny
doit être vide.la source
Sauvegardez sur ssh avec mot de passe en utilisant des informations d'identification temporaires .pgpass et passez à S3:
Remplacez simplement les deux premières lignes de configuration par tout ce dont vous avez besoin - évidemment. Pour ceux qui ne sont pas intéressés par la partie de sauvegarde S3, retirez-la - évidemment.
Ce script supprime les informations d'identification par la
.pgpass
suite, car dans certains environnements, l'utilisateur SSH par défaut peut sudo sans mot de passe, par exemple une instance EC2 avec l'ubuntu
utilisateur, donc l'utilisation.pgpass
avec un compte hôte différent pour sécuriser ces informations d'identification peut être inutile.la source
history
cette façon, non?history -c
. Lors de l'utilisation avec Jenkins, utilisez l'Inject passwords to the build as environment variables
option pour que le mot de passe soit masquéComme détaillé dans cet article de blog , il existe deux façons de fournir de manière non interactive un mot de passe aux utilitaires PostgreSQL tels que la commande "pg_dump": en utilisant le fichier ".pgpass" ou en utilisant la variable d'environnement "PGPASSWORD" .
la source
Une autre façon (probablement non sécurisée) de transmettre le mot de passe consiste à utiliser la redirection d'entrée, c'est-à-dire appeler
pg_dump [params] < [path to file containing password]
la source
Vous pouvez passer un mot de passe dans pg_dump directement en utilisant ce qui suit:
la source
la façon la plus simple à mon avis, ceci: vous éditez votre fichier de configuration principal postgres: pg_hba.conf là vous devez ajouter la ligne suivante:
host <you_db_name> <you_db_owner> 127.0.0.1/32 trust
et après cela, vous devez commencer votre cron ainsi:
pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz
et cela a fonctionné sans mot de passe
la source