51.9. Форматы сообщений логической репликации
В этом разделе подробно описывается формат каждого сообщения логической репликации. Эти сообщения или выдаются через SQL-интерфейс слота репликации или передаются процессом walsender. Когда их передаёт walsender, они помещаются внутрь WAL-сообщений протокола репликации, описанных в Разделе 51.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
- Длина значения столбца. 
- Byten
- Значение столбца в текстовом формате. (В будущих выпусках могут поддерживаться и другие форматы.) Здесь - n— заданная выше длина.