PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 12.20 » Internes » Protocole client/serveur » Formats des messages de la réplication logique

52.9. Formats des messages de la réplication logique

Cette section décrit le format détaillé de chaque message de réplication logique. Ces messages sont renvoyés soit par l'interface SQL des slots de réplication, soit par un walsender. Dans le cas d'un walsender, ils sont encapsulés dans les messages WAL du protocole de réplication comme décrits dans Section 52.4 et obéissent généralement au même flux de message que celui de la réplication physique.

Begin

Byte1('B')

Identifie le message comme un message begin.

Int64

Le LSN final de la transaction.

Int64

Horodatage de la validation de la transaction. La valeur est le nombre de microsecondes depuis l'epoch PostgreSQL (2000-01-01).

Int32

Xid de la transaction.

Commit

Byte1('C')

Identifie le message comme un message de validation (commit).

Int64

Le LSN de la validation.

Int64

Le LSN final de la transaction.

Int64

Horodatage de la validation de la transaction. La valeur est le nombre de microsecondes depuis l'epoch PostgreSQL (2000-01-01).

Origin

Byte1('O')

Identifie le message comme un message d'origine.

Int64

Le LSN de la validation sur le serveur origine.

String

Nom de l'origine.

Notez qu'il peut y avoir plusieurs messages Origin à l'intérieur d'une simple transaction.

Relation

Byte1('R')

Identifie le message comme un message relation.

Int32

ID de la relation.

String

Schéma (chaîne vide pour pg_catalog).

String

Nom de la relation.

Int8

Configuration de l'identité du réplicat pour la relation (identique à relreplident dans pg_class).

Int16

Nombre de colonnes.

Ensuite, la partie suivante du message apparaît pour chaque colonne (excepté les colonnes générées) :

Int8

Drapeaux pour la colonne. Actuellement, soit 0 pour aucun drapeau, soit 1 pour marquer la colonne comme faisant partie de la clé.

String

Nom de la colonne.

Int32

ID du type de données de la colonne.

Int32

Modifieur de type de la colonne (atttypmod).

Type

Byte1('Y')

Identifie le message comme un message type.

Int32

ID du type de données.

String

Schéma (chaîne vide pour pg_catalog).

String

Nom du type de données.

Insert

Byte1('I')

Identifie le message comme un message insert.

Int32

ID de la relation correspondant à l'ID dans le message relation.

Byte1('N')

Identifie le message suivant TupleData comme une nouvelle ligne.

TupleData

Partie du message TupleData représentant le contenu de la nouvelle ligne.

Update

Byte1('U')

Identifie le message comme un message update.

Int32

ID de la relation correspondant à l'ID dans le message relation.

Byte1('K')

Identifie le sous-message TupleData suivant comme une clé. Ce champ est optionnel et seulement présent si la mise à jour a modifié des données dans une colonne faisant partie d'un index REPLICA IDENTITY.

Byte1('O')

Identifie le sous-message TupleData suivant comme une ancienne ligne. Ce champ est optionnel et est seulement présent si la table dans laquelle la mise à jour est survenue a REPLICA IDENTITY configuré à FULL.

TupleData

Partie du message TupleData représentant le contenu de l'ancienne ligne ou de la clé primaire. Seulement présent si la partie 'O' ou 'K' est présente.

Byte1('N')

Identifie le message TupleData suivant comme une nouvelle ligne.

TupleData

Partie du message TupleData représentant le contenu de la nouvelle ligne

Le message Update peut contenir soit une partie message 'K' ou une partie message 'O' ou ni l'un ni l'autre, mais jamais les deux.

Delete

Byte1('D')

Identifie le message comme un message delete.

Int32

ID de la relation correspondant à l'ID dans le message relation.

Byte1('K')

Identifie le sous-message TupleData suivant comme une clé. Ce champ est présent si la table où survient la suppression utilise un index comme REPLICA IDENTITY.

Byte1('O')

Identifie le message TupleData suivant comme ancienne ligne. Ce champ est présent si la table dans laquelle la suppression est survenue a REPLICA IDENTITY configuré à FULL.

TupleData

La partie du message TupleData représentant le contenu de l'ancienne ligne ou la clé primaire, suivant le champ précédent.

Le message Delete peut contenir soit une partie message 'K' soit une partie message 'O', mais jamais les deux.

Truncate

Byte1('T')

Identifies the message as a truncate message.

Int32

Nombre de relations

Int8

Bits en option pour TRUNCATE: 1 pour CASCADE, 2 pour RESTART IDENTITY

Int32

ID de la relation correspondant à l'ID dans le message de relation. Ce champ est répété pour chaque relation.

Les parties suivantes du message sont partagées par les messages ci-dessus.

TupleData

Int16

Nombre de colonnes.

Ensuite, un des sous-messages suivants apparaît pour chaque colonne (excepté les colonnes générées) :

Byte1('n')

Identifie la donnée comme une valeur NULL.

Or

Byte1('u')

Identifie une valeur TOAST non modifiée (la valeur réelle n'est pas envoyée).

Or

Byte1('t')

Identifie la donnée comme une valeur formatée en texte.

Int32

Longueur de la valeur de la colonne.

Byten

La valeur de la colonne au format texte. (Une prochaine version pourrait supporter des formats supplémentaires.) n est la longueur ci-dessus.