2009-05-12 13 views
11

puedo ejecutar comandos como vacuumdb, pg_dump y psql muy bien en una secuencia de comandos si los prefacio de este modo:¿Cómo hago una copia de seguridad de mi base de datos PostgreSQL con Cron?

/usr/bin/sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/prevac.gz 
/usr/bin/sudo -u postgres /usr/bin/vacuumdb --analyze mydatabase 
/usr/bin/sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/postvac.gz 
SCHEMA_BACKUP="/opt/postgresql/$(date +%w).db.schema" 
sudo -u postgres /usr/bin/pg_dump -C -s mydatabase > $SCHEMA_BACKUP 

Estos se ejecutan en la línea de comandos en RedHat cuando estoy sudo para la raíz y luego como se ve en los comandos anteriores hago un sudo -u a postgres.

Pero cuando trato de sacar esto de cron, obtengo cero bytes en todos los archivos, lo que significa que no se ejecutó correctamente. Y no tengo ni idea de los registros que puedo ver.

Mi archivo/etc/crontab tiene esta entrada en la parte inferior

00 23 * * * root /etc/db_backup.cron 

Y sí, es /etc/db_backup.cron ug chmod + x, propiedad de root, y la parte superior del archivo dice " #!/bin/bash "(menos dobles comillas).

¿Alguien sabe lo que ofrece?

+0

al menos en redhat,% símbolos debe escaparse. si no se escapa, cron intentará ejecutar tu comando solo hasta el%. Ver - http://fahdshariff.blogspot.com/2009/05/percent-sign-in-crontab.html – chrismarx

Respuesta

9

Ya que parece que tienen derechos de superusuario de todos modos, se puede poner estos comandos en el crontab del usuario postgres así:

sudo su postgres 
crontab -e 

y luego poner el pg_dump/vacuumdb manda allí.

+1

Esto es lo que finalmente terminé haciendo y funcionó bien solo cuando hice chown postgres.root/opt/postgresql (donde iban los archivos). – Volomike

+7

'' sudo su postgres '' ¡Eso es una locura! Prueba '' sudo -u postgres ''. Configura una especificación sudo, es mucho más seguro. –

+0

Usted (postgres) no tiene permitido el acceso a (crontab) debido a la configuración de pam. –

4

Es posible que su variable de entorno no esté configurada en cron.

En su sesión normal, es probable que se han definido las siguientes variables:

PG_PORT 
PG_HOST 
PG_DATABASE 
PG_USERNAME 
PG_PASSWORD 

Añadir un "env" en la escritura yout.

+0

Necesito un poco más de ayuda que eso, creo. Puse 'env' antes de los comandos y después de #!/Bin/bash y todo lo que hice fue volcar el entorno al archivo de registro (porque ahora estoy volcando la salida a un archivo de registro mientras se ejecuta). – Volomike

+0

La forma de establecer estas variables sería 'export PG_PORT = 5432' etc. – jhwist

+1

Estas no son exactamente las variables utilizadas por pg_dump y vacuumdb. Puede ver la lista completa aquí: http://www.postgresql.org/docs/8.4/static/libpq-envars.html – liviucmg

11

Tengo un script de bash dinámico que realiza una copia de seguridad de todas las bases de datos en el servidor. Obtiene una lista de todas las bases de datos y luego vacía cada DB antes de realizar una copia de seguridad. Todos los registros se escriben en un archivo y luego ese registro se me envía por correo electrónico. Esto es algo que podrías usar si quieres.

Copie el código debajo en un archivo y agregue el archivo a su crontab. Configuré mi pg_hba.conf para confiar en las conexiones locales.

#!/bin/bash 
logfile="/backup/pgsql.log" 
backup_dir="/backup" 
touch $logfile 
databases=`psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}` 

echo "Starting backup of databases " >> $logfile 
for i in $databases; do 
     dateinfo=`date '+%Y-%m-%d %H:%M:%S'` 
     timeslot=`date '+%Y%m%d%H%M'` 
     /usr/bin/vacuumdb -z -h localhost -U postgres $i >/dev/null 2>&1 
     /usr/bin/pg_dump -U postgres -i -F c -b $i -h 127.0.0.1 -f $backup_dir/$i-database-$timeslot.backup 
     echo "Backup and Vacuum complete on $dateinfo for database: $i " >> $logfile 
done 
echo "Done backup of databases " >> $logfile 

tail -15 /backup/pgsql.log | mailx [email protected] 
+1

Puede agregar '--analyze' al comando/usr/bin/vacuumdb para realizar un análisis también. –

+5

Aquí hay otro buen script: http://wiki.postgresql.org/wiki/Automated_Backup_on_Linux –

+2

@Imraan Parker ¿cómo se las arreglan para evitar el uso de la contraseña? Quiero hacer una copia de seguridad como cuenta de administrador de la base de datos, no el usuario root postgres, ¿cómo puedo hacer eso? –

1

es probable que tenga la autenticación "ident" en su pg_hba.conf para su usuario de postgres. La opción "-u postgres" falla cuando ese es el caso. cambie el usuario a postgres en su secuencia de comandos de copia de seguridad o configure un método de autenticación diferente.

0

En lugar de la siguiente comando: bases de datos = psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}

Puede utilizar a continuación: bases de datos = psql -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

La primera vuelta '|' para bases de datos de plantillas y una línea vacía.

El segundo es más limpio.

0

bases de datos = psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

0

Otra versión para obtener la lista de bases de datos:
psql -lqt | grep -vE '^ +(template[0-9]+|postgres)? *\|' | cut -d'|' -f1| sed -e 's/ //g' -e '/^$/d'

Como mi salida psql -lqt es:

abcdefghij   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | 
postgres   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | 
template0   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   + 
        |   |   |    |    | postgres=CTc/postgres 
template1   | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   + 
        |   |   |    |    | postgres=CTc/postgres 
abc    | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | 
2

he puesto mi cron como este. Cada 59 minutos desde lunes a viernes

*/59 * * * 1-5 sh /home/my_user/scripts/back_my_bd.sh 

La secuencia de comandos para ejecutar la copia de seguridad está dentro back_my_bd.sh archivo y el contenido es:

pg_dump -U USERDATABASE DATABASENAME > /home/my_user/sql/mybackup.sql 

y yo creamos el archivo .pgpass interior en Inicio para permitir la copia de seguridad sin especificar el usuario y la contraseña

localhost:5432:DATABASENAME:USER:PASSWORD 

Lo siento, mi inglés no es bueno.

Cuestiones relacionadas