54.9. Formatos de mensajes de replicación lógica #

Esta sección describe el formato detallado de cada mensaje de replicación lógica. Estos mensajes se devuelven mediante la interfaz SQL de ranura de replicación (replication slot) o son enviados por un walsender. En el caso de un walsender, se encapsulan dentro de los mensajes WAL del protocolo de replicación como se describe en Section 54.4, y generalmente siguen el mismo flujo de mensajes que la replicación física.

Begin #
Byte1('B')

Identifica el mensaje como un mensaje de inicio (begin).

Int64 (XLogRecPtr)

El LSN final de la transacción.

Int64 (TimestampTz)

Marca de tiempo de confirmación (commit) de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Int32 (TransactionId)

Xid de la transacción.

Message #
Byte1('M')

Identifica el mensaje como un mensaje de decodificación lógica.

Int32 (TransactionId)

Xid de la transacción (solo presente para transacciones en flujo/streamed). Este campo está disponible desde la versión 2 del protocolo.

Int8

Banderas (flags); ya sea 0 para indicar que no hay banderas o 1 si el mensaje de decodificación lógica es transaccional.

Int64 (XLogRecPtr)

El LSN del mensaje de decodificación lógica.

String

El prefijo del mensaje de decodificación lógica.

Int32

Longitud del contenido.

Byten

El contenido del mensaje de decodificación lógica.

Commit #
Byte1('C')

Identifica el mensaje como un mensaje de confirmación (commit).

Int8(0)

Banderas (flags); actualmente no se utilizan.

Int64 (XLogRecPtr)

El LSN del commit.

Int64 (XLogRecPtr)

El LSN final de la transacción.

Int64 (TimestampTz)

Marca de tiempo de confirmación (commit) de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Origin #
Byte1('O')

Identifica el mensaje como un mensaje de origen.

Int64 (XLogRecPtr)

El LSN del commit en el servidor de origen.

String

Nombre del origen.

Ten en cuenta que puede haber múltiples mensajes Origin dentro de una sola transacción.

Relation #
Byte1('R')

Identifica el mensaje como un mensaje de relación.

Int32 (TransactionId)

Xid de la transacción (solo presente para transacciones en flujo/streamed). Este campo está disponible desde la versión 2 del protocolo.

Int32 (Oid)

OID de la relación.

String

Espacio de nombres (namespace; cadena vacía para pg_catalog).

String

Nombre de la relación.

Int8

Configuración de identidad de réplica para la relación (igual a relreplident en pg_class).

Int16

Número de columnas.

A continuación, aparece la siguiente parte del mensaje para cada columna incluida en la publicación:

Int8

Banderas (flags) para la columna. Actualmente puede ser 0 para indicar que no hay banderas o 1 que marca la columna como parte de la clave.

String

Nombre de la columna.

Int32 (Oid)

OID del tipo de datos de la columna.

Int32

Modificador de tipo de la columna (atttypmod).

Type #
Byte1('Y')

Identifica el mensaje como un mensaje de tipo.

Int32 (TransactionId)

Xid de la transacción (solo presente para transacciones en flujo/streamed). Este campo está disponible desde la versión 2 del protocolo.

Int32 (Oid)

OID del tipo de datos.

String

Espacio de nombres (namespace; cadena vacía para pg_catalog).

String

Nombre del tipo de datos.

Insert #
Byte1('I')

Identifica el mensaje como un mensaje de inserción (insert).

Int32 (TransactionId)

Xid de la transacción (solo presente para transacciones en flujo/streamed). Este campo está disponible desde la versión 2 del protocolo.

Int32 (Oid)

OID de la relación correspondiente al ID en el mensaje de relación.

Byte1('N')

Identifica el siguiente mensaje TupleData como una nueva tupla.

TupleData

Parte del mensaje TupleData que representa el contenido de la nueva tupla.

Update #
Byte1('U')

Identifica el mensaje como un mensaje de actualización (update).

Int32 (TransactionId)

Xid de la transacción (solo presente para transacciones en flujo/streamed). Este campo está disponible desde la versión 2 del protocolo.

Int32 (Oid)

OID de la relación correspondiente al ID en el mensaje de relación.

Byte1('K')

Identifica el siguiente submensaje TupleData como una clave. Este campo es opcional y solo está presente si la actualización modificó datos en cualquiera de las columnas que forman parte del índice REPLICA IDENTITY.

Byte1('O')

Identifica el siguiente submensaje TupleData como una tupla antigua. Este campo es opcional y solo está presente si la tabla en la que ocurrió la actualización tiene REPLICA IDENTITY establecido en FULL.

TupleData

Parte del mensaje TupleData que representa el contenido de la tupla antigua o clave primaria. Solo está presente si la parte anterior 'O' o 'K' está presente.

Byte1('N')

Identifica el siguiente mensaje TupleData como una nueva tupla.

TupleData

Parte del mensaje TupleData que representa el contenido de una nueva tupla.

El mensaje Update puede contener una parte de mensaje 'K' o una parte de mensaje 'O' o ninguna de ellas, pero nunca ambas.

Delete #
Byte1('D')

Identifica el mensaje como un mensaje de eliminación (delete).

Int32 (TransactionId)

Xid de la transacción (solo presente para transacciones en flujo/streamed). Este campo está disponible desde la versión 2 del protocolo.

Int32 (Oid)

OID de la relación correspondiente al ID en el mensaje de relación.

Byte1('K')

Identifica el siguiente submensaje TupleData como una clave. Este campo está presente si la tabla en la que ocurrió la eliminación utiliza un índice como REPLICA IDENTITY.

Byte1('O')

Identifica el siguiente mensaje TupleData como una tupla antigua. Este campo está presente si la tabla en la que ocurrió la eliminación tiene REPLICA IDENTITY establecido en FULL.

TupleData

Parte del mensaje TupleData que representa el contenido de la tupla antigua o clave primaria, dependiendo del campo anterior.

El mensaje Delete puede contener una parte de mensaje 'K' o una parte de mensaje 'O', pero nunca ambas.

Truncate #
Byte1('T')

Identifica el mensaje como un mensaje de vaciado (truncate).

Int32 (TransactionId)

Xid de la transacción (solo presente para transacciones en flujo/streamed). Este campo está disponible desde la versión 2 del protocolo.

Int32

Número de relaciones.

Int8

Bits de opción para TRUNCATE: 1 para CASCADE, 2 para RESTART IDENTITY.

Int32 (Oid)

OID de la relación correspondiente al ID en el mensaje de relación. Este campo se repite para cada relación.

Los siguientes mensajes (Stream Start, Stream Stop, Stream Commit y Stream Abort) están disponibles desde la versión 2 del protocolo.

Stream Start #
Byte1('S')

Identifica el mensaje como un mensaje de inicio de flujo (stream start).

Int32 (TransactionId)

Xid de la transacción.

Int8

Un valor de 1 indica que este es el primer segmento de flujo para este XID, 0 para cualquier otro segmento de flujo.

Stream Stop #
Byte1('E')

Identifica el mensaje como un mensaje de parada de flujo (stream stop).

Stream Commit #
Byte1('c')

Identifica el mensaje como un mensaje de confirmación de flujo (stream commit).

Int32 (TransactionId)

Xid de la transacción.

Int8(0)

Banderas (flags); actualmente no se utilizan.

Int64 (XLogRecPtr)

El LSN de la confirmación (commit).

Int64 (XLogRecPtr)

El LSN final de la transacción.

Int64 (TimestampTz)

Marca de tiempo de confirmación de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Stream Abort #
Byte1('A')

Identifica el mensaje como un mensaje de aborto de flujo (stream abort).

Int32 (TransactionId)

Xid de la transacción.

Int32 (TransactionId)

Xid de la subtransacción (será idéntico al xid de la transacción para transacciones de nivel superior).

Int64 (XLogRecPtr)

El LSN de la operación de aborto, presente solo cuando la transmisión está configurada en paralelo. Este campo está disponible desde la versión 4 del protocolo.

Int64 (TimestampTz)

Marca de tiempo de aborto de la transacción, presente solo cuando la transmisión está configurada en paralelo. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01). Este campo está disponible desde la versión 4 del protocolo.

Los siguientes mensajes (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared y Stream Prepare) están disponibles desde la versión 3 del protocolo.

Begin Prepare #
Byte1('b')

Identifica el mensaje como el inicio de un mensaje de transacción preparada.

Int64 (XLogRecPtr)

El LSN de la preparación (prepare).

Int64 (XLogRecPtr)

El LSN final de la transacción preparada.

Int64 (TimestampTz)

Marca de tiempo de preparación de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Int32 (TransactionId)

Xid de la transacción.

String

El GID definido por el usuario de la transacción preparada.

Prepare #
Byte1('P')

Identifica el mensaje como un mensaje de transacción preparada.

Int8(0)

Banderas (flags); actualmente no se utilizan.

Int64 (XLogRecPtr)

El LSN de la preparación (prepare).

Int64 (XLogRecPtr)

El LSN final de la transacción preparada.

Int64 (TimestampTz)

Marca de tiempo de preparación de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Int32 (TransactionId)

Xid de la transacción.

String

El GID definido por el usuario de la transacción preparada.

Commit Prepared #
Byte1('K')

Identifica el mensaje como el commit de un mensaje de transacción preparada.

Int8(0)

Banderas (flags); actualmente no se utilizan.

Int64 (XLogRecPtr)

El LSN de la confirmación (commit) de la transacción preparada.

Int64 (XLogRecPtr)

El LSN final de la confirmación (commit) de la transacción preparada.

Int64 (TimestampTz)

Marca de tiempo de confirmación de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Int32 (TransactionId)

Xid de la transacción.

String

El GID definido por el usuario de la transacción preparada.

Rollback Prepared #
Byte1('r')

Identifica el mensaje como la reversión (rollback) de un mensaje de transacción preparada.

Int8(0)

Banderas (flags); actualmente no se utilizan.

Int64 (XLogRecPtr)

El LSN final de la transacción preparada.

Int64 (XLogRecPtr)

El LSN final de la reversión (rollback) de la transacción preparada.

Int64 (TimestampTz)

Marca de tiempo de preparación de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Int64 (TimestampTz)

Marca de tiempo de reversión (rollback) de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Int32 (TransactionId)

Xid de la transacción.

String

El GID definido por el usuario de la transacción preparada.

Stream Prepare #
Byte1('p')

Identifica el mensaje como un mensaje de transacción preparada de flujo (stream prepared).

Int8(0)

Banderas (flags); actualmente no se utilizan.

Int64 (XLogRecPtr)

El LSN de la preparación (prepare).

Int64 (XLogRecPtr)

El LSN final de la transacción preparada.

Int64 (TimestampTz)

Marca de tiempo de preparación de la transacción. El valor está expresado en número de microsegundos desde la época de PostgreSQL (2000-01-01).

Int32 (TransactionId)

Xid de la transacción.

String

El GID definido por el usuario de la transacción preparada.

Las siguientes partes de mensaje son compartidas por los mensajes anteriores.

TupleData #
Int16

Número de columnas.

A continuación, aparece uno de los siguientes submensajes para cada columna publicada:

Byte1('n')

Identifica los datos como valor NULL.

O

Byte1('u')

Identifica un valor TOAST sin cambios (el valor real no se envía).

O

Byte1('t')

Identifica los datos como valor formateado en texto.

O

Byte1('b')

Identifica los datos como valor formateado en binario.

Int32

Longitud del valor de la columna.

Byten

El valor de la columna, ya sea en formato binario o de texto. (Como se especifica en el byte de formato anterior). n es la longitud anterior.