PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.1 » Internes » Protocole Frontend/Backend » 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 du slot de réplication soit par un walsender. Dans ce dernier cas, ils sont encapsulés à l'intérieur de messages WAL du protocole de réplication, comme décrit dans Section 53.4, et obéissent généralement au même flux de message que la réplication physique.

Begin #
Byte1('B')

Identifie le message comme un message begin.

Int64 (XLogRecPtr)

Le LSN final de la transaction.

Int64 (TimestampTz)

Horodatage de la validation de la transaction. La valeur est un nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Int32 (TransactionId)

Xid de la transaction.

Message #
Byte1('M')

Identifie the message comme un message de décodage logique.

Int32 (TransactionId)

Xid de la transaction (seulement présent pour les transactions en flux). Ce champ est disponible depuis la version 2 du protocole.

Int8

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

Int64 (XLogRecPtr)

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

Int8(0)

Drapeaux ; actuellement inutilisé.

Int64 (XLogRecPtr)

Le LSN du commit.

Int64 (XLogRecPtr)

Le LSN de fin de la transaction.

Int64 (TimestampTz)

Horodatage de la validation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Origin #
Byte1('O')

Identifie le message comme un message Origin.

Int64 (XLogRecPtr)

Le LSN de la validation sur le serveur d'origine.

String

Nom de l'origine.

Notez qu'il peut y avoir plusieurs messages Origin dans une même transaction.

Relation #
Byte1('R')

Identifie le message comme un message Relation.

Int32 (TransactionId)

XID de la transaction (seulement présent pour les transactions en flux). Ce champ est disponible à partir de la version 2 du protocole.

Int32 (Oid)

OID de la relation.

String

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

String

Nom de la relation.

Int8

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

Int16

Nombre de colonnes.

Ensuite, la partie suivante du message apparaît pour chaque colonne inclus dans la publication, à l'exception des colonnes générées :

Int8

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

String

Nom de la colonne.

Int32 (Oid)

OID 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 (TransactionId)

XID de la transaction (seulement présent pour les transactions en flux). Ce champ est disponible depuis la version 2 du protocole.

Int32 (Oid)

OID 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 (TransactionId)

XID de la transaction (seulement présent pour les transactions en flux). Ce champ est disponible depuis la version 2 du protocole.

Int32 (Oid)

OID de la relation correspondant ç l'identifiant du message Relation message.

Byte1('N')

Identifie le message TupleData suivant comme une nouvelle ligne.

TupleData

Message TupleData représentant le contenu de la nouvelle ligne.

Update #
Byte1('U')

Identifie le message comme un message Update.

Int32 (TransactionId)

XID de la transaction (seulement présent pour les transactions en flux). Ce champ est disponible depuis la version 2 du protocole.

Int32 (Oid)

OID de la relation correspondant à l'identifiant du message Relation message.

Byte1('K')

Identifie les sous-messages TupleData suivants comme une clé. Ce champ est optionnel et est présent uniquement si la mise à jour a modifié des données dans une des colonnes qui font partie de l'index REPLICA IDENTITY.

Byte1('O')

Identifie les sous-messages TupleData suivants comme une ancienne ligne. Ce champ est optionnel et est présent uniquement si la table ciblée par la mise à jour a REPLICA IDENTITY configuré à FULL.

TupleData

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

Byte1('N')

Identifie le message TupleData suivant comme la nouvelle ligne.

TupleData

Message TupleData représentant le contenu de la nouvelle ligne.

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

Delete #
Byte1('D')

Identifie the message comme un message Delete.

Int32 (TransactionId)

XID de la transaction (seulement présent pour les transactions en flux). Ce champ est disponible depuis la version 2 du protocole.

Int32 (Oid)

OID de la relation correspondant ç l'identifiant du message Relation message.

Byte1('K')

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

Byte1('O')

Identifie le message TupleData suivant comme une ancienne ligne. Ce champ est présent si la table ciblée par la suppression a le REPLICA IDENTITY configuré à FULL.

TupleData

Message TupleData représentant le contenu de l'ancienne ligne ou clé primaire, suivant le champ précédent.

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

Truncate #
Byte1('T')

Identifie le message comme un message Truncate.

Int32 (TransactionId)

XID de la transaction (seulement présent pour les transactions en flux). Ce champ est disponible depuis la version 2 du protocole.

Int32

Nombre de relations.

Int8

Options pour TRUNCATE : 1 pour CASCADE, 2 pour RESTART IDENTITY

Int32 (Oid)

OID de la relation correspondant à l'identifiant du message Relation. Ce champ est répété pour chaque relation.

Les messages suivants (Stream Start, Stream Stop, Stream Commit et Stream Abort) sont disponibles depuis la version 2 du protocole.

Stream Start #
Byte1('S')

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

Int32 (TransactionId)

Xid de la the transaction.

Int8

Une valeur de 1 indique qu'il s'agit du premier segment pour cet XID, et une valeur de 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 validation du flux.

Int32 (TransactionId)

XID de la transaction.

Int8(0)

Drapeaux ; actuellement inutilisé.

Int64 (XLogRecPtr)

Le LSN de la validation.

Int64 (XLogRecPtr)

Le LSN final de la transaction.

Int64 (TimestampTz)

Horodatage de la validation de la transaction. La valeur est un nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Stream Abort #
Byte1('A')

Identifie le message comme un message d'annulation de flux.

Int32 (TransactionId)

XID de la transaction.

Int32 (TransactionId)

XID de la sous-transaction (identique à l'XID de la transaction pour les transactions haut niveau).

Int64 (XLogRecPtr)

LSN de l'annulation. Ce champ est disponible à partir de la version 4 du protocole.

Int64 (TimestampTz)

Horodatage de l'annulation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (2000-01-01). Ce champ est disponible depuis la version 4 du protocole.

Les messages suivants (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared, Stream Prepare) sont disponibles depuis la version 3 du protocole.

Begin Prepare #
Byte1('b')

Identifie le message comme le début d'une transaction préparée.

Int64 (XLogRecPtr)

Le LSN de la préparation de la transaction.

Int64 (XLogRecPtr)

Le LSN final de la transaction préparée.

Int64 (TimestampTz)

Horodatage de la phase de préparation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Int32 (TransactionId)

XID de la transaction.

String

Le GID défini par l'utilisateur pour la transaction préparée.

Prepare #
Byte1('P')

Identifie le message comme un message de transaction préparée.

Int8(0)

Drapeaux ; actuellement inutilisé.

Int64 (XLogRecPtr)

Le LSN de la préparation.

Int64 (XLogRecPtr)

Le LSN final de la transaction préparée.

Int64 (TimestampTz)

Horodatage de la phase de préparation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Int32 (TransactionId)

XID de la transaction.

String

Le GID défini par l'utilisateur pour la transaction préparée.

Commit Prepared #
Byte1('K')

Identifie le message comme le message de validation d'une transaction préparée.

Int8(0)

Drapeaux ; actuellement inutilisé.

Int64 (XLogRecPtr)

Le LSN de la validation de la transaction préparée.

Int64 (XLogRecPtr)

Le LSN final de la validation de la transaction préparée.

Int64 (TimestampTz)

Horodatage de la validation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Int32 (TransactionId)

XID de la transaction.

String

Le GID défini par l'utilisateur pour la transaction préparée.

Rollback Prepared #
Byte1('r')

Identifie le message comme le message d'annulation d'une transaction préparée.

Int8(0)

Drapeaux ; actuellement inutilisé.

Int64 (XLogRecPtr)

Le LSN final de la transaction préparée.

Int64 (XLogRecPtr)

Le LSN final de la transaction préparée annulée.

Int64 (TimestampTz)

Horodatage de la phase de préparation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Int64 (TimestampTz)

Horodatage de la phase d'annulation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Int32 (TransactionId)

XID de la transaction.

String

Le GID défini par l'utilisateur pour la transaction préparée.

Stream Prepare #
Byte1('p')

Identifie le message comme un message de préparation en flux 2PC.

Int8(0)

Drapeaux ; actuellement inutilisé.

Int64 (XLogRecPtr)

Le LSN de la phase de préparation.

Int64 (XLogRecPtr)

Le LSN final de la transaction préparée.

Int64 (TimestampTz)

Horodatage de la phase de préparation de la transaction. La valeur est en nombre de microsecondes depuis l'epoch PostgreSQL (1er janvier 2000).

Int32 (TransactionId)

XID de la transaction.

String

Le GID défini par l'utilisateur pour la transaction préparée.

Les parties de message suivants sont partagées par les messages ci-dessus.

TupleData #
Int16

Nombre de colonnes.

Ensuite, un des sous-messages suivants apparaît pour chaque colonne, à l'exception des colonnes générées) :

Byte1('n')

Identifie la donnée comme une valeur NULL.

ou

Byte1('u')

Identifie la 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, en format soit binaire soit texte. (Comme spécifié dans l'octet de format précédent.) n est la longueur ci-dessus.