Estoy intentando crear un cronjob para hacer una copia de seguridad de mi base de datos todas las noches antes de que ocurra 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 después de ejecutar eso, espera que escriba una contraseña. No puedo hacer eso si lo ejecuto desde cron. ¿Cómo puedo pasar uno automáticamente?
bash
postgresql
shell
crontab
mpen
fuente
fuente
Respuestas:
Cree un
.pgpass
archivo en el directorio de inicio de la cuenta quepg_dump
se ejecutará como. Consulte la documentación de Postgresql libpq-pgpass para obtener detalles del formato (incluido el último párrafo donde explica que se ignorará si no establece el modo en0600
).fuente
sudo su postgres
: que el usuario de Unix no existe necesariamente. No necesita hacerlo. Pero el usuario de la base de datos debería.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 incluirlos en el script. Si la contraseña cambia, solo tiene que cambiarla en un lugar (el script).
Y estoy de acuerdo con Joshua, el uso
pg_dump -Fc
genera el formato de exportación más flexible y ya está comprimido. Para obtener más información, consulte: documentación de pg_dumpP.ej
fuente
.pgpass
mantendrá todo en un solo lugar, sin agregar una capa adicional de indirección. Además, si todo lo que quisiera hacer con exportar una variable, lo haría en mi.bashrc
archivo, o lo que sea..pgpass
archivo sería una mejor solución. Solo estaba dando una alternativa, aunque no estoy seguro de si merece un voto negativo :)Si quieres hacerlo con un solo comando:
fuente
postgres://
sintaxis. No probé el.pgpass
porque mi usuario de postgreso no tiene directorio de inicio.Para una línea, como migrar una base de datos que puede usar
--dbname
seguida de una cadena de conexión (incluida la contraseña) como se indica en el manual pg_dumpEn esencia.
pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase
Nota: Asegúrese de usar la opción en
--dbname
lugar de la más corta-d
y use un prefijo URI válido,postgresql://
opostgres://
.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) no debe hacerse debido a problemas de seguridad. Si no fuera por el
.pgpass
archivo, 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
fuente
fuente
Este liner me ayuda al crear el volcado de una sola base de datos.
fuente
La respuesta de @Josue Alexander Ibarra funciona en centos 7 y la versión 9.5 si no se pasa --dbname.
fuente
--dbname
Tenga en cuenta que, en Windows, el
pgpass.conf
archivo debe estar en la siguiente carpeta:Si no hay una
postgresql
carpeta dentro de la%APPDATA%
carpeta, créela.el
pgpass.conf
contenido del archivo es algo así como:salud
fuente
Corríjame si me equivoco, pero si el usuario del sistema es el mismo que el usuario de la base de datos, PostgreSQL no solicitará la contraseña; depende del sistema para la autenticación. Esto podría ser una cuestión de configuración.
Por lo tanto, cuando se quería que el propietario de la base
postgres
de copia de seguridad de sus bases de datos de todas las noches, podría crear un crontab para ello:crontab -e -u postgres
. Por supuesto,postgres
sería necesario permitirle ejecutar trabajos cron; por lo tanto, debe aparecer en la lista/etc/cron.allow
o/etc/cron.deny
debe estar vacío.fuente
Copia de seguridad sobre ssh con contraseña utilizando credenciales temporales de .pgpass y empuje a S3:
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 S3, sáquenla, obviamente.
Este script elimina las credenciales
.pgpass
después porque en algunos entornos, el usuario SSH predeterminado puede sudo sin una contraseña, por ejemplo, una instancia de EC2 con elubuntu
usuario, por lo que.pgpass
puede ser inútil usar una cuenta de host diferente para proteger esas credenciales.fuente
history
esta manera, ¿no?history -c
. Cuando lo use con Jenkins, use laInject passwords to the build as environment variables
opción para que la contraseñaComo se detalla en esta publicación de blog , hay dos formas de proporcionar una contraseña de manera no interactiva a las utilidades de PostgreSQL, como el comando "pg_dump": usando el archivo ".pgpass" o usando la variable de entorno "PGPASSWORD" .
fuente
Otra forma (probablemente no segura) de pasar la contraseña es usar la redirección de entrada, es decir, llamar
pg_dump [params] < [path to file containing password]
fuente
Puede pasar una contraseña a pg_dump directamente utilizando lo siguiente:
fuente
la forma más fácil en mi opinión, esto: edita su archivo de configuración principal de postgres: pg_hba.conf allí debe agregar la siguiente línea:
host <you_db_name> <you_db_owner> 127.0.0.1/32 trust
y después de esto necesitas comenzar tu 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
fuente