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

53.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 53.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.

Message

Byte1('M')

Identifie le message comme un message décodé logiquement.

Int32

Xid de la transaction (présent seulement pour les transactions diffusées). Ce champs est disponible à partir de la version 2 du protocole.

Int8

Drapeaux ; soit 0 pour aucun drapeau soit 1 si le message de décodage logique est transactionnel.

Int64

Le LSN du message de décodage logique.

String

Le préfixe du message de décodage logique.

Int32

Longueur du contenu.

Byten

Le contenu du message de décodage logique.

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

Xid de la transaction (présent uniquement pour les transactions par flux). Ce champ est disponible à partir de la version 2 du protocole.

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

Xid de la transaction (présent uniquement pour les transactions par flux). Ce champs est disponible à partir de la version 2 du protocole.

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

Xid de la transaction (présent uniquement pour les transactions par flux). Ce champs est disponible à partir de la version 2 du protocole.

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

Xid de la transaction (présent uniquement pour les transactions par flux). Ce champs est disponible à partir de la version 2 du protocole.

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

Xid de la transaction (présent uniquement pour les transactions par flux). Ce champs est disponible à partir de le version 2 du protocole.

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')

Identifie le message comme un message de troncation.

Int32

Xid de la transaction (présent uniquement pour les transactions par flux). Ce champs est disponible à partir de la version 2 du protocole.

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 message suivants (Stream Start, Stream Stop, Stream Commit, et Stream Abort) sont disponibles à partir de la version 2 du protocole.

Stream Start

Byte1('S')

Identifie le message comme un message de début de flux.

Int32

Xid de la transaction.

Int8

Une valeur de 1 indique que c'est le premier segment de flux pour ce XID, 0 pour tout autre segment de flux.

Stream Stop

Byte1('E')

Identifie le message comme un message d'arrêt de flux.

Stream Commit

Byte1('c')

Identifie le message comme un message de commit de diffusion.

Int32

Xid de la transaction.

Int8

Drapeaux ; actuellement inutilisés (doit être 0).

Int64

Le LSN du commit.

Int64

Le LSN de fin de transaction.

Int64

L'horodatage du commit de la transaction. La valeur est un nombre de microsecondes depuis l'époch PostgreSQL (2000-01-01).

Stream Abort

Byte1('A')

Identifie le message comme un message d'annulation de flux

Int32

Xid de la transaction.

Int32

+ Xid de la sous-transaction (sera le même que le xid de la transaction pour les transactions de niveau opérationnel).

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.

Ou

Byte1('u')

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

Ou

Byte1('t')

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

Ou

Byte1('b')

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

Int32

Longueur de la valeur de la colonne.

Byten

La valeur de la colonne au format binaire ou texte (suivant l'octet de format précédent). n est la longueur ci-dessus.