Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Scripts Backup Automatico Postgress Con PG - Dump PDF
Scripts Backup Automatico Postgress Con PG - Dump PDF
Si queremos tener una script que automatice el backup de todas nuestras bases de datos postgress
utilizando pg_dump en vez de pg_dumpall, para poder así recuperar cada base de datos por separado en
un entorno MAC, y tener un backup Full y 1 por cada base de datos.
Lo primero que debemos hacer es añadir al $PATH de macos la ruta al /bin de postgress, para ello
podemos ejecutar la siguiente orden.
Ahora, para que no pida el password todo el rato las scripts, deberemos crear el fichero .pgpass en el
home del usuario que va a ejecutar la script, este fichero es consultado al ejecutar scripts cuando se
utiliza postgress para que no solicite la clave, debera tener unos permisos EXACTOS 0600 o no se podrá
ejecutar y contener la información en el siguiente formato.
hostname:port:database:username:password
Así si queremos que el password sirva para cualquier puerto, cualquier base de datos y cualquier usuario,
pero solo de forma local, deberemos editarlo de la siguiente forma.
localhost:*:*:*:PASSWORD
1/6
System Admin
Tutoriales para IT Admins.
modificando password por nuestro pass de postgres.
http://system-admin.es
para ello
vi .pgpass
Ahora que ya tenemos solucionado las llamadas a los binarios, y el password, vamos con las scripts.
Si bien la tenéis abajo del todo, listo para copiar y pegar en vuestro sistema.
pg_backup.config
y dos scripts, dependiendo de si queremos que rote los backups borrando los anteriores o no, basado
siempre en el fichero de configuración.
vi pg_backup.config
ahora deberemos añadir la siguiente linea en las dos scripts .sh para que cuando lo ejecutemos desde
crontab, encuentre los binarios necesarios.
PATH=/Library/PostgreSQL/9.6/bin/:/usr/local/bin:/usr/local/sbin:~/bin:/usr/bin:/bin:/usr/sbin:/sbin
para ello
#!/bin/bash PATH=/Library/PostgreSQL/9.6/bin/:/usr/local/bin:/usr/local/sbin:
~/bin:/usr/bin:/bin:/usr/sbin:/sbin ########################### ####### LOAD
CONFIG ####### ###########################
2/6
System Admin
Tutoriales para IT Admins.
Por ultimo lo añadimos al crontab de la maquina en el horario que queramos, 1 vez al día y realizara el
http://system-admin.es
backup según tengamos configurado el archivo de configuración.
recordar que podemos crear un archivo de log, simplemente haciendo tubería desde el crontab,quedando
el crontab por ejemplo de la siguiente forma.
También podemos hacer que nos lo mande por correo añadiendo lo siguiente en el crontab
Esta orden hace que mande un mail a admin@dominio.com a las 6:30 de la mañana con el fichero de log.
scripts necesarias
pg_backup.config
3/6
System Admin
Tutoriales para IT Admins.
http://system-admin.es
pg_backup.sh
4/6
System Admin
Tutoriales para IT Admins.
pg_database where not datistemplate and datallowconn $EXCLUDE_SCHEMA_ONLY_CLA
http://system-admin.es
USE order by datname;" echo -e "\n\nPerforming full backups" echo -e "---
-----------------------------------------\n" for DATABASE in `psql -h "$HO
STNAME" -U "$USERNAME" -At -c "$FULL_BACKUP_QUERY" postgres` do if [ $ENABL
E_PLAIN_BACKUPS = "yes" ] then echo "Plain backup of $DATABASE" if
! pg_dump -Fp -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP
_DIR"$DATABASE".sql.gz.in_progress; then echo "[!!ERROR!!] Failed to produ
ce plain backup database $DATABASE" 1>&2 else mv $FINAL_BACKUP_DIR"$DAT
ABASE".sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE".sql.gz fi fi
if [ $ENABLE_CUSTOM_BACKUPS = "yes" ] then echo "Custom backup of $DATABA
SE" if ! pg_dump -Fc -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" -f $FINAL
_BACKUP_DIR"$DATABASE".custom.in_progress; then echo "[!!ERROR!!] Failed t
o produce custom backup database $DATABASE" 1>&2 else mv $FINAL_BACKUP_
DIR"$DATABASE".custom.in_progress $FINAL_BACKUP_DIR"$DATABASE".custom fi
fi done echo -e "\nAll database backups complete!"
pg_backup_rotated.sh
5/6
System Admin
Tutoriales para IT Admins.
#############
http://system-admin.es for SCHEMA_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ } do
SCHEMA_ONLY_CLAUSE="$SCHEMA_ONLY_CLAUSE or datname ~ '$SCHEMA_ONLY_DB'" d
one SCHEMA_ONLY_QUERY="select datname from pg_database where false $SCHEM
A_ONLY_CLAUSE order by datname;" echo -e "\n\nPerforming schema-only back
ups" echo -e "--------------------------------------------\n" SCHEMA_ON
LY_DB_LIST=`psql -h "$HOSTNAME" -U "$USERNAME" -At -c "$SCHEMA_ONLY_QUERY" pos
tgres` echo -e "The following databases were matched for schema-only back
up:\n${SCHEMA_ONLY_DB_LIST}\n" for DATABASE in $SCHEMA_ONLY_DB_LIST do
echo "Schema-only backup of $DATABASE" if ! pg_dump -Fp
-s -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATA
BASE"_SCHEMA.sql.gz.in_progress; then echo "[!!ERROR!!] Fail
ed to backup database schema of $DATABASE" 1>&2 else
mv $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress $FINAL_BACKUP_DIR
"$DATABASE"_SCHEMA.sql.gz fi done ########################
### ###### FULL BACKUPS ####### ########################### for SCHEM
A_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ } do EXCLUDE_SCHEMA_ONLY_CLAUSE="$EXC
LUDE_SCHEMA_ONLY_CLAUSE and datname !~ '$SCHEMA_ONLY_DB'" done FULL_BAC
KUP_QUERY="select datname from pg_database where not datistemplate and datallo
wconn $EXCLUDE_SCHEMA_ONLY_CLAUSE order by datname;" echo -e "\n\nPerform
ing full backups" echo -e "--------------------------------------------\n"
for DATABASE in `psql -h "$HOSTNAME" -U "$USERNAME" -At -c "$FULL_BACKUP_Q
UERY" postgres` do if [ $ENABLE_PLAIN_BACKUPS = "yes" ] then echo
"Plain backup of $DATABASE" if ! pg_dump -Fp -h "$HOSTNAME" -U "$USERNA
ME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress; then
echo "[!!ERROR!!] Failed to produce plain backup database $DATABASE" 1>&
2 else mv $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress $FINAL_BACK
UP_DIR"$DATABASE".sql.gz fi fi if [ $ENABLE_CUSTOM_BACKUPS = "yes
" ] then echo "Custom backup of $DATABASE" if ! pg_dump -Fc -h "
$HOSTNAME" -U "$USERNAME" "$DATABASE" -f $FINAL_BACKUP_DIR"$DATABASE".custom.i
n_progress; then echo "[!!ERROR!!] Failed to produce custom backup databa
se $DATABASE" else mv $FINAL_BACKUP_DIR"$DATABASE".custom.in_progress
$FINAL_BACKUP_DIR"$DATABASE".custom fi fi done echo -e "\nAl
l database backups complete!" } # MONTHLY BACKUPS DAY_OF_MONTH=`date
+%d` if [ $DAY_OF_MONTH -eq 1 ]; then # Delete all expired monthly dire
ctories find $BACKUP_DIR -maxdepth 1 -name "*-monthly" -exec rm -rf '{}' ';'
perform_backups "-monthly" exit 0; fi # WEEKLY BACKUPS DAY
_OF_WEEK=`date +%u` #1-7 (Monday-Sunday) EXPIRED_DAYS=`expr $((($WEEKS_TO_KEE
P * 7) + 1))` if [ $DAY_OF_WEEK = $DAY_OF_WEEK_TO_KEEP ]; then # Delete
all expired weekly directories find $BACKUP_DIR -maxdepth 1 -mtime +$EXPIRE
D_DAYS -name "*-weekly" -exec rm -rf '{}' ';' perform_backups "-weekly"
exit 0; fi # DAILY BACKUPS # Delete daily backups 7 days old or m
ore find $BACKUP_DIR -maxdepth 1 -mtime +$DAYS_TO_KEEP -name "*-daily" -exec
rm -rf '{}' ';' perform_backups "-daily"
Y LISTO!
Agur!