54.9. Форматы сообщений логической репликации
В этом разделе подробно описывается формат каждого сообщения логической репликации. Эти сообщения или выдаются через SQL-интерфейс слота репликации или передаются процессом walsender. Когда их передаёт walsender, они помещаются внутрь WAL-сообщений протокола репликации, описанных в Разделе 54.4, и в общем следуют тому же потоку сообщений, что и сообщения физической репликации.
- Begin
- Byte1('B')
Указывает, что это начальное сообщение.
- Int64
Окончательный LSN транзакции.
- Int64
Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи Postgres Pro (2000-01-01).
- Int32
Идентификатор транзакции.
- Commit
- Byte1('C')
Указывает, что это сообщение о фиксации.
- Int8
Флаги; в настоящее время не используются (поле должно содержать 0).
- Int64
LSN записи фиксации.
- Int64
Конечный LSN транзакции.
- Int64
Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи Postgres Pro (2000-01-01).
- Origin
- Byte1('O')
Указывает, что это сообщение об источнике.
- Int64
LSN записи фиксации на сервере-источнике.
- String
Имя источника.
Заметьте, что внутри одной транзакции может быть несколько сообщений Origin.
- Relation
- Byte1('R')
Указывает, что это сообщение об отношении.
- Int32
Идентификатор отношения.
- String
Пространство имён (пустая строка для
pg_catalog).- String
Имя отношения.
- Int8
Свойство идентификации реплики для отношения (то же, что и
relreplidentвpg_class).- Int16
Число столбцов.
Затем для каждого столбца (за исключением генерируемых) идёт следующий блок сообщения:
- Int8
Флаги столбца. В настоящее время это может быть 0 (флагов нет) или 1 (столбец помечается как часть ключа).
- String
Имя столбца.
- Int32
Идентификатор типа данных столбца.
- Int32
Модификатор типа столбца (
atttypmod).
- Тип
- Byte1('Y')
Указывает, что это сообщение о типе.
- Int32
Идентификатор типа данных.
- String
Пространство имён (пустая строка для
pg_catalog).- String
Имя типа данных.
- Insert
- Byte1('I')
Указывает, что это сообщение о добавлении данных.
- Int32
Идентификатор отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('N')
Обозначает следующее сообщение TupleData как содержащее новый кортеж.
- TupleData
Блок сообщения TupleData, представляющий содержимое нового кортежа.
- Update
- Byte1('U')
Указывает, что это сообщение об изменении данных.
- Int32
Идентификатор отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('K')
Указывает, что следующий блок TupleData содержит ключ. Это поле является необязательным и присутствует, только если изменение затронуло столбцы, являющиеся частью индекса REPLICA IDENTITY.
- Byte1('O')
Указывает, что следующий блок TupleData содержит старый кортеж. Это поле является необязательным и присутствует, только если у таблицы, в которой произошло изменение, свойство REPLICA IDENTITY равно FULL.
- TupleData
Блок сообщения TupleData, представляющий содержимое старого кортежа или первичного ключа. Присутствует, только если перед ним идёт признак 'O' или 'K'.
- Byte1('N')
Обозначает следующее сообщение TupleData как содержащее новый кортеж.
- TupleData
Блок сообщения TupleData, представляющий содержимое нового кортежа.
Сообщение Update может содержать либо блок 'K', либо блок 'O', либо ни один из них, но не оба сразу.
- Delete
- Byte1('D')
Указывает, что это сообщение об удалении данных.
- Int32
Идентификатор отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('K')
Указывает, что следующий блок TupleData содержит ключ. Это поле присутствует, если таблица, в которой произошло удаление, использует индекс в качестве REPLICA IDENTITY.
- Byte1('O')
Указывает, что следующий блок TupleData содержит старый кортеж. Это поле присутствует, если у таблицы, в которой произошло удаление, свойство REPLICA IDENTITY равно FULL.
- TupleData
Блок сообщения TupleData, представляющий содержимое старого кортежа или первичного ключа, в зависимости от предыдущего поля.
Сообщение Delete может содержать либо блок 'K', либо блок 'O', но не оба сразу.
- Truncate
- Byte1('T')
Указывает, что это сообщение об усечении отношений.
- Int32
Число отношений.
- Int8
Битовые флаги для
TRUNCATE: 1 соответствует указаниюCASCADE, 2 —RESTART IDENTITY.- Int32
Идентификатор отношения, соответствующий идентификатору в сообщении об отношении. Это поле повторятся для каждого отношения.
Описанные выше сообщения имеют следующие общие блоки.
- TupleData
- Int16
Число столбцов.
Затем для каждого столбца (за исключением генерируемых) идёт одно из следующих вложенных сообщений:
- Byte1('n')
Обозначает данные как значение NULL.
Или
- Byte1('u')
Обозначает неизменённое значение TOAST (само значение не передаётся).
Или
- Byte1('t')
Обозначает данные как значение в текстовом формате.
- Int32
Длина значения столбца.
- Byte
n Значение столбца в текстовом формате. (В будущих выпусках могут поддерживаться и другие форматы.) Здесь
n— заданная выше длина.
54.9. Logical Replication Message Formats
This section describes the detailed format of each logical replication message. These messages are returned either by the replication slot SQL interface or are sent by a walsender. In case of a walsender they are encapsulated inside the replication protocol WAL messages as described in Section 54.4 and generally obey same message flow as physical replication.
- Begin
- Byte1('B')
Identifies the message as a begin message.
- Int64
The final LSN of the transaction.
- Int64
Commit timestamp of the transaction. The value is in number of microseconds since Postgres Pro epoch (2000-01-01).
- Int32
Xid of the transaction.
- Commit
- Byte1('C')
Identifies the message as a commit message.
- Int8
Flags; currently unused (must be 0).
- Int64
The LSN of the commit.
- Int64
The end LSN of the transaction.
- Int64
Commit timestamp of the transaction. The value is in number of microseconds since Postgres Pro epoch (2000-01-01).
- Origin
- Byte1('O')
Identifies the message as an origin message.
- Int64
The LSN of the commit on the origin server.
- String
Name of the origin.
Note that there can be multiple Origin messages inside a single transaction.
- Relation
- Byte1('R')
Identifies the message as a relation message.
- Int32
ID of the relation.
- String
Namespace (empty string for
pg_catalog).- String
Relation name.
- Int8
Replica identity setting for the relation (same as
relreplidentinpg_class).- Int16
Number of columns.
Next, the following message part appears for each column (except generated columns):
- Int8
Flags for the column. Currently can be either 0 for no flags or 1 which marks the column as part of the key.
- String
Name of the column.
- Int32
ID of the column's data type.
- Int32
Type modifier of the column (
atttypmod).
- Type
- Byte1('Y')
Identifies the message as a type message.
- Int32
ID of the data type.
- String
Namespace (empty string for
pg_catalog).- String
Name of the data type.
- Insert
- Byte1('I')
Identifies the message as an insert message.
- Int32
ID of the relation corresponding to the ID in the relation message.
- Byte1('N')
Identifies the following TupleData message as a new tuple.
- TupleData
TupleData message part representing the contents of new tuple.
- Update
- Byte1('U')
Identifies the message as an update message.
- Int32
ID of the relation corresponding to the ID in the relation message.
- Byte1('K')
Identifies the following TupleData submessage as a key. This field is optional and is only present if the update changed data in any of the column(s) that are part of the REPLICA IDENTITY index.
- Byte1('O')
Identifies the following TupleData submessage as an old tuple. This field is optional and is only present if table in which the update happened has REPLICA IDENTITY set to FULL.
- TupleData
TupleData message part representing the contents of the old tuple or primary key. Only present if the previous 'O' or 'K' part is present.
- Byte1('N')
Identifies the following TupleData message as a new tuple.
- TupleData
TupleData message part representing the contents of a new tuple.
The Update message may contain either a 'K' message part or an 'O' message part or neither of them, but never both of them.
- Delete
- Byte1('D')
Identifies the message as a delete message.
- Int32
ID of the relation corresponding to the ID in the relation message.
- Byte1('K')
Identifies the following TupleData submessage as a key. This field is present if the table in which the delete has happened uses an index as REPLICA IDENTITY.
- Byte1('O')
Identifies the following TupleData message as an old tuple. This field is present if the table in which the delete happened has REPLICA IDENTITY set to FULL.
- TupleData
TupleData message part representing the contents of the old tuple or primary key, depending on the previous field.
The Delete message may contain either a 'K' message part or an 'O' message part, but never both of them.
- Truncate
- Byte1('T')
Identifies the message as a truncate message.
- Int32
Number of relations
- Int8
Option bits for
TRUNCATE: 1 forCASCADE, 2 forRESTART IDENTITY- Int32
ID of the relation corresponding to the ID in the relation message. This field is repeated for each relation.
The following message parts are shared by the above messages.
- TupleData
- Int16
Number of columns.
Next, one of the following submessages appears for each column (except generated columns):
- Byte1('n')
Identifies the data as NULL value.
Or
- Byte1('u')
Identifies unchanged TOASTed value (the actual value is not sent).
Or
- Byte1('t')
Identifies the data as text formatted value.
- Int32
Length of the column value.
- Byte
n The value of the column, in text format. (A future release might support additional formats.)
nis the above length.