云服务器内容精选

  • 并行解码 以下配置选项仅限流式解码设置。 decode-style: 指定解码格式。 取值范围:char型的字符'j'、't'或'b',分别代表json格式,text格式及二进制格式。默认值为'b'即二进制格式解码。 对于json格式和text格式解码,开启批量发送选项时的解码结果中,每条解码语句的前4字节组成的uint32代表该条语句总字节数(不包含该uint32类型占用的4字节,0代表本批次解码结束),8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 二进制格式编码规则如下所示: 前4字节代表接下来到语句级别分隔符字母P(不含)或者该批次结束符F(不含)的解码结果的总字节数,该值如果为0代表本批次解码结束。 接下来8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 接下来1字节的字母有5种B/C/I/U/D,分别代表begin/commit/insert/update/delete。 第3.接下来1字节的字母有5种B/C/I/U/D,...步字母为B时。 接下来的8字节uint64代表 CS N。 接下来的8字节uint64代表first_lsn。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示该事务commit时间戳长度,再后面等同于该长度的字符为时间戳字符串。 【该部分为可选项】接下来的1字节字母如果为N,则代表后面4字节uint32表示该事务用户名的长度,再后面等同于该长度的字符为事务的用户名字。 因为之后仍可能有解码语句,接下来会有1字节字母P或F作为语句间的分隔符,P代表本批次仍有解码的语句,F代表本批次完成。 第3.接下来1字节的字母有5种B/C/I/U/D,...步字母为C时: 【该部分为可选项】接下来1字节字母如果为X,则代表后面的8字节uint64表示xid。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示时间戳长度,再后面等同于该长度的字符为时间戳字符串。 因为批量发送日志时,一个COMMIT日志解码之后可能仍有其他事务的解码结果,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 第3.接下来1字节的字母有5种B/C/I/U/D,...步字母为I/U/D时: 接下来的2字节uint16代表schema名的长度。 按照上述长度读取schema名。 接下来的2字节uint16代表table名的长度。 按照上述长度读取table名。 【该部分为可选项】接下来1字符字母如果为N代表为新元组,如果为O代表为旧元组,这里先发送新元组。 接下来的2字节uint16代表该元组需要解码的列数,记为attrnum。 以下流程重复attrnum次。 接下来2字节uint16代表列名的长度。 按照上述长度读取列名。 接下来4字节uint32代表当前列类型的Oid。 接下来4字节uint32代表当前列的值(以字符串格式存储)的长度,如果为0xFFFFFFFF则表示NULL,如果为0则表示长度为0的字符串。 按照上述长度读取列值。 因为之后仍可能有解码语句,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 sending-batch: 指定是否批量发送。 取值范围:0或1的int型,默认值为0。 0:设为0时,表示逐条发送解码结果。 1:设为1时,表示解码结果累积到达1MB则批量发送解码结果。 开启批量发送的场景中,当解码格式为'j'或't'时,在原来的每条解码语句之前会附加一个uint32类型,表示本条解码结果长度(长度不包含当前的uint32类型),以及一个uint64类型,表示当前解码结果对应的lsn。 parallel-queue-size: 指定并行逻辑解码线程间进行交互的队列长度。 取值范围:2~1024的int型,且必须为2的整数幂,默认值为128。 队列长度和解码过程的内存使用量正相关。
  • 串行解码 force-binary: 是否以二进制格式输出解码结果,针对不同场景呈现不同行为。 针对系统函数pg_logical_slot_get_binary_changes和pg_logical_slot_peek_binary_changes: 取值范围:bool型,默认值为false。此值无实际意义,均以二进制格式输出解码结果。 针对系统函数pg_logical_slot_get_changes、pg_logical_slot_peek_changes和pg_logical_get_area_changes: 取值范围:仅取false值的bool型。以文本格式输出解码结果。 针对流式解码: 取值范围:bool型,默认值为false。此值无实际意义,均以文本格式输出解码结果。
  • 通用选项(串行解码和并行解码均可配置,但可能无效,请参考相关选项详细说明) include-xids: 解码出的data列是否包含xid信息。 取值范围:0或1,默认值为1。 0:设为0时,解码出的data列不包含xid信息。 1:设为1时,解码出的data列包含xid信息。 skip-empty-xacts: 解码时是否忽略空事务信息。 取值范围:0或1,默认值为0。 0:设为0时,解码时不忽略空事务信息。 1:设为1时,解码时会忽略空事务信息。 include-timestamp: 解码信息是否包含commit时间戳。 取值范围:0或1,默认值为0。 0:设为0时,解码信息不包含commit时间戳。 1:设为1时,解码信息包含commit时间戳。 only-local: 是否仅解码本地日志。 取值范围:0或1,默认值为1。 0:设为0时,解码非本地日志和本地日志。 1:设为1时,仅解码本地日志。 white-table-list: 白名单参数,包含需要进行解码的schema和表名。 取值范围:包含白名单中表名的字符串,不同的表以','为分隔符进行隔离;使用'*'来模糊匹配所有情况;schema名和表名间以'.'分隔,不允许存在任意空白符。例如: select * from pg_logical_slot_peek_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2,*.t3,my_schema.*'); max-txn-in-memory: 内存管控参数,单位为MB,单个事务占用内存大于该值即进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 max-reorderbuffer-in-memory 内存管控参数,单位为GB,拼接-发送线程中正在拼接的事务总内存(包含缓存)大于该值则对当前解码事务进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 include-user: 事务的BEGIN逻辑日志是否输出事务的用户名。事务的用户名特指授权用户——执行事务对应会话的登录用户,它在事务的整个执行过程中不会发生变化。 取值范围:0或1,默认值为0。 0:设为0时,事物的BEGIN逻辑日志不输出事务的用户名。 1:设为1时,事物的BEGIN逻辑日志输出事务的用户名。 exclude-userids: 黑名单用户的OID参数。 取值范围:字符串类型,指定黑名单用户的OID,多个OID通过','分隔,不校验用户OID是否存在。 exclude-users: 黑名单用户的名称列表。 取值范围:字符串类型,指定黑名单用户名,通过','分隔,不校验用户名是否存在。 dynamic-resolution: 是否动态解析黑名单用户名。 取值范围:0或1,默认值为1。 0:设为0时,当解码观测到黑名单exclude-users中用户不存在时将会报错并退出逻辑解码。 1:设为1时,当解码观测到黑名单exclude-users中用户不存在时继续解码。 standby-connection: 仅流式解码设置,是否仅限制备机解码。 取值范围:bool型,默认值为false。 true:设为true时,仅允许连接备机解码,连接主机解码时会报错退出。 false:设为false时,不做限制,允许连接主机或备机解码。 sender-timeout: 仅流式解码设置,内核与客户端的心跳超时阈值。当该时间段内没有收到客户端任何消息时,逻辑解码将主动停止,并断开和客户端的连接。单位为毫秒(ms)。 取值范围:0~2147483647的int型,默认值取决于GUC参数logical_sender_timeout的配置值。 parallel-decode-num: 仅流式解码设置有效,并行解码的Decoder线程数量;系统函数调用场景下此选项无效,仅校验取值范围。 取值范围:取1表示按照原有的串行逻辑进行解码,取其余值表示开启并行解码,默认值为1。 当parallel-decode-num不配置(即为默认值1)或显式配置为1时,下述“并行解码”中的选项不可配置。
  • 注意事项 逻辑解码不支持DDL。 在执行特定的DDL语句(如普通表truncate或分区表exchange)时,可能造成解码数据丢失。 不支持数据页复制的DML解码。 当执行DDL语句(如alter table)后,该DDL语句前尚未解码的物理日志可能会丢失。 单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。 GaussDB 支持解码的数据类型为:INTEGER、BIGINT、SMALLINT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。 逻辑复制槽名称必须小于64个字符,仅支持小写字母、数字以及_?-.字符,且不支持“.”或“..”单独作为复制槽名称。 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。 不支持强切,强切后需要重新全量导出数据。 如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。Quorum协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。 不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。 只支持主机创建删除复制槽。 数据库故障重启或逻辑复制进程重启后,解码数据可能存在重复,用户需自己过滤。 计算机内核故障后,解码可能存在乱码,需手动或自动过滤。 当前备机逻辑解码,不支持开启极致RTO。 请确保在创建逻辑复制槽过程中长事务未启动,启动长事务会阻塞逻辑复制槽的创建。 不支持interval partition表复制。 不支持全局临时表的DML解码。 在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。 为解析某个astore表的UPDATE和DELETE语句,需为此表配置REPLICA IDENITY属性,在此表无主键时需要配置为FULL。 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。 基于目标库可能需要源库的系统状态信息考虑,逻辑解码仅自动过滤模式'pg_catalog'和'pg_toast'下OID小于16384的系统表的逻辑日志。若目标库不需要复制其他相关系统表的内容,逻辑日志回放过程中需要对相关系统表进行过滤。 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的REPLICA IDENTITY属性设置为FULL或是使用USING INDEX指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为NOT NULL的列的索引。 在逻辑复制槽使用完毕后,需及时删除,否则会阻塞xLog日志回收。 若一个事务的子事务过多导致落盘文件过多,退出解码时需执行SQL函数pg_terminate_backend(逻辑解码的walsender线程id)来手动停止解码,而且退出时延增加约为1分钟/30万个子事务。因此在开启逻辑解码时,若一个事务的子事务数量达到5万时,会打印一条WARNING日志。 当同一事务产生大量需要落盘的子事务时,同时打开的文件句柄可能会超限,需将GUC参数max_files_per_process配置成大于子事务数量上限的两倍。
  • SQL函数解码性能 在Benchmarksql-5.0的100warehouse场景下,采用pg_logical_slot_get_changes时: 单次解码数据量4K行(对应约5MB~10MB日志),解码性能0.3MB/s~0.5 MB/s。 单次解码数据量32K行(对应约40MB~80MB日志),解码性能3MB/s~5MB/s。 单次解码数据量256K行(对应约320MB~640MB日志),解码性能3MB/s~5MB/s。 单次解码数据量再增大,解码性能无明显提升。 如果采用pg_logical_slot_peek_changes + pg_replication_slot_advance方式,解码性能相比采用pg_logical_slot_get_changes时要下降30%~50%。
  • 并行解码 以下配置选项仅限流式解码设置。 decode-style: 指定解码格式。 取值范围:char型的字符'j'、't'或'b',分别代表json格式,text格式及二进制格式。默认值为'b'即二进制格式解码。 对于json格式和text格式解码,开启批量发送选项时的解码结果中,每条解码语句的前4字节组成的uint32代表该条语句总字节数(不包含该uint32类型占用的4字节,0代表本批次解码结束),8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 二进制格式编码规则如下所示: 前4字节代表接下来到语句级别分隔符字母P(不含)或者该批次结束符F(不含)的解码结果的总字节数,该值如果为0代表本批次解码结束。 接下来8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 接下来1字节的字母有5种B/C/I/U/D,分别代表begin/commit/insert/update/delete。 第3.接下来1字节的字母有5种B/C/I/U/D,...步字母为B时。 接下来的8字节uint64代表CSN。 接下来的8字节uint64代表first_lsn。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示该事务commit时间戳长度,再后面等同于该长度的字符为时间戳字符串。 【该部分为可选项】接下来的1字节字母如果为N,则代表后面4字节uint32表示该事务用户名的长度,再后面等同于该长度的字符为事务的用户名字。 因为之后仍可能有解码语句,接下来会有1字节字母P或F作为语句间的分隔符,P代表本批次仍有解码的语句,F代表本批次完成。 第3.接下来1字节的字母有5种B/C/I/U/D,...步字母为C时: 【该部分为可选项】接下来1字节字母如果为X,则代表后面的8字节uint64表示xid。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示时间戳长度,再后面等同于该长度的字符为时间戳字符串。 因为批量发送日志时,一个COMMIT日志解码之后可能仍有其他事务的解码结果,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 第3.接下来1字节的字母有5种B/C/I/U/D,...步字母为I/U/D时: 接下来的2字节uint16代表schema名的长度。 按照上述长度读取schema名。 接下来的2字节uint16代表table名的长度。 按照上述长度读取table名。 【该部分为可选项】接下来1字符字母如果为N代表为新元组,如果为O代表为旧元组,这里先发送新元组。 接下来的2字节uint16代表该元组需要解码的列数,记为attrnum。 以下流程重复attrnum次。 接下来2字节uint16代表列名的长度。 按照上述长度读取列名。 接下来4字节uint32代表当前列类型的Oid。 接下来4字节uint32代表当前列的值(以字符串格式存储)的长度,如果为0xFFFFFFFF则表示NULL,如果为0则表示长度为0的字符串。 按照上述长度读取列值。 因为之后仍可能有解码语句,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 sending-batch: 指定是否批量发送。 取值范围:0或1的int型,默认值为0。 0:设为0时,表示逐条发送解码结果。 1:设为1时,表示解码结果累积到达1MB则批量发送解码结果。 开启批量发送的场景中,当解码格式为'j'或't'时,在原来的每条解码语句之前会附加一个uint32类型,表示本条解码结果长度(长度不包含当前的uint32类型),以及一个uint64类型,表示当前解码结果对应的lsn。 parallel-queue-size: 指定并行逻辑解码线程间进行交互的队列长度。 取值范围:2~1024的int型,且必须为2的整数幂,默认值为128。 队列长度和解码过程的内存使用量正相关。
  • 串行解码 force-binary: 是否以二进制格式输出解码结果,针对不同场景呈现不同行为。 针对系统函数pg_logical_slot_get_binary_changes和pg_logical_slot_peek_binary_changes: 取值范围:bool型,默认值为false。此值无实际意义,均以二进制格式输出解码结果。 针对系统函数pg_logical_slot_get_changes、pg_logical_slot_peek_changes和pg_logical_get_area_changes: 取值范围:仅取false值的bool型。以文本格式输出解码结果。 针对流式解码: 取值范围:bool型,默认值为false。此值无实际意义,均以文本格式输出解码结果。
  • 通用选项(串行解码和并行解码均可配置,但可能无效,请参考相关选项详细说明) include-xids: 解码出的data列是否包含xid信息。 取值范围:0或1,默认值为1。 0:设为0时,解码出的data列不包含xid信息。 1:设为1时,解码出的data列包含xid信息。 skip-empty-xacts: 解码时是否忽略空事务信息。 取值范围:0或1,默认值为0。 0:设为0时,解码时不忽略空事务信息。 1:设为1时,解码时会忽略空事务信息。 include-timestamp: 解码信息是否包含commit时间戳。 取值范围:0或1,默认值为0。 0:设为0时,解码信息不包含commit时间戳。 1:设为1时,解码信息包含commit时间戳。 only-local: 是否仅解码本地日志。 取值范围:0或1,默认值为1。 0:设为0时,解码非本地日志和本地日志。 1:设为1时,仅解码本地日志。 white-table-list: 白名单参数,包含需要进行解码的schema和表名。 取值范围:包含白名单中表名的字符串,不同的表以','为分隔符进行隔离;使用'*'来模糊匹配所有情况;schema名和表名间以'.'分隔,不允许存在任意空白符。例如: select * from pg_logical_slot_peek_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2,*.t3,my_schema.*'); max-txn-in-memory: 内存管控参数,单位为MB,单个事务占用内存大于该值即进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 max-reorderbuffer-in-memory 内存管控参数,单位为GB,拼接-发送线程中正在拼接的事务总内存(包含缓存)大于该值则对当前解码事务进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 include-user: 事务的BEGIN逻辑日志是否输出事务的用户名。事务的用户名特指授权用户——执行事务对应会话的登录用户,它在事务的整个执行过程中不会发生变化。 取值范围:0或1,默认值为0。 0:设为0时,事物的BEGIN逻辑日志不输出事务的用户名。 1:设为1时,事物的BEGIN逻辑日志输出事务的用户名。 exclude-userids: 黑名单用户的OID参数。 取值范围:字符串类型,指定黑名单用户的OID,多个OID通过','分隔,不校验用户OID是否存在。 exclude-users: 黑名单用户的名称列表。 取值范围:字符串类型,指定黑名单用户名,通过','分隔,不校验用户名是否存在。 dynamic-resolution: 是否动态解析黑名单用户名。 取值范围:0或1,默认值为1。 0:设为0时,当解码观测到黑名单exclude-users中用户不存在时将会报错并退出逻辑解码。 1:设为1时,当解码观测到黑名单exclude-users中用户不存在时继续解码。 standby-connection: 仅流式解码设置,是否仅限制备机解码。 取值范围:bool型,默认值为false。 true:设为true时,仅允许连接备机解码,连接主机解码时会报错退出。 false:设为false时,不做限制,允许连接主机或备机解码。 sender-timeout: 仅流式解码设置,内核与客户端的心跳超时阈值。当该时间段内没有收到客户端任何消息,逻辑解码将主动停止,并断开和客户端的连接。单位为毫秒(ms)。 取值范围:0~2147483647的int型,默认值取决于GUC参数logical_sender_timeout的配置值。 parallel-decode-num: 仅流式解码设置有效,并行解码的Decoder线程数量;系统函数调用场景下此选项无效,仅校验取值范围。 取值范围:取1表示按照原有的串行逻辑进行解码,取其余值即为开启并行解码,默认值为1。 当parallel-decode-num不配置(即为默认值1)或显式配置为1时,下述“并行解码”中的选项不可配置。
  • SQL函数解码性能 在Benchmarksql-5.0的100warehouse场景下,采用pg_logical_slot_get_changes时: 单次解码数据量4K行(对应约5MB~10MB日志),解码性能0.3MB/s~0.5 MB/s。 单次解码数据量32K行(对应约40MB~80MB日志),解码性能3MB/s~5MB/s。 单次解码数据量256K行(对应约320MB~640MB日志),解码性能3MB/s~5MB/s。 单次解码数据量再增大,解码性能无明显提升。 如果采用pg_logical_slot_peek_changes + pg_replication_slot_advance方式,解码性能相比采用pg_logical_slot_get_changes时要下降30%~50%。
  • 注意事项 逻辑解码不支持DDL。 在执行特定的DDL语句(如普通表truncate或分区表exchange)时,可能造成解码数据丢失。 不支持数据页复制的DML解码。 不支持解码分布式事务,当前机制为从DN解码,无法保证分布式事务一致性解码。 当执行DDL语句(如alter table)后,该DDL语句前尚未解码的物理日志可能会丢失。 使用逻辑解码功能时,禁止进行集群在线扩容。 单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。 GaussDB支持解码的数据类型为:INTEGER、BIGINT、SMALLINT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。 如果需要ssl连接需要保证前置条件guc参数ssl设置为on。 逻辑复制槽名称必须小于64个字符,仅支持小写字母、数字以及_?-.字符,且不支持“.”或“..”单独作为复制槽名称。 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。 不支持interval partition表复制。 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。 不支持强切,强切后需要重新全量导出数据。 在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。 如需进行备机解码,需在对应主机上设置GUC参数enable_slot_log = on。 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。Quorum协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。 不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。 只支持主机创建删除复制槽。 数据库故障重启或逻辑复制进程重启后,解码数据可能存在重复,用户需自己过滤。 计算机内核故障后,解码可能存在乱码,需手动或自动过滤。 当前备机逻辑解码,不支持开启极致RTO。 请确保在创建逻辑复制槽过程中长事务未启动,启动长事务会阻塞逻辑复制槽的创建。 为解析某个astore表的UPDATE和DELETE语句,需为此表配置REPLICA IDENTITY属性,在此表无主键时需要配置为FULL,配置方式参照▪REPLICA IDENTITY { DEFA...字段。 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。 基于目标库可能需要源库的系统状态信息考虑,逻辑解码仅自动过滤模式'pg_catalog'和'pg_toast'下OID小于16384的系统表的逻辑日志。若目标库不需要复制其他相关系统表的内容,逻辑日志回放过程中需要对相关系统表进行过滤。 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的REPLICA IDENTITY属性设置为FULL或是使用USING INDEX指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为NOT NULL的列的索引。 在逻辑复制槽使用完毕后,需及时删除,否则会阻塞xLog日志回收。 若一个事务的子事务过多导致落盘文件过多,退出解码时需执行SQL函数pg_terminate_backend(逻辑解码的walsender线程id)来手动停止解码,而且退出时延增加约为1分钟/30万个子事务。因此在开启逻辑解码时,若一个事务的子事务数量达到5万时,会打印一条WARNING日志。 当同一事务产生大量需要落盘的子事务时,同时打开的文件句柄可能会超限,需将GUC参数max_files_per_process配置成大于子事务数量上限的两倍。
  • 通用选项(串行解码和并行解码均可配置,但可能无效,请参考相关选项详细说明) include-xids: 解码出的data列是否包含xid信息。 取值范围:bool型,默认值为true。 false:设为false时,解码出的data列不包含xid信息。 true:设为true时,解码出的data列包含xid信息。 skip-empty-xacts: 解码时是否忽略空事务信息。 取值范围:bool型,默认值为false。 false:设为false时,解码时不忽略空事务信息。 true:设为true时,解码时会忽略空事务信息。 include-timestamp: 解码信息是否包含commit时间戳。 取值范围:bool型,默认值为false。 false:设为false时,解码信息不包含commit时间戳。 true:设为true时,解码信息包含commit时间戳。 only-local: 是否仅解码本地日志。 取值范围:bool型,默认值为true。 false:设为false时,解码非本地日志和本地日志。 true:设为true时,仅解码本地日志。 white-table-list: 白名单参数,包含需要进行解码的schema和表名。 取值范围:包含白名单中表名的字符串,不同的表以','为分隔符进行隔离;使用'*'来模糊匹配所有情况;schema名和表名间以'.'分隔,不允许存在任意空白符。例如: select * from pg_logical_slot_peek_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2,*.t3,my_schema.*'); max-txn-in-memory: 内存管控参数,单位为MB,单个事务占用内存大于该值即进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 max-reorderbuffer-in-memory 内存管控参数,单位为GB,拼接-发送线程中正在拼接的事务总内存(包含缓存)大于该值则对当前解码事务进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 include-user: 事务的BEGIN逻辑日志是否输出事务的用户名。事务的用户名特指授权用户——执行事务对应会话的登录用户,它在事务的整个执行过程中不会发生变化。 取值范围:bool型,默认值为false。 false:设为false时,事物的BEGIN逻辑日志不输出事务的用户名。 true:设为true时,事物的BEGIN逻辑日志输出事务的用户名。 exclude-userids: 黑名单用户的OID参数。只支持SQL函数解码时使用,不支持启动逻辑解码任务时指定。 取值范围:字符串类型,指定黑名单用户的OID,多个OID通过','分隔,不校验用户OID是否存在。 exclude-users: 黑名单用户的名称列表。 取值范围:字符串类型,指定黑名单用户名,通过','分隔,不校验用户名是否存在。 dynamic-resolution: 是否动态解析黑名单用户名。 取值范围:bool型,默认值为true。 false:设为false时,当解码观测到黑名单exclude-users中用户不存在时将会报错并退出逻辑解码。 true:设为true时,当解码观测到黑名单exclude-users中用户不存在时继续解码。 standby-connection: 仅流式解码设置,是否仅限制备机解码。只支持SQL函数解码时使用,不支持启动逻辑解码任务时指定。 取值范围:bool型,默认值为false。 true:设为true时,仅允许连接备机解码,连接主机解码时会报错退出。 false:设为false时,不做限制,允许连接主机或备机解码。 sender-timeout: 仅流式解码设置,内核与客户端的心跳超时阈值。当该时间段内没有收到客户端任何消息,逻辑解码将主动停止,并断开和客户端的连接。单位为毫秒(ms)。 取值范围:0~2147483647的int型,默认值取决于GUC参数logical_sender_timeout的配置值。 enable-heartbeat: 仅流式解码时设置,是否输出心跳日志。 取值范围:bool型,默认值为false。 true:设为true时,输出心跳日志。 false:设为false时,不输出心跳日志。 若开启心跳日志选项,此处说明心跳日志如何解析:二进制格式首先是字符'h'表示是消息是心跳日志,之后是心跳日志内容,分别是8字节uint64,直连DN解码场景代表LSN,表示发送心跳逻辑日志时读取的WAL日志结束位置,而在分布式强一致解码场景为CSN,表示发送心跳逻辑日志时已发送的解码日志事务CSN;8字节uint64,直连DN解码场景代表LSN,表示发送心跳逻辑日志时刻已经落盘的WAL日志的位置,而在分布式强一致解码场景为CSN,表示集群下一个提交事务将获得的CSN;8字节int64代表时间戳(从1970年1月1日开始),表示最新解码到的事务日志或检查点日志的产生时间戳。关于消息结束符:如果是二进制格式则为字符'F',如果格式为text或者json且为批量发送则结束符为0,否则没有结束符。消息内容采用大端字节序进行数据传输。具体格式见下图(考虑到前向兼容性,相关部分仍保留着LSN的命名方式,实际含义依具体场景而定): parallel-decode-num: 仅流式解码设置有效,并行解码的Decoder线程数量;系统函数调用场景下此选项无效,仅校验取值范围。 取值范围:1~20的int型,取1表示按照原有的串行逻辑进行解码,取其余值即为开启并行解码,默认值为1。 当parallel-decode-num不配置(即为默认值1)或显式配置为1时,下述“并行解码”中的选项不可配置。 output-order: 仅流式解码设置有效,是否使用CSN顺序输出解码结果;系统函数调用场景下此选项无效,仅校验取值范围。 取值范围:0或1的int型,默认值为0。 0:设为0时,解码结果按照事务的COMMIT LSN排序,当且仅当解码复制槽的confirmed_csn列值为0(即不显示)时可使用该方式,否则报错。 1:设为1时,解码结果按照事务的CSN排序, 当且仅当解码复制槽的confirmed_csn列值为非零值时可使用该方式,否则报错。 当output-order不配置(即为默认值0,按照COMMIT LSN排序)或显式配置为0时,下述“分布式强一致解码”中的选项不可配置。 在流式解码场景,DN收到来自CN的逻辑解码连接时,output-order选项失效,默认采用CSN序解码。 auto-advance: 仅流式解码设置有效,是否允许自主推进逻辑复制槽。 取值范围:boolean型,默认值为false。 true:设为true时,在已发送日志都被确认推进且没有待发送事务时,推进逻辑复制槽到当前解码位置。 false:设为false时,完全交由复制业务调用日志确认接口推进逻辑复制槽。 skip-generated-columns: 逻辑解码控制参数,用于跳过生成列的输出。对UPDATE和DELETE的旧元组无效,相应元组始终会输出生成列。分布式版本暂不支持生成列,此配置选项暂无实际影响。只支持SQL函数解码时使用,不支持启动逻辑解码任务时指定。 取值范围:boolean型,默认值为false。 true:表示不输出生成列的解码结果。 false:表示输出生成列的解码结果。
  • 分布式强一致解码 logical-receiver-num: 仅流式解码设置有效,分布式解码启动的logical_receiver的数量,系统函数调用场景下此选项无效,仅校验取值范围。 取值范围:1~20的int型,默认值为1。当该值被设置为比当前集群分片数更大时,将被修改为分片数。 slice-id: 仅连接DN解码时设置,指定当前DN所在的分片号,用于复制表解码。 取值范围:0~8192的int型,默认值为-1,即不指定分片号,但在解码到复制表时会报错。 该配置选项在尝试连接DN使用CSN序逻辑复制槽(confirmed_csn为非0值的复制槽)进行解码时使用,用来表示自己的分片号(即第几个分片,第一个分片则输入0),如果不设置该参数(即使用默认值-1)在解码到复制表时将会报错。此参数用于使用连接CN的分布式解码时,CN从DN收集解码结果时使用。不建议在此场景下手动连接DN解码。 start-position: 仅连接DN设置,主要功能为过滤掉小于指定CSN对应的事务,以及针对指定的CSN对应的事务,过滤掉小于指定LSN的日志,且指定CSN对应事务的BEGIN日志一定被过滤掉。 取值范围:字符串类型,可以解析为以'/'分隔,左右两侧分别为代表CSN和LSN的两个uint64类型。 该配置选项用于CN解码时,CN建立与DN的连接后发送解码请求时使用此配置选项过滤可能已经被接收过的日志。不建议在此场景下手动连接DN解码使用此参数。
  • 并行解码 以下配置选项仅限流式解码设置。 decode-style: 指定解码格式。 取值范围:char型的字符'j'、't'或'b',分别代表json格式,text格式及二进制格式。默认值为'b'即二进制格式解码。 对于json格式和text格式解码,开启批量发送选项时的解码结果中,每条解码语句的前4字节组成的uint32代表该条语句总字节数(不包含该uint32类型占用的4字节,0代表本批次解码结束),8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 二进制格式编码规则如下所示: 前4字节代表接下来到语句级别分隔符字母P(不含)或者该批次结束符F(不含)的解码结果的总字节数,该值如果为0代表本批次解码结束。 接下来8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 接下来1字节的字母有5种B/C/I/U/D,分别代表begin/commit/insert/update/delete。 第3步字母为B时。 接下来的8字节uint64代表CSN。 接下来的8字节uint64代表first_lsn。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示该事务commit时间戳长度,再后面等同于该长度的字符为时间戳字符串。 【该部分为可选项】接下来的1字节字母如果为N,则代表后面4字节uint32表示该事务用户名的长度,再后面等同于该长度的字符为事务的用户名字。 因为之后仍可能有解码语句,接下来会有1字节字母P或F作为语句间的分隔符,P代表本批次仍有解码的语句,F代表本批次完成。 第3步字母为C时: 【该部分为可选项】接下来1字节字母如果为X,则代表后面的8字节uint64表示xid。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示时间戳长度,再后面等同于该长度的字符为时间戳字符串。 因为批量发送日志时,一个COMMIT日志解码之后可能仍有其他事务的解码结果,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 第3步字母为I/U/D时: 接下来的2字节uint16代表schema名的长度。 按照上述长度读取schema名。 接下来的2字节uint16代表table名的长度。 按照上述长度读取table名。 【该部分为可选项】接下来1字符字母如果为N代表为新元组,如果为O代表为旧元组,这里先发送新元组。 接下来的2字节uint16代表该元组需要解码的列数,记为attrnum。 以下流程重复attrnum次。 接下来2字节uint16代表列名的长度。 按照上述长度读取列名。 接下来4字节uint32代表当前列类型的Oid。 接下来4字节uint32代表当前列的值(以字符串格式存储)的长度,如果为0xFFFFFFFF则表示NULL,如果为0则表示长度为0的字符串。 按照上述长度读取列值。 因为之后仍可能有解码语句,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 sending-batch: 指定是否批量发送。 取值范围:0或1的int型,默认值为0。 0:设为0时,表示逐条发送解码结果。 1:设为1时,表示解码结果累积到达1MB则批量发送解码结果。 开启批量发送的场景中,当解码格式为'j'或't'时,在原来的每条解码语句之前会附加一个uint32类型,表示本条解码结果长度(长度不包含当前的uint32类型),以及一个uint64类型,表示当前解码结果对应的lsn。 在CSN序解码(即output-order设置为1)场景下,批量发送仅限于单个事务内(即如果一个事务有多条较小的语句会采用批量发送),即不会使用批量发送功能在同一批次里发送多个事务,且BEGIN和COMMIT语句不会批量发送。 parallel-queue-size: 指定并行逻辑解码线程间进行交互的队列长度。 取值范围:2~1024的int型,且必须为2的整数幂,默认值为128。 队列长度和解码过程的内存使用量正相关。
  • 串行解码 force-binary: 是否以二进制格式输出解码结果,针对不同场景呈现不同行为。 针对系统函数pg_logical_slot_get_binary_changes和pg_logical_slot_peek_binary_changes: 取值范围:bool型,默认值为false。此值无实际意义,均以二进制格式输出解码结果。 针对系统函数pg_logical_slot_get_changes、pg_logical_slot_peek_changes和pg_logical_get_area_changes: 取值范围:仅取false值的bool型。以文本格式输出解码结果。 针对流式解码: 取值范围:bool型,默认值为false。此值无实际意义,均以文本格式输出解码结果。