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?

203
demandé sur mpen 2010-05-24 03:32:11

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).

215
répondu araqnid 2018-03-09 20:42:59

, 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
162
répondu Max 2013-10-04 16:12:57

Si vous voulez le faire en une seule commande:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump
123
répondu gitaarik 2014-06-11 09:13:09

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

93
répondu Josue Alexander Ibarra 2016-02-23 21:14:59
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
39
répondu Francisco Luz 2014-07-25 10:18:29

@ 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 
10
répondu Jauyzed 2017-02-02 18:07:15

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.

4
répondu Tobias 2013-09-17 17:26:04

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.

2
répondu Michael Mügge 2018-04-02 18:03:17

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]

-1
répondu szymond 2013-05-14 09:29:21

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

-3
répondu Dofri 2017-07-31 17:05:04