Récupération ponctuelle PostgreSQL (sauvegarde incrémentielle)

La «récupération à un moment précis» (PITR) de PostgreSQL est également appelée sauvegarde incrémentielle de base de données, sauvegarde en ligne ou sauvegarde d’archive. Le serveur PostgreSQL enregistre toutes les transactions de modification des données des utilisateurs, telles que l’insertion, la mise à jour ou la suppression, et les écrit dans un fichier journal WAL (write-ahead). Ce mécanisme utilise les enregistrements d’historique stockés dans le fichier WAL pour appliquer les modifications apportées depuis la dernière sauvegarde complète de la base de données.

Avantages

  1. Zéro temps d’arrêt - La sauvegarde incrémentielle de la base de données est importante pour

système critique qui ne peut pas se permettre même une minute de temps mort. Avec la récupération à un moment précis, le temps d’immobilisation de la sauvegarde de la base de données peut être totalement éliminé, car ce mécanisme peut effectuer la sauvegarde de la base de données et l’accès au système simultanément.

  1. Enregistrer la taille de stockage - avec la sauvegarde incrémentielle de la base de données, nous sauvegardons la

le dernier fichier journal d’archive depuis la dernière sauvegarde au lieu d’une sauvegarde complète de la base de données quotidienne.

Si les avantages ci-dessus vous concernent, vous devez toujours mettre en œuvre une sauvegarde incrémentielle de la base de données. Ici, je montre comment faire la récupération à un moment donné (sauvegarde incrémentielle) sur le serveur PostgreSQL.

Tutoriels commencés ~ long voyage, patient …​

Initialisation de la base de données

  • 1) Créez une base de données de test, tous les fichiers de base de données sous/usr/local/pgsql/pgDataPITR/**

Initialiser la base de données

…​.[mkyong]$ initdb -D/usr/local/pgsql/pgDataPITR/…​.

Démarrer la base de données

…​.[mkyong]$ pg__ctl start -D/usr/local/pgsql/pgDataPITR/…​.

  • 2) Modifier le fichier de configuration Postgresql (postgresql.conf) ** , nous devons apporter quelques modifications au fichier postgresql.conf pour indiquer à PostgreSQL comment copier ou archiver les fichiers WAL générés à partir du serveur PostgreSQL.

Modifier postgresql.conf

…​.[mkyong]$ vi postgresql.conf

Apportez les modifications suivantes dans postgresql.conf

archive command = on archive command = 'cp %p/usr/local/pgsql/pgDataPITR/wals/%f'

Créer un dossier wals

....[mkyong]$ mkdir/usr/local/pgsql/pgDataPITR/wals

Redémarrer la base de données

…​.[mkyong]$ pg ctl stop -D/usr/local/pgsql/pgDataPITR/[mkyong]$ pg ctl start -D/usr/local/pgsql/pgDataPITR/…​.

  • Attention!!! Comprendre comment PostgreSQL gère les fichiers journaux, pg xlog et le journal d’archivage ** pg xlog est un dossier de fichier journal PostgreSQL permettant de stocker tous les enregistrements de l’historique des données. Il est situé dans/usr/local/pgsql/pgDataPITR/pg xlog. Par exemple, lorsque l’utilisateur insère, met à jour ou supprime un enregistrement, toutes les transactions que hisroty créera ou ajoutera automatiquement à un fichier journal de fichier sous le dossier pg xlog. Le format du fichier journal ressemble au format suivant: 000000010000000000000001 → 000000010000000000000006

Par exemple,

…​.[postgres@localhost pg__xlog]$ ls -lsh total 113M 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:25 000000010000000000000006

Chaque fichier journal peut gérer environ 16 millions de données. Lorsqu'il dépasse cette limite, il crée automatiquement un nouveau fichier journal. Le nom du fichier est 0-9 et A à Z

000000010000000000000001 ..

.. 000000010000000000000009 ..

.. 00000001000000000000000A ..

.. 00000001000000000000000Z

Il s’agit des fichiers journaux que nous allons utiliser en tant que récupération aval PostgreSQL Point-in-Time :)

** Attention!!! Vous souvenez-vous encore que nous configurons le chemin de fichier WAL dans le fichier postgresql.conf? **

archive command = on archive command = 'cp %p/usr/local/pgsql/pgDataPITR/wals/%f'

Cela signifie que lorsque le dossier pg__xlog atteint certaines limites, comme 6 fichiers journaux contiennent chacun 16 millions d'euros, lorsque PostgreSQL tente d'insérer un nouvel enregistrement d'historique et détecte que pg__xlog est saturé, il archive automatiquement le fichier historique le plus ancien et le déplace vers ** /usr/local/pgsql/pgDataPITR/wals ** .

**  Attention !!! **  Nous devons sauvegarder ces fichiers d'archives en continu (c'est pourquoi nous appelons une sauvegarde incrémentielle :)). Nous n'avons plus besoin de faire une sauvegarde complète de la base de données, mais nous sauvegardons constamment ces fichiers journaux d'archives.

Dossier important des fichiers journaux

..../usr/local/pgsql/pgDataPITR/pg__xlog/usr/local/pgsql/pgDataPITR/wals

Simulation des données et processus de sauvegarde

Créer des tables et des enregistrements factices - nous créerons de manière dynamique 455 252 enregistrements dans une nouvelle table. 400 000 enregistrements forceront PostgreSQL ™ à créer suffisamment de fichiers journaux dans le dossier pg xlog et déclenchera le processus d’archivage pour archiver les fichiers journaux à partir de /usr/local/pgsql/pgDataPITR./pg xlog à /usr/local/pgsql/pgDataPITR/wals , chaque fichier de journal contient environ 16 millions de fichiers.

  • 1) Table testPITR1 créée le 2008-11-25 17: 17 **

# psql
# select (** ) from pg__class; –- contain 229 records
# select (** ) from pg__description; –- contains 1988 records

# create table testPITR1 as select **  from pg__class, pg__description;
#--totally 229 x 1988 = 455,252 records
# select **  from current__timestamp; –-2008-11-25 17:17

Les fichiers de log ressemblent à suivre

…​.[postgres@localhost pgDataPITR]$ cd pg xlog/[postgres@localhost pg xlog]$ ls -lsh total 113M 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:25 000000010000000000000006 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:16 000000010000000000000007 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000008 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000009 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000A 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000B 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 00000001000000000000000C [postgres@localhost pgDataPITR]$ cd wals[postgres@localhost wals]$ ls -lsh total 97M 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000000 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000001 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000002 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000003 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000004 17M -rw——- 1 postgres postgres 16M 2008-11-25 17:17 000000010000000000000005

**  2) Créer une sauvegarde de base de données complète - sauvegarde de base **