Cómo pasar la contraseña a pg dump?


Estoy tratando de crear un cronjob para hacer una copia de seguridad de mi base de datos cada noche antes de que suceda algo catastrófico. Parece que este comando debería satisfacer mis necesidades:

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

Excepto que después de ejecutar eso, espera que escriba una contraseña. No puedo hacer eso si lo dirijo desde Cron. ¿Cómo puedo pasar uno automáticamente?

Author: mpen, 2010-05-24

10 answers

Crear un archivo .pgpass en el directorio home de la cuenta que pg_dump se ejecutará como. Vea la documentación de Postgresql libpq-pgpass para detalles del formato (incluyendo el último párrafo donde explica que será ignorado si no establece el modo en 0600).

 215
Author: araqnid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 20:42:59

O puede configurar crontab para ejecutar un script. Dentro de ese script puede establecer una variable de entorno como esta: export PGPASSWORD="$put_here_the_password"

De esta manera, si tiene varios comandos que requieren contraseña, puede ponerlos todos en el script. Si la contraseña cambia, solo tiene que cambiarla en un solo lugar (el script).

Y estoy de acuerdo con Joshua, usar pg_dump -Fc genera el formato de exportación más flexible y ya está comprimido. Para más información ver: documentación de pg_dump

E. g.

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

# restore the database
pg_restore -d newdb db.dump
 162
Author: Max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-04 16:12:57

Si quieres hacerlo en un comando:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump
 123
Author: gitaarik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-11 09:13:09

Para una línea única, como migrar una base de datos, puede usar --dbname seguido de una cadena de conexión (incluida la contraseña) como se indica en el manual pg_dump

En esencia.

pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase

Nota: Asegúrese de usar la opción --dbname en lugar de la más corta -d y use un prefijo URI válido, postgresql:// o postgres://.

La forma general de URI es:

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

La mejor práctica en su caso (tarea repetitiva en cron) esto no debe ser hecho por problemas de seguridad. Si no fuera por el archivo .pgpass, guardaría la cadena de conexión como una variable de entorno.

export MYDB=postgresql://username:[email protected]:5432/mydatabase

Entonces ten en tu crontab

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

 93
Author: Josue Alexander Ibarra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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
Author: Francisco Luz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-25 10:18:29

@Josue Alexander Ibarra la respuesta funciona en centos 7 y la versión 9.5 si no se pasa db dbname.

pg_dump postgresql://username:[email protected]:5432/mydatabase 
 10
Author: Jauyzed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-02 18:07:15

Corrígeme si me equivoco, pero si el usuario del sistema es el mismo que el usuario de la base de datos, PostgreSQL no pedirá la contraseña - se basa en el sistema para la autenticación. Esto podría ser una cuestión de configuración.

Por lo tanto, cuando quería que el propietario de la base de datos postgres hiciera una copia de seguridad de sus bases de datos cada noche, podía crear un crontab para ello: crontab -e -u postgres. Por supuesto, postgres tendría que tener permiso para ejecutar trabajos cron; por lo tanto, debe estar listado en /etc/cron.allow, o /etc/cron.deny debe estar vacío.

 4
Author: Tobias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-17 17:26:04

Copia de seguridad sobre ssh con contraseña usando temporal .credenciales pgpass y push a S3:

#!/usr/bin/env bash
cd "$(dirname "$0")"

DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="[email protected]_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

Simplemente sustituya el primer par de líneas de configuración con lo que necesite, obviamente. Para aquellos que no estén interesados en la parte de respaldo de S3, sáquela, obviamente.

Este script elimina las credenciales en .pgpass después porque en algunos entornos, el usuario SSH predeterminado puede sudo sin una contraseña, por ejemplo, una instancia EC2 con el usuario ubuntu, por lo que usar .pgpass con un host diferente cuenta con el fin de asegurar esas credenciales, podría ser inútil.

 2
Author: Michael Mügge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-02 18:03:17

Otra forma (probablemente no segura) de pasar la contraseña es usando la redirección de entrada, es decir, llamando a

pg_dump [params] < [path to file containing password]

 -1
Author: szymond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-14 09:29:21

La forma más fácil en mi opinión, esto: edita el archivo de configuración principal de postgres: pg_hba.conf hay que añadir la siguiente línea:

host <you_db_name> <you_db_owner> 127.0.0.1/32 trust

Y después de esto usted necesita comenzar cron así:

pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz

Y funcionó sin contraseña

 -3
Author: Dofri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-31 17:05:04