Comment passer le mot de passe à PG dump?
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 à partir de cron. Comment puis-je en passer un automatiquement?
10 réponses
Créez un fichier .pgpass
dans le répertoire personnel du compte sous lequel pg_dump
s'exécutera. Voir la documentation 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 sur 0600
).
, Ou vous pouvez configurer crontab pour exécuter un script. Dans 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 nécessitant un mot de passe, vous pouvez les mettre toutes 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, en utilisant 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_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
Si vous voulez le faire en une seule commande:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
Pour un one-liner, 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_dump
En substance.
pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase
Remarque: assurez-vous d'utiliser l'option --dbname
au lieu du plus court -d
et utilisez un préfixe URI valide, postgresql://
ou postgres://
.
La forme URI générale 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 à cause de problèmes de sécurité. Si ce n'était pas pour le fichier .pgpass
, j'enregistrerais la chaîne de connexion en tant que variable d'environnement.
export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase
Alors avoir dans votre crontab
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
@ Josue Alexander Ibarra réponse fonctionne sur centos 7 et la version 9.5 si --dbname n'est pas passé.
pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase
Corrigez - moi si je me trompe, mais si L'utilisateur 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 pourrait être une question de configuration.
Ainsi, quand je voulais que le propriétaire de la base de données postgres
sauvegarde ses bases de données tous les soirs, je pouvais créer une crontab pour cela: crontab -e -u postgres
. Bien sûr, postgres
devrait être autorisé à exécuter des tâches cron; il doit donc être listé dans /etc/cron.allow
, ou /etc/cron.deny
doit être vide.
Sauvegarde sur ssh avec mot de passe en utilisant temporaire .informations d'identification pgpass et push vers S3:
#!/usr/bin/env bash
cd "$(dirname "$0")"
DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="my_user@host.my_domain.com"
BUCKET_PATH="bucket_name/backup"
if [ $# -ne 2 ]; then
echo "Error: 2 arguments required"
echo "Usage:"
echo " my-backup-script.sh <DB-name> <password>"
echo " <DB-name> = The name of the DB to backup"
echo " <password> = The DB password, which is also used for GPG encryption of the backup file"
echo "Example:"
echo " my-backup-script.sh my_db my_password"
exit 1
fi
DATABASE=$1
PASSWORD=$2
echo "set remote PG password .."
echo "$DB_HOST:5432:$DATABASE:$DB_USER:$PASSWORD" | ssh "$SSH_HOST" "cat > ~/.pgpass; chmod 0600 ~/.pgpass"
echo "backup over SSH and gzip the backup .."
ssh "$SSH_HOST" "pg_dump -U $DB_USER -h $DB_HOST -C --column-inserts $DATABASE" | gzip > ./tmp.gz
echo "unset remote PG password .."
echo "*********" | ssh "$SSH_HOST" "cat > ~/.pgpass"
echo "encrypt the backup .."
gpg --batch --passphrase "$PASSWORD" --cipher-algo AES256 --compression-algo BZIP2 -co "$DATABASE.sql.gz.gpg" ./tmp.gz
# Backing up to AWS obviously requires having your credentials to be set locally
# EC2 instances can use instance permissions to push files to S3
DATETIME=`date "+%Y%m%d-%H%M%S"`
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/"$DATETIME".sql.gz.gpg
# s3 is cheap, so don't worry about a little temporary duplication here
# "latest" is always good to have because it makes it easier for dev-ops to use
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/latest.sql.gz.gpg
echo "local clean-up .."
rm ./tmp.gz
rm "$DATABASE.sql.gz.gpg"
echo "-----------------------"
echo "To decrypt and extract:"
echo "-----------------------"
echo "gpg -d ./$DATABASE.sql.gz.gpg | gunzip > tmp.sql"
echo
Remplacez simplement les deux premières lignes de configuration par ce dont vous avez besoin - évidemment. Pour ceux qui ne sont pas intéressés par la partie de sauvegarde S3, sortez-le-évidemment.
Ce script supprime les informations d'identification dans .pgpass
par la suite, car dans certains environnements, l'utilisateur SSH par défaut peut sudo sans mot de passe, par exemple une instance EC2 avec l'utilisateur ubuntu
, donc en utilisant .pgpass
avec un hôte différent compte afin d'obtenir ces informations d'identification, pourrait être inutile.
Un autre moyen (probablement pas sécurisé) de passer le mot de passe est d'utiliser la redirection d'entrée, c'est-à-dire d'appeler
pg_dump [params] < [path to file containing password]
Le moyen le plus simple à mon avis, ce: 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 à 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