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
.pgpassarchivo en el directorio de inicio de la cuenta quepg_dumpse 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 -Fcgenera 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
.pgpassmantendrá 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.bashrcarchivo, o lo que sea..pgpassarchivo 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.pgpassporque mi usuario de postgreso no tiene directorio de inicio.Para una línea, como migrar una base de datos que puede usar
--dbnameseguida 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/mydatabaseNota: Asegúrese de usar la opción en
--dbnamelugar de la más corta-dy 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
.pgpassarchivo, guardaría la cadena de conexión como una variable de entorno.export MYDB=postgresql://username:[email protected]:5432/mydatabaseentonces ten en tu crontab
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gzfuente
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
--dbnameTenga en cuenta que, en Windows, el
pgpass.confarchivo debe estar en la siguiente carpeta:Si no hay una
postgresqlcarpeta dentro de la%APPDATA%carpeta, créela.el
pgpass.confcontenido 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
postgresde 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,postgressería necesario permitirle ejecutar trabajos cron; por lo tanto, debe aparecer en la lista/etc/cron.allowo/etc/cron.denydebe 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
.pgpassdespués porque en algunos entornos, el usuario SSH predeterminado puede sudo sin una contraseña, por ejemplo, una instancia de EC2 con elubuntuusuario, por lo que.pgpasspuede ser inútil usar una cuenta de host diferente para proteger esas credenciales.fuente
historyesta manera, ¿no?history -c. Cuando lo use con Jenkins, use laInject passwords to the build as environment variablesopció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 trusty 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.gzy funcionó sin contraseña
fuente