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
— заданная выше длина.