Mediante barman (pgbarman) podremos automatizar los backups y restauraciones de bases de datos PostgreSQL
En CentOS, simplemente deberemos instalar el paquete desde EPEL y configurar unos mínimos (/etc/barman/barman.conf)
[barman] barman_home = /var/lib/barman barman_user = barman log_file = /var/log/barman/barman.log compression = gzip configuration_files_directory = /etc/barman.d
También deberemos configurar acceso mediante claves SSH (sin contraseña) en ambas direcciones desde el servidor de barman al usuario de la base de datos de las instancias que queramos hacer backup.
La configuración de los backups los haremos en ficheros independientes en el directorio /etc/barman.d para mayor comodidad, por ejemplo /etc/barman.d/pgm.conf
[pgm] description = "postgres master" ssh_command = ssh postgres@192.168.56.29 conninfo = host=192.168.56.29 user=postgres retention_policy_mode = auto retention_policy = RECOVERY WINDOW OF 30 days wal_retention_policy = main
Mediante el comando show-server podremos buscar en que directorio deberemos dejar los archivados:
# barman show-server pgm | grep incoming_wals_directory incoming_wals_directory: /var/lib/barman/pgm/incoming
Mediante el modulo de puppet eyp-postgres podremos configurar un archive command para hacer rsync desde la base de datos al servidor.
class { 'postgresql': wal_level => 'hot_standby', max_wal_senders => '3', checkpoint_segments => '8', wal_keep_segments => '8', archive_mode => true, archive_command_custom => 'rsync -a %p barman@192.168.56.31:/var/lib/barman/pgm/incoming/%f', }
Una vez este todo configurado podremos hacer copias de seguridad mediante backup, por ejemplo:
# barman backup pgm Starting backup for server pgm in /var/lib/barman/pgm/base/20160415T165403 Backup start at xlog location: 0/3000020 (000000010000000000000003, 00000020) Copying files. Copy done. Asking PostgreSQL server to finalize the backup. Backup end at xlog location: 0/30000E0 (000000010000000000000003, 000000E0) Backup completed
Supongamos que tenemos ya el backup y hacemos lo siguiente en la base de datos:
postgres=# insert into test values('fuckthesystem'); INSERT 0 1 postgres=# select * from test; txt ------------------ sakura enlargeyourpenis fuckthesystem (3 rows) postgres=# delete from test; DELETE 2 postgres=# select * from test; val ----- (0 rows) postgres=#
Podremos ver el listado de backups disponibles mediante list-backup:
# barman list-backup pgm pgm 20160415T165403 - Fri Apr 15 14:54:04 2016 - Size: 19.3 MiB - WAL Size: 0 B
Para poder hacer la restauración necesitaremos algunos detalles del backup, los veremos mediante show-backup:
# barman show-backup pgm latest Backup 20160415T165403: Server Name : pgm Status : DONE PostgreSQL Version : 90216 PGDATA directory : /var/lib/pgsql/9.2/data Base backup information: Disk usage : 19.3 MiB Timeline : 1 Begin WAL : 000000010000000000000003 End WAL : 000000010000000000000003 WAL number : 0 Begin time : 2016-04-15 14:54:01.835645+02:00 End time : 2016-04-15 14:54:04.514398+02:00 Begin Offset : 32 End Offset : 224 Begin XLOG : 0/3000020 End XLOG : 0/30000E0 WAL information: No of files : 0 Disk usage : 0 B Last available : None Catalog information: Retention Policy : VALID Previous Backup : 20160415T142747 Next Backup : - (this is the latest base backup)
Necesitamos el nombre del backup y el “Begin time” exacto. Procedemos primero a parar la base de datos:
# /etc/init.d/postgresql-9.2 stop
A continuación indicamos a barman que recupere desde dicho backup indicando el begin time mediante –target-time y el nombre del backup. Podemos
# barman recover --target-time "2016-04-15 14:54:01.835645+02:00" --remote-ssh-command="ssh postgres@192.168.56.29" pgm 20160415T142747 /var/lib/pgsql/9.2/data Processing xlog segments for pgm 000000010000000000000001 000000010000000000000002 000000010000000000000003 000000010000000000000003.00000020.backup 000000010000000000000004 Starting remote restore for server pgm using backup 20160415T165403 Destination directory: /var/lib/pgsql/9.2/data Copying the base backup. Copying required wal segments. The archive_command was set to 'false' to prevent data losses. Your PostgreSQL server has been successfully prepared for recovery! Please review network and archive related settings in the PostgreSQL configuration file before starting the just recovered instance. WARNING: Before starting up the recovered PostgreSQL server, please review also the settings of the following configuration options as they might interfere with your current recovery attempt: external_pid_file = '/var/lock/subsys/postgresql-9.2' # write an extra PID file
Una vez recuperado, simplemente deberemos levantar la instancia:
/etc/init.d/postgresql-9.2 start
Si nos conectamos, veremos que tenemos los datos en el momento de hacer el backup:
[root@pgm ~]# psql -U postgres psql (9.2.16) Type "help" for help. postgres=# select * from test; txt ------------------ sakura enlargeyourpenis (2 rows) postgres=#
Tags: postgreSQL