RMAN sous PostgreSQL

Vous cherchez un équivalent de RMAN (Recovery Manager) pour sauvegarder et restaurer vos bases PostgreSQL en toute simplicité et sérénité, tout comme sur vos bases Oracle ?
Ne cherchez plus, et testez la solution communautaire pg_rman !
Cet article vous explique comment récupérer la version communautaire de pg_rman et comment l’utiliser.

 

1) téléchargement du composant pg_rman

Le site https://github.com/ossc-db/pg_rman/releases est régulièrement mis à jour, et suit les évolutions des versions de PostgreSQL.

Vous y trouverez également toute la littérature autour du produit (releases notes, corrections, nouvelles fonctionnalités), ainsi que le produit en lui-même.
Le plus simple est de télécharger le paquet RPM, mais vous pouvez également télécharger la version *.TAR pour personnaliser l’installation du composant.

 

2) Installation du composant

Une fois le paquet RPM téléchargé, placez-le dans le répertoire de votre choix, et installez pg_rman avec la commande suivante :

yum install pg_rman-1.3.6-1.pg96.rhel7.x86_64.rpm

 

3) Présentation rapide du produit

Lorsque le produit est installé, il vous suffit d’exécuter la commande suivante pour en apprécier ses nombreuses options ainsi que sa simplicité d’usage :

$ pg_rman --help
pg_rman manage backup/recovery of PostgreSQL database.

Usage:
  pg_rman OPTION init
  pg_rman OPTION backup
  pg_rman OPTION restore
  pg_rman OPTION show [DATE]
  pg_rman OPTION show detail [DATE]
  pg_rman OPTION validate [DATE]
  pg_rman OPTION delete DATE
  pg_rman OPTION purge

Common Options:
  -D, --pgdata=PATH         location of the database storage area
  -A, --arclog-path=PATH    location of archive WAL storage area
  -S, --srvlog-path=PATH    location of server log storage area
  -B, --backup-path=PATH    location of the backup storage area
  -c, --check               show what would have been done
  -v, --verbose             show what detail messages
  -P, --progress            show progress of processed files

Backup options:
  -b, --backup-mode=MODE    full, incremental, or archive
  -s, --with-serverlog      also backup server log files
  -Z, --compress-data       compress data backup with zlib
  -C, --smooth-checkpoint   do smooth checkpoint before backup
  -F, --full-backup-on-error   switch to full backup mode
                               if pg_rman cannot find validate full backup
                               on current timeline
      NOTE: this option is only used in --backup-mode=incremental or archive.
  --keep-data-generations=NUM keep NUM generations of full data backup
  --keep-data-days=NUM        keep enough data backup to recover to N days ago
  --keep-arclog-files=NUM   keep NUM of archived WAL
  --keep-arclog-days=DAY    keep archived WAL modified in DAY days
  --keep-srvlog-files=NUM   keep NUM of serverlogs
  --keep-srvlog-days=DAY    keep serverlog modified in DAY days
  --standby-host=HOSTNAME   standby host when taking backup from standby
  --standby-port=PORT       standby port when taking backup from standby

Restore options:
  --recovery-target-time    time stamp up to which recovery will proceed
  --recovery-target-xid     transaction ID up to which recovery will proceed
  --recovery-target-inclusive whether we stop just after the recovery target
  --recovery-target-timeline  recovering into a particular timeline
  --hard-copy                 copying archivelog not symbolic link

Catalog options:
  -a, --show-all            show deleted backup too

Delete options:
  -f, --force               forcibly delete backup older than given DATE

Connection options:
  -d, --dbname=DBNAME       database to connect
  -h, --host=HOSTNAME       database server host or socket directory
  -p, --port=PORT           database server port
  -U, --username=USERNAME   user name to connect as
  -w, --no-password         never prompt for password
  -W, --password            force password prompt

Generic options:
  -q, --quiet               don't show any INFO or DEBUG messages
  --debug                   show DEBUG messages
  --help                    show this help, then exit
  --version                 output version information, then exit

Read the website for details. <http://github.com/ossc-db/pg_rman>
Report bugs to <http://github.com/ossc-db/pg_rman/issues>.

L’aide en ligne de pg_rman est assez bien faite pour y trouver rapidement son bonheur, mais comme beaucoup d’options sont disponibles, nous nous contenterons dans cet article de balayer que les plus courantes.

 

4) Initialisation de pg_rman

Pour pouvoir utiliser pg_rman, il vous faut tout d’abord l’initialiser.
Cette étape consiste en la création d’un référentiel constitué par un ensemble de fichiers plats permettant à pg_rman d’historiser les actions menées en termes de sauvegardes et restaurations, un peu à la façon d’un control file ou d’un catalogue RMAN sur une base Oracle.

Ce référentiel sera créé dans le répertoire fourni dans la variable BACKUP_PATH :

$ pg_rman init --backup-path=/postgres/backup
  Ou
$ export BACKUP_PATH=/postgres/backup
$ pg_rman init
INFO: ARCLOG_PATH is set to '/postgres/wal'
INFO: SRVLOG_PATH is set to '/postgres/data/log'

Le référentiel est maintenant créé :
$ ls /postgres/backup/
backup pg_rman.ini system_identifier timeline_history

Le fichier PG_RMAN.INI généré par la commande « pg_rman init » vous permet de personnaliser la façon dont vous souhaitez gérer vos sauvegardes.

Par exemple, pour effectuer par défaut vos sauvegardes en mode compressé, en sauvegardant les fichiers de log (traces), en mode FULL et en ne conservant que les 7 derniers jours de sauvegardes, voici à quoi ressemblerait votre fichier de paramètres :

$ cat pg_rman.ini

ARCLOG_PATH='/postgres/wal'
SRVLOG_PATH='/postgres/data/log'
KEEP_DATA_DAYS=7
COMPRESS_DATA=YES
WITH_SERVERLOG=YES
BACKUP_MODE=full

 

5) Sauvegarde

La sauvegarde est réalisée via la commande pg_rman backup et permet la sauvegarde de l’ensemble des bases contenues dans votre instance postgreSQL, référencée par la variable d’environnement PGDATA.

3 options de sauvegardes sont disponibles :

  • –backup_mode = FULL (sauvegarde complète)
  • –backup_mode = INCREMENTAL (sauvegarde incrémentale)
  • –backup_mode = ARCHIVE (sauvegarde des archives de fichiers WAL)

Remarque : les WAL (write-ahead log) sont les équivalents des REDOLOGS sur une base Oracle.

La commande pg_rman backup sera systématiquement suivie d’une commande pg_rman validate pour passer son status de DONE à OK.

$ pg_rman backup --backup-path=/postgres/backup --backup-mode=full
INFO: copying database files
INFO: copying archived WAL files
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
INFO: start deleting old backup (keep after = 2018-11-15 00:00:00)
INFO: does not include the backup just taken

$ pg_rman validate
INFO: validate: "2018-11-22 16:16:18" backup and archive log files by CRC
INFO: backup "2018-11-22 16:16:18" is valid
INFO: validate: "2018-11-22 16:18:22" backup and archive log files by CRC
INFO: backup "2018-11-22 16:18:22" is valid

 

6) Situation des sauvegardes

Pour permettre de visualiser les sauvegardes réalisées sur votre instance ainsi que leur status, la commande pg_rman show vous donne le résultat suivant :

$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2018-11-22 16:28:59  2018-11-22 16:29:06  FULL    12MB     1  DONE
2018-11-22 16:22:26  2018-11-22 16:22:29  INCR    54kB     1  OK
2018-11-22 16:20:57  2018-11-22 16:20:59  ARCH    26kB     1  OK
2018-11-22 16:19:28  2018-11-22 16:19:28  ARCH      0B     0  ERROR
2018-11-22 16:18:22  2018-11-22 16:18:32  FULL    20MB     1  OK
2018-11-22 16:16:18  2018-11-22 16:16:33  FULL    20MB     1  OK

Remarquez au passage le rappel du type de backup réalisé : full, incrémental ou archive.

 

7) Restauration

Nous décrirons dans cet article les deux principaux cas d’usage de la restauration : la restauration complète (jusqu’à l’instant présent), et la restauration jusqu’à un instant particulier (ex: demande de restauration à hier soir 22h34, heure à laquelle un traitement applicatif est venu corrompre la base).

Vous devez tout d’abord arrêter l’instance avant de la restaurer en exécutant la commande suivante :

$ pg_ctl stop -m fast

Si toutefois, vous oubliez de l’arrêter, postgreSQL vous le signalera par un message du style :

$ pg_rman restore
ERROR: PostgreSQL server is running
HINT: Please stop PostgreSQL server before executing restore.

7.1) Restauration complète

C’est le scénario le plus simple et le plus classique où vous avez perdu un disque, où quelqu’un a supprimé des fichiers appartenant à la base, et vous n’avez plus d’autres solutions que de la restaurer pour pouvoir récupérer toutes vos données.

$ pg_rman restore --backup_path=/postgres/backup
  Ou
$ export BACKUP_PATH=/postgres/backup
$ pg_rman restore

INFO: the recovery target timeline ID is not given
INFO: use timeline ID of latest full backup as recovery target: 1
INFO: calculating timeline branches to be used to recovery target point
INFO: searching latest full backup which can be used as restore start point
INFO: found the full backup can be used as base in recovery: "2018-11-22 16:28:59"
INFO: copying online WAL files and server log files
INFO: clearing restore destination
INFO: validate: "2018-11-22 16:28:59" backup, archive log files and server log files by SIZE
INFO: backup "2018-11-22 16:28:59" is valid
INFO: restoring database files from the full mode backup "2018-11-22 16:28:59"
INFO: searching incremental backup to be restored
INFO: searching backup which contained archived WAL files to be restored
INFO: backup "2018-11-22 16:28:59" is valid
INFO: restoring WAL files from backup "2018-11-22 16:28:59"
INFO: restoring online WAL files and server log files
INFO: generating recovery.conf
INFO: restore complete
HINT: Recovery will start automatically when the PostgreSQL server is started.

En fin d’exécution de cette commande, tous les fichiers nécessaires ont été restaurés, et le démarrage de l’instance va réappliquer les transactions contenues dans les fichiers WAL de manière automatique et ouvrir la base aux utilisateurs.

Pour démarrer l’instance :

$ pg_ctl start

7.2) Restauration partielle (point in time recovery)

Cette demande de restauration peut servir à restaurer une situation de base juste avant le déclenchement d’un traitement applicatif qui y aurait corrompu les données.

Par exemple, on souhaite restaurer la base au 22/11/2018 à 16:18:22 :

$ pg_rman restore --recovery-target-time='2018-11-22 16:18:22'
INFO: the recovery target timeline ID is not given
INFO: use timeline ID of current database cluster as recovery target: 1
INFO: calculating timeline branches to be used to recovery target point
INFO: searching latest full backup which can be used as restore start point
INFO: found the full backup can be used as base in recovery: "2018-11-22 16:16:18"
INFO: copying online WAL files and server log files
INFO: clearing restore destination
INFO: validate: "2018-11-22 16:16:18" backup and archive log files by SIZE
INFO: backup "2018-11-22 16:16:18" is valid
INFO: restoring database files from the full mode backup "2018-11-22 16:16:18"
INFO: searching incremental backup to be restored
INFO: searching backup which contained archived WAL files to be restored
INFO: backup "2018-11-22 16:16:18" is valid
INFO: restoring WAL files from backup "2018-11-22 16:16:18"
INFO: backup "2018-11-22 16:18:22" is valid
INFO: restoring WAL files from backup "2018-11-22 16:18:22"
INFO: validate: "2018-11-22 16:20:57" archive log files by SIZE
INFO: backup "2018-11-22 16:20:57" is valid
INFO: restoring WAL files from backup "2018-11-22 16:20:57"
INFO: backup "2018-11-22 16:22:26" is valid
INFO: restoring WAL files from backup "2018-11-22 16:22:26"
INFO: backup "2018-11-22 16:28:59" is valid
INFO: restoring WAL files from backup "2018-11-22 16:28:59"
INFO: restoring online WAL files and server log files
INFO: generating recovery.conf
INFO: restore complete
HINT: Recovery will start automatically when the PostgreSQL server is started.

Redémarrons l’instance par la commande « pg_ctl start » et tentons de nous y connecter et d’y exécuter une transaction.

$ psql
demo=# create table toto (a integer) ;
ERREUR:  ne peut pas exécuter CREATE TABLE dans une transaction en lecture seule

La consultation du fichier de logs postgreSQL nous informe que la base n’est accessible qu’en lecture seule et nécessite une intervention de votre part pour permettre un accès en lecture – écriture.

2018-11-22 16:37:16.041 CET [4690] LOG:  début de la restauration de l'archive à 2018-11-22 16:18:22+01
2018-11-22 16:37:16.086 CET [4690] LOG:  restauration du journal de transactions « 00000001000000000000000A » à partir de l'archive
2018-11-22 16:37:16.413 CET [4690] LOG:  la ré-exécution commence à 0/A000028
2018-11-22 16:37:16.419 CET [4690] LOG:  état de restauration cohérent atteint à 0/A0000F8
2018-11-22 16:37:16.421 CET [4688] LOG:  le système de bases de données est prêt pour accepter les connexions en lecture seule
2018-11-22 16:37:16.492 CET [4690] LOG:  restauration du journal de transactions « 00000001000000000000000B » à partir de l'archive
2018-11-22 16:37:16.873 CET [4690] LOG:  restauration du journal de transactions « 00000001000000000000000C » à partir de l'archive
2018-11-22 16:37:17.050 CET [4690] LOG:  restauration du journal de transactions « 00000001000000000000000D » à partir de l'archive
2018-11-22 16:37:17.157 CET [4690] LOG:  arrêt de la restauration avant validation de la transaction 572, 2018-11-22 16:18:29.697993+01
2018-11-22 16:37:17.157 CET [4690] LOG:  restauration en pause
2018-11-22 16:37:17.157 CET [4690] ASTUCE :  Exécuter pg_wal_replay_resume() pour continuer.

Il suffit alors d’exécuter la fonction suggérée par postgreSQL pour retrouver un accès complet à votre base de données.

$ psql
psql (10.5)
Type "help" for help.
demo=# select pg_wal_replay_resume() ;

 

8) Purge des jeux de sauvegardes

Dernière commande que je souhaite vous présenter dans cet article, pour permettre une bonne gestion de votre espace disques : la commande « pg_rman purge » qui permet la suppression automatique et maîtrisée de vos sauvegardes en fonction de la rétention que vous avez paramétrée dans le fichier PG_RMAN.INI.

ex: KEEP_DATA_DAYS=7 pour ne conserver dans le répertoire de backup que les jeux de sauvegardes vous permettant de restaurer une situation de base remontant jusqu’aux 7 derniers jours d’activité.

 

Voilà, j’en ai fini avec les commandes essentielles vous permettant de gérer vos sauvegardes d’environnements postgreSQL de manière simple et efficace.

J’espère au travers de cet article vous avoir convaincu de la simplicité d’usage de ce formidable outil, et surtout vous avoir donné envie de l’essayer et de l’utiliser dans vos environnements PostgreSQL.

Découvrez également nos formations certifiantes PostgreSQL.