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.