更新时间:2026-10-21 GMT+08:00
分享

逻辑复制函数

使用逻辑复制函数时,需要设置GUC参数wal_level为logical。具体配置请参考《开发指南》中“特性使用指导 > 逻辑复制 > 逻辑解码(非透明多写) > 使用SQL函数接口进行逻辑解码”章节。

  • pg_create_logical_replication_slot('slot_name', 'plugin_name', 'output_order')

    描述:创建逻辑复制槽。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • plugin_name

      插件名称。

      取值范围:字符串类型,支持取值包括:
      • 通用插件:mppdb_decoding、sql_decoding。
      • 仅并行解码支持:parallel_binary_decoding、parallel_json_decoding、parallel_text_decoding。
    • output_order

      复制槽解码结果输出顺序,该参数为可选参数。

      取值范围:0或1,在DN上默认值为0, 在CN上默认值为1。

      • 0:设为0时,复制槽解码结果按照事务的COMMIT LSN排序。此时复制槽的confirmed_csn为0,此复制槽称为LSN序复制槽。
      • 1:设为1时,复制槽解码结果按照事务的CSN排序。此时复制槽的confirmed_csn为非0值,此复制槽称为CSN序复制槽,此类复制槽的confirmed_flush值无意义。
    • CSN序复制槽仅分布式强一致解码使用,非分布式强一致解码要求使用LSN序复制槽。
    • 创建复制槽时,如果output_order输入的数值为小数,会将其四舍五入为整数。

    返回值类型:name, text

    示例:
    gaussdb=# SELECT * FROM pg_create_logical_replication_slot('slot_lsn','mppdb_decoding',0);
     slotname | xlog_position
    ----------+---------------
     slot_lsn | 0/6D08B58
    (1 row)
    
    gaussdb=# SELECT * FROM pg_create_logical_replication_slot('slot_csn','mppdb_decoding',1);
     slotname | xlog_position
    ----------+---------------
     slot_csn | 0/59AD800
    (1 row)

    备注:第一个返回值表示slot_name,第二个返回值在LSN序复制槽和CSN序复制槽下有不同含义。对于LSN序复制槽,该值为复制槽的confirmed_flush,表示COMMIT LSN小于等于该值的事务之后不会被解码输出;对于CSN序复制槽,该值为复制槽的confirmed_csn,表示CSN小于等于该值的事务之后不会被解码输出。调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。此函数目前只支持在CN或主DN上调用。

    当该函数在CN上执行时,如果output_order值为1,会在所有CN和主DN上创建同名复制槽,如果某些DN上已存在同名复制槽,会在除当前CN节点外,其他不存在同名复制槽的CN和主DN节点上创建CSN序逻辑复制槽,同时报错复制槽已存在。因此需删除其他CN和主DN上已有的同名复制槽(如为LSN序复制槽则需在对应节点手动删除)再在CN上重新创建。如果在CN上创建复制槽时指定output_order为0,则不会在DN上创建复制槽。CN上创建的复制槽仅用于标识DN上存在相关复制槽。

  • pg_create_physical_replication_slot('slot_name', 'isDummyStandby')

    描述:创建新的物理复制槽。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。以gs_roach开头的复制槽名为内部保留槽名,只能由内部备份工具GaussRoach使用,执行时需要设置application_name='gs_roach'。

    • isDummyStandby

      预留参数。

      类型:Boolean

    返回值类型:name,text

    • 调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。
    • 由于该函数创建的物理复制槽没有restart_lsn,会被认为是无效槽,在做checkpoint时会被自动删除。
  • pg_drop_replication_slot('slot_name')

    描述:删除流复制槽。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。以gs_roach开头的复制槽名为内部保留槽名,只能由内部备份工具GaussRoach使用,执行时需要设置application_name='gs_roach'。

    返回值类型:void

    • 调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。
    • 删除数据库时不会删除该库上的逻辑复制槽。该库上的逻辑复制槽需要手动删除,否则将会导致Xlog和系统表历史版本无法回收。
    • 在CN上删除逻辑复制槽时,若为LSN序逻辑复制槽,则仅删除当前节点复制槽,其他节点同名复制槽不受影响;否则只要其他节点有残留同名CSN序逻辑复制槽,执行删除时不会因为某些节点不存在复制槽而报错,同时所有节点的同名复制槽会被成功删除;如果任何节点均不存在该复制槽,则报错。
    • 如果当前CN节点残留LSN序逻辑复制槽,同时其他某些节点上残留同名CSN序逻辑复制槽,则在当前CN节点上执行删除复制槽操作仅会删除本地LSN序逻辑复制槽,待删除完成再次执行删除操作方可删除其他节点的同名复制槽。
  • pg_logical_slot_peek_changes('slot_name', 'upto_lsn', upto_nchanges, 'options_name', 'options_value')

    描述:解码但不推进流复制槽(下次解码可以再次获取本次解出的数据)。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • upto_lsn

      在CSN序逻辑复制槽上代表日志的CSN,表示解码直到小于等于此CSN的事务日志解码完毕(可能会解码一个CSN大于指定CSN的事务);在LSN序复制槽上代表日志的LSN,表示解码直到COMMIT LSN大于等于该LSN的第一个事务解码完毕。

      取值范围:字符串(代表十六进制格式表示的uint64,在正中间用'/'分隔,左右两边各为一个uint32,如某个uint32为0则显示0),如'1/2AAFC60'、'0/A060'或'3A/0'。为NULL时表示不对解码截止的日志位置做限制。

    • upto_nchanges

      解码条数(包含begin和commit)。假设一共有三条事务,分别包含3、5、7条记录,如果upto_nchanges为4,那么会解码出前两个事务共8条记录。解码完第二条事务时发现解码条数记录大于等于upto_nchanges,会停止解码。

      取值范围:非负整数。

      upto_lsn和upto_nchanges中任一参数达到限制,解码都会结束。

    • options:此项为可选参数,由一系列options_name和options_value一一对应组成。
      • 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型,默认值为true。

        • false:设为false时,解码信息不包含commit时间戳。
        • true:设为true时,解码信息包含commit时间戳。
      • only-local

        是否仅解码本地日志。

        取值范围:Boolean型,默认值为true。

        • false:设为false时,解码非本地日志和本地日志。
        • true:设为true时,仅解码本地日志。
      • force-binary

        是否以二进制格式输出解码结果

        取值范围:Boolean型,默认值为false。

        • false:设为false时,以文本格式输出解码结果。
        • true:暂不支持设置。
      • white-table-list

        白名单参数,包含需要进行解码的schema和表名。

        取值范围:包含白名单中表名的字符串,不同的表以','为分隔符进行隔离;使用'*'来模糊匹配所有情况;schema名和表名间以'.'分割,不允许存在任意空白符。例:

        SELECT * FROM pg_logical_slot_peek_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2');
      • skip-xid-list

        事务黑名单参数,包含需要跳过解码的事务xid。升级观察期不支持跳过事务。

        取值范围:3~18446744073709551615(即uint64最大值)。包含事务xid的字符串,不同的事务以'/'为分隔符进行隔离;不允许存在任意空白符。例:

        SELECT * FROM pg_logical_slot_peek_changes('slot1', NULL, 4096, 'skip-xid-list', '1234/2345');
      • max-txn-in-memory

        内存管控参数,单位为MB,单个事务占用内存大于该值即进行落盘。

        取值范围:0~100的整型,默认值为0,即不开启此种管控。

      • max-reorderbuffer-in-memory

        内存管控参数,单位为GB,拼接-发送线程中正在拼接的事务总内存(包含缓存)大于该值则对当前解码事务进行落盘。

        取值范围:0~100的整型,默认值为0,即不开启此种管控。

      • desc-memory-limit

        内存管控参数,单位为MB,逻辑解码任务维护的表元信息总内存大于该值时,触发淘汰机制清理部分表元信息。

        取值范围:10~1048576的整型,默认值为200。

      • include-user

        事务的BEGIN逻辑日志是否输出事务的用户名字。

        取值范围:Boolean型,默认值为false。

        • false:设为false时,事务的BEGIN逻辑日志不输出事务的用户名字。
        • true:设为true时,事务的BEGIN逻辑日志输出事务的用户名字。
      • exclude-userids

        黑名单用户的OID参数。

        取值范围:指定黑名单用户的OID,多个OID通过','分隔,不校验用户OID是否存在。

      • exclude-users

        黑名单用户的名字参数。

        取值范围:指定黑名单用户的名字,多个名字通过','分隔;通过dynamic-resolution设置是否动态解析识别用户名字。若解码报错用户不存在而中断,在确定日志产生时刻不存在对应的黑名单用户,可以通过配置dynamic-resolution成true或者从用户黑名单中删除报错用户名字来启动解码继续获取逻辑日志。

      • enable-ddl-decoding

        逻辑解码控制参数,用于控制是否开启DDL语句的逻辑解码。

        取值范围:bool型,默认值为false。
        • false:设为false时,不开启DDL语句的逻辑解码。
        • true:设为true时,开启DDL语句的逻辑解码。
      • enable-ddl-json-format

        逻辑解码控制参数,用于控制DDL的反解析流程以及输出形式。

        取值范围:bool型,默认值为false。
        • false:设为false时,传送TEXT格式的DDL反解析结果。
        • true:设为true时,传送JSON格式的DDL反解析结果。
      • skip-generated-columns:

        逻辑解码控制参数,用于跳过存储生成列的输出。对UPDATE和DELETE的旧元组无效,相应元组始终会输出存储生成列。分布式版本暂不支持生成列语法,CN解码不支持配置此选项。

        取值范围:boolean型,默认值为false/off。

        • true/on:值为true/on时,不输出存储生成列的解码结果。
        • false/off:设为false/off时,输出存储生成列的解码结果。

        虚拟生成列不受此参数控制,DML的解码结果始终不会输出虚拟生成列。

      • dynamic-resolution

        是否动态解析黑名单用户名字。

        取值范围:bool型,默认值为true。

        • false:设为false时,当解码观测到黑名单exclude-users中用户不存在时将会报错并退出逻辑解码。
        • true:设为true时,当解码观测到黑名单exclude-users中用户不存在时继续解码。
      • decode-sequence:

        逻辑解码控制参数,用来指定是否输出sequence值的变更日志的解码结果。

        取值范围:boolean型,默认值为false。

        • true:暂不支持设置。
        • false:设为false时,不输出sequence值的变更日志的解码结果。

        解码选项decode-sequence当前仅允许设置为false,设置为true会在启动解码时报错退出。

      • enable-decode-position:

        逻辑解码控制参数,该参数主要控制逻辑解码读取到解码位置日志时,是否发送该位置日志信息。

        取值范围:boolean型,默认值为false。

        • true:设为true时,输出位置日志。
        • false:设为false时,不输出位置日志。
      • enable-rowno:

        逻辑解码控制参数,该参数用以控制解码包含rowid系统列的无主键表且REPLICA IDENTITY选项明确设置为FULL或者实际效果等同于FULL时,是否输出INSERT/UPDATE/DELETE操作中新元组和旧元组的rowno系统列。使用该选项输出rowno系统列,请确保目标库中存在名称和类型相同的列,否则回放逻辑解码日志可能失败。如有疑问,请联系华为技术工程师提供技术支持。

        取值范围:boolean型

        • true:输出rowno系统列。
        • false:不输出rowno系统列。

        默认值:false

    其他配置选项可参考《开发指南》中“特性使用指导 > 逻辑复制 > 逻辑解码(非透明多写) > 逻辑解码选项”章节。

    返回值类型:text、xid、text

    示例:
    gaussdb=# EXECUTE DIRECT ON (datanode1) 'SELECT * FROM pg_logical_slot_peek_changes(''slot_lsn'',NULL,4096,''skip-empty-xacts'',''on'')';
     location  |  xid  |                                                                                            data
    -----------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     0/6D0B500 | 46914 | BEGIN 46914
     0/6D0B530 | 46914 | {"table_name":"public.t1","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","1"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
     0/6D0B8B8 | 46914 | COMMIT 46914 (at 2023-02-22 17:29:31.090018+08) CSN 94034528
     0/6D0BB58 | 46915 | BEGIN 46915
     0/6D0BB88 | 46915 | {"table_name":"public.t1","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","2"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
     0/6D0BF08 | 46915 | COMMIT 46915 (at 2023-02-22 17:31:30.672093+08) CSN 94034568
     0/6D0BF08 | 46916 | BEGIN 46916
     0/6D0BF38 | 46916 | {"table_name":"public.t1","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","3"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
     0/6D0C218 | 46916 | COMMIT 46916 (at 2023-02-22 17:31:34.438319+08) CSN 94034570
    (9 rows)
    
    gaussdb=# EXECUTE DIRECT ON (datanode1) 'SELECT * FROM pg_logical_slot_peek_changes(''slot_csn'',NULL,4096,''skip-empty-xacts'',''on'')';
     location  |  xid  |                                                                                            data
    -----------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     0/0       | 46914 | BEGIN CSN: 94034528
     0/0       | 46914 | {"table_name":"public.t1","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","1"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
     0/59ADA60 | 46914 | COMMIT 46914 (at 2023-02-22 17:29:31.090018+08) CSN 94034528
     0/59ADA60 | 46915 | BEGIN CSN: 94034568
     0/59ADA60 | 46915 | {"table_name":"public.t1","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","2"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
     0/59ADA88 | 46915 | COMMIT 46915 (at 2023-02-22 17:31:30.672093+08) CSN 94034568
     0/59ADA88 | 46916 | BEGIN CSN: 94034570
     0/59ADA88 | 46916 | {"table_name":"public.t1","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","3"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
     0/59ADA8A | 46916 | COMMIT 46916 (at 2023-02-22 17:31:34.438319+08) CSN 94034570
    (9 rows)

    备注:上述函数示例中,datanode1为需要解码的DN节点名称,slot_lsn/slot_csn为逻辑复制槽名称。

    函数返回解码结果,每一条解码结果包含三列,对应上述返回值类型,分别表示LSN(LSN序复制槽)或CSN(CSN序复制槽)位置、xid和解码内容。其中location列代表CSN时,仅当解码到COMMIT日志时才会更新。调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。

    在CN上,该函数不支持在CSN序复制槽(confirmed_csn值不为0)上执行。

  • pg_logical_slot_get_changes('slot_name', 'upto_lsn', upto_nchanges, 'options_name', 'options_value')

    描述:解码并推进流复制槽。

    参数说明:与pg_logical_slot_peek_changes一致,详细内容请参见pg_logical_slot_peek_changes('slot_name', 'upto_lsn', upto_nchanges, 'options_name', 'options_value')。

    备注:调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。

    在CN上,该函数不支持在CSN序复制槽(confirmed_csn值不为0)上执行。此函数在备DN调用会同步推进主DN上对应的逻辑复制槽。在备DN上执行该函数,推进主DN对应复制槽时需占用主DN的一个walsender。由于逻辑解码功能会为每个逻辑复制槽预留walsender,因此正常场景执行该函数会正常推进主DN的逻辑复制槽,如果短时间连续执行该函数会导致通知主DN推进失败,且没有报错。

  • pg_logical_slot_peek_binary_changes('slot_name', 'upto_lsn', upto_nchanges, 'options_name', 'options_value')

    描述:以二进制格式解码且不推进流复制槽(下次解码可以再次获取本次解出的数据)。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • upto_lsn

      在CSN序逻辑复制槽上代表日志的CSN,表示解码直到小于等于此CSN的事务日志解码完毕(可能会解码一个CSN大于指定CSN的事务);在LSN序复制槽上代表日志的LSN,表示解码直到COMMIT LSN大于等于该LSN的第一个事务解码完毕。

      取值范围:字符串(代表十六进制格式表示的uint64,在正中间用'/'分隔,左右两边各为一个uint32,如某个uint32为0则显示0),如'1/2AAFC60'、'0/A060'或'3A/0'。为NULL时表示不对解码截止的日志位置做限制。

    • upto_nchanges

      解码条数(包含begin和commit)。假设一共有三条事务,分别包含3、5、7条记录,如果upto_nchanges为4,那么会解码出前两个事务共8条记录。解码完第二条事务时发现解码条数记录大于等于upto_nchanges,会停止解码。

      取值范围:非负整数。

      upto_lsn和upto_nchanges中任一参数达到限制,解码都会结束。

    • options:此项为可选参数,由一系列options_name和options_value一一对应组成。
      • include-xids

        解码出的data列是否包含xid信息。

        取值范围:Boolean型,默认值为true。

        • false:设为false时,解码出的data列不包含xid信息。
        • true:设为true时,解码出的data列包含xid信息。
      • skip-empty-xacts

        解码时是否忽略空事务信息。

        取值范围:Boolean型,默认值为false。

        • false:设为false时,解码时不忽略空事务信息。
        • true:设为true时,解码时会忽略空事务信息。
      • include-timestamp

        解码信息是否包含commit时间戳。

        取值范围:Boolean型,默认值为true。

        • false:设为false时,解码信息不包含commit时间戳。
        • true:设为true时,解码信息包含commit时间戳。
      • only-local

        是否仅解码本地日志。

        取值范围:Boolean型,默认值为true。

        • false:设为false时,解码非本地日志和本地日志。
        • true:设为true时,仅解码本地日志。
      • force-binary

        对此函数不生效。

        取值范围:Boolean型,均以二进制格式输出结果。

      • white-table-list

        白名单参数,包含需要进行解码的Schema和表名。

        取值范围:包含白名单中表名的字符串,不同的表以','为分隔符进行隔离;使用'*'来模糊匹配所有情况;schema名和表名间以'.'分割,不允许存在任意空白符。例:select * from pg_logical_slot_peek_binary_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2');

      • skip-xid-list

        事务黑名单参数,包含需要跳过解码的事务xid。升级观察期不支持跳过事务。

        取值范围:3~18446744073709551615(即uint64最大值)。包含事务xid的字符串,不同的事务以'/'为分隔符进行隔离;不允许存在任意空白符。例:

        SELECT * FROM pg_logical_slot_peek_changes('slot1', NULL, 4096, 'skip-xid-list', '1234/2345');
      • max-txn-in-memory

        内存管控参数,单位为MB,单个事务占用内存大于该值即进行落盘。

        取值范围:0~100的整型,默认值为0,即不开启此种管控。

      • max-reorderbuffer-in-memory

        内存管控参数,单位为GB,拼接-发送线程中正在拼接的事务总内存(包含缓存)大于该值则对当前解码事务进行落盘。

        取值范围:0~100的整型,默认值为0,即不开启此种管控。

      • desc-memory-limit

        内存管控参数,单位为MB,逻辑解码任务维护的表元信息总内存大于该值时,触发淘汰机制清理部分表元信息。

        取值范围:10~1048576的整型,默认值为200。

      • include-user

        事务的BEGIN逻辑日志是否输出事务的用户名字。

        取值范围:Boolean型,默认值为false。

        • false:设为false时,事务的BEGIN逻辑日志不输出事务的用户名字。
        • true:设为true时,事务的BEGIN逻辑日志输出事务的用户名字。
      • exclude-userids

        黑名单用户的OID参数。

        取值范围:指定黑名单用户的OID,多个OID通过','分隔,不校验用户OID是否存在。

      • exclude-users

        黑名单用户的名字参数。

        取值范围:指定黑名单用户的名字,多个名字通过逗号(,)分隔;通过dynamic-resolution设置是否动态解析识别用户名字。若解码报错用户不存在而中断,在确定日志产生时刻不存在对应的黑名单用户,可以通过配置dynamic-resolution为true或者从用户黑名单中删除报错用户名字来启动解码继续获取逻辑日志。

      • dynamic-resolution

        是否动态解析黑名单用户名字。

        取值范围:Boolean型,默认值为true。

        • false:设为false时,当解码观测到黑名单exclude-users中用户不存在时将会报错并退出逻辑解码。
        • true:设为true时,当解码观测到黑名单exclude-users中用户不存在时继续解码。
      • decode-sequence:

        逻辑解码控制参数,用来指定是否输出sequence值的变更日志的解码结果。

        取值范围:boolean型,默认值为false。

        • true:暂不支持设置。
        • false:设为false时,不输出sequence值的变更日志的解码结果。

        解码选项decode-sequence当前仅允许设置为false,设置为true会在启动解码时报错退出。

      • enable-decode-position:

        逻辑解码控制参数,该参数主要控制逻辑解码读取到解码位置日志时,是否发送该位置日志信息。

        取值范围:boolean型,默认值为false。

        • true:设为true时,输出位置日志。
        • false:设为false时,不输出位置日志。
      • enable-rowno:

        逻辑解码控制参数,该参数用以控制解码包含rowid系统列的无主键表且REPLICA IDENTITY选项明确设置为FULL或者实际效果等同于FULL时,是否输出INSERT/UPDATE/DELETE操作中新元组和旧元组的rowno系统列。使用该选项输出rowno系统列,请确保目标库中存在名称和类型相同的列,否则回放逻辑解码日志可能失败。如有疑问,请联系华为技术工程师提供技术支持。

        取值范围:boolean型

        • true:输出rowno系统列。
        • false:不输出rowno系统列。

        默认值:false

      某些配置选项在函数中仅能配置而不实际生效,可参考《开发指南》中“特性使用指导 > 逻辑复制 > 逻辑解码(非透明多写) > 逻辑解码选项”章节。

    返回值类型:text、xid、bytea

    备注:函数返回解码结果,每一条解码结果包含三列,对应上述返回值类型,分别表示LSN位置、xid和二进制格式的解码内容。调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。

    在CN上,该函数不支持在CSN序复制槽(confirmed_csn值不为0)上执行。

  • pg_logical_slot_get_binary_changes('slot_name', 'upto_lsn', upto_nchanges, 'options_name', 'options_value')

    描述:以二进制格式解码并推进流复制槽。

    参数说明:与pg_logical_slot_peek_binary_changes一致,详细内容请参见pg_logical_slot_peek_bi...。

    备注:调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。

    在CN上,该函数不支持在CSN序复制槽(confirmed_csn值不为0)上执行。该函数不支持在备DN上执行。

  • pg_replication_slot_advance ('slot_name', 'upto_lsn')

    描述:直接推进流复制槽到指定位置(CSN序逻辑复制槽代表CSN,LSN序复制槽代表LSN),不输出解码结果。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,不支持除小写字母,数字,以及“_”,“?”,“-”,“.”以外的字符,且不支持'.'或'..'单独作为复制槽名称。

    • upto_lsn

      在CSN序逻辑复制槽上代表推进到的日志CSN位置,下次解码时只会输出比该CSN大的事务结果。如果输入的CSN比当前流复制槽记录的confirmed_csn还要小,则直接返回;如果输入的CSN比当前可获取的最新CSN要大,则推进到当前可获取的最新CSN;如果输入的CSN比当前最新物理日志CSN小,则推进到第一个比输入的CSN大的有效日志位置。

      在LSN序复制槽上代表推进到的日志LSN位置,下次解码时只会输出提交位置比该LSN大的事务结果。如果输入的LSN比当前流复制槽记录的推进位置还要小,则报错;如果输入的LSN比当前最新物理日志LSN还要大,则推进到当前最新物理日志LSN;如果输入的LSN比当前最新物理日志LSN小,则推进到第一个比输入的LSN大的有效日志位置。

      取值范围:字符串(代表十六进制格式表示的uint64,在正中间用'/'分隔,左右两边各为一个uint32,如某个uint32为0则显示0),如'1/2AAFC60'、'0/A060'或'3A/0'。为NULL时表示不对解码截止的日志位置做限制。

    返回值类型:name, text

    • 返回值分别对应slot_name和实际推进到的位置(CSN或LSN)。调用该函数的用户需要具有SYSADMIN权限或具有REPLICATION权限或继承了内置角色gs_role_replication的权限。
    • 在CN上,该函数不支持在CSN序复制槽(confirmed_csn值不为0)上执行。该函数在备DN上支持对备份复制槽的执行。该函数在备DN上支持对逻辑复制槽执行,同步推进主DN上对应的逻辑复制槽。在备DN上执行该函数,推进主DN对应复制槽时需占用主DN的一个walsender。由于逻辑解码功能会为每个逻辑复制槽预留walsender,因此正常场景执行该函数会正常推进主DN的逻辑复制槽,如果短时间连续执行该函数会导致通知主DN推进失败,且没有报错。
  • pg_get_replication_slots()

    描述:获取复制槽列表。

    表1 返回值说明

    字段名称

    数据类型

    说明

    slot_name

    text

    复制槽名称。

    plugin

    text

    逻辑复制槽对应的输出插件名称。

    slot_type

    text

    复制槽的类型:
    • physical:物理复制槽。
    • logical:逻辑复制槽。

    datoid

    oid

    复制槽所在的数据库OID。

    active

    boolean

    复制槽是否为激活状态:
    • f:未激活。
    • t:已激活。

    xmin

    xid

    数据库须为复制槽保留的最早事务的事务号。

    catalog_xmin

    xid

    数据库须为逻辑复制槽保留的最早的涉及系统表的事务的事务号。

    restart_lsn

    text

    复制槽需要的最早Xlog的物理位置。

    dummy_standby

    boolean

    预留参数。

    confirmed_flush

    text

    客户端确认接收到的日志位置(逻辑复制槽专用)。

    confirmed_csn

    xid

    客户端确认接收到的日志中最后一个事务对应的CSN(逻辑复制槽专用)。

    dictionary_csn_min

    xid

    数据库须为逻辑复制槽保留的最早的涉及字典表的事务提交CSN。

    slot_dictionary_type

    text

    逻辑复制槽的类型。

    intra_cluster

    boolean

    该复制槽是否无需在集群之间进行同步:
    • true:无需同步。
    • false:需同步。

    remote_stream

    boolean

    该复制槽当前是否在解码远端日志流。

    示例:
    在DN上执行查询:
    gaussdb=# SELECT * FROM pg_get_replication_slots();
     slot_name |     plugin     | slot_type | datoid | active | xmin | catalog_xmin | restart_lsn | dummy_standby | confirmed_flush | confirmed_csn | dictionary_csn_min | slot_dictionary_type | intra_cluster | remote_stream
    -----------+----------------+-----------+--------+--------+------+--------------+-------------+---------------+-----------------+---------------+--------------------+----------------------
     dn_6002   |                | physical  |      0 | t      |      |              | 0/3622B528  | f             |                 |               |                    |                      |
      f           |     f
     dn_6003   |                | physical  |      0 | t      |      |              | 0/3622B528  | f             |                 |               |                    |                      |
      f           |     f
                    
     slot_lsn  | mppdb_decoding | logical   | 131072 | f      |      |        66658 | 0/36252350  | f             | 0/362523D0      |               |                    |                      |
      f           |     f
     slot_test | mppdb_decoding | logical   | 131072 | f      |      |        66658 | 0/36251718  | f             |                 |      10025527 |                    |                      |
      f           |     f
    (4 rows)
    在CN上执行查询:
    gaussdb=# SELECT * FROM pg_get_replication_slots();
     slot_name |     plugin     | slot_type | datoid | active | xmin | catalog_xmin | restart_lsn | dummy_standby | confirmed_flush | confirmed_csn | dictionary_csn_min | slot_dictionary_type |
    intra_cluster | remote_stream
    -----------+----------------+-----------+--------+--------+------+--------------+-------------+---------------+-----------------+---------------+--------------------+----------------------
     slot_test | mppdb_decoding | logical   | 139264 | f      |      |              |             | f             |                 |               |                    |                      |
      f           |     f      
    (1 row)

    在DN上执行查询,LSN序逻辑复制槽的confirmed_csn查询结果为空,CSN序逻辑复制槽的confirmed_flush查询结果为空;在CN上执行查询,CSN序逻辑复制槽的catalog_xmin、restart_lsn、confirmed_flush和confirmed_csn均不予显示,查询结果为空。

  • pg_logical_get_area_changes('start_lsn', 'upto_lsn', upto_nchanges, 'decoding_plugin', 'xlog_path', 'options_name', 'options_value')

    描述:指定lsn区间进行解码,或者指定Xlog文件进行解码。

    约束条件如下:

    • 当前网络和硬件环境正常。
    • 单条元组大小建议不超过500MB,500MB~1GB之间会报错。
    • 不支持数据页复制这种不落Xlog的日志解码。
    • 调用接口时,要求日志级别wal_level=logical,且只有在wal_level=logical期间产生的日志文件才能被解析。如果使用的Xlog文件为非logical级别,则报错不解码。
    • Xlog文件只能被完全同构的dn的某个副本解析,且数据库没有发生DDL操作和VACUUM FULL,以确保可以找到数据对应的元信息。
    • 需注意一次不要读入过多Xlog文件,在指定范围解码不指定文件解码时,推荐指定一次一个Xlog文件的大小。一般情况下,一个Xlog文件解码过程中占用内存约为该Xlog文件大小的2~3倍。
    • 不支持VACUUM FULL之前的日志解码。
    • 不能解码扩容前的Xlog文件。
    • enable-ddl不打开时:不支持toast类型、clob类型和blob类型的字段解码。当enable-ddl打开时:支持相关类型的解码。
    • 此解码方式为根据Xlog文本记录数据进行解码,将可解码内容解码出来,不基于事务进行解码。因此不在此Xlog里的数据无法解码。若相关Xlog日志缺失,缺失日志也无法解码。
    • enable-ddl不打开时:从解码点开始,如果未指定解码文件,会先检测从解码开始点到最新redo值之间是否发生ddl,如果发生ddl则全部不解码;如果指定解码文件,会同时检测解码文件的开始点到文件最后可读内容之间,以及数据目录下Xlog开始点到最新redo值之间是否发生ddl,检测到一条ddl则对所有表都不解码。
    • enable-ddl不打开时:不支持toast类型、clob类型和blob类型的字段解码。当enable-ddl打开时:支持相关类型的解码。
    • enable-ddl打开时:支持区间含有DDL的解码,并且可以解码输出DDL语句,输出DDL语句范围请参见《开发指南》中“特性使用指导 > 逻辑复制 > 逻辑解码(非透明多写) > 逻辑解码支持DDL”章节。
    • 为解析某个表的UPDATE和DELETE语句,需为此表配置REPLICA IDENTITY属性,在此表无主键时需要配置为FULL,具体配置方式请参见ALTER TABLE章节中“REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }”字段。
    • M兼容模式下,float4类型的解码数据值会以实际存储值输出,行为同SQL查询存在显示上的差异。

    备注:打开三权分立时,只有数据库初始用户可以调用;关闭三权分立时,需要具备系统管理员权限。

    参数说明:

    • start_lsn

      指定开始解码的lsn。

      取值范围:字符串(LSN,格式为xlogid/xrecoff),如'1/2AAFC60'。为NULL时表示不对解码起始的日志位置做限制。

    • upto_lsn

      指定解码结束的lsn。

      取值范围:字符串(LSN,格式为xlogid/xrecoff),如'1/2AAFC60'。为NULL时表示不对解码截止的日志位置做限制。

    • upto_nchanges

      解码条数(包含begin和commit)。假设一共有三条事务,分别包含3、5、7条记录,如果upto_nchanges为4,那么会解码出前两个事务共8条记录。解码完第二条事务时发现解码条数记录大于等于upto_nchanges,会停止解码。

      取值范围:非负整数。

      LSN和upto_nchanges中任一参数达到限制,解码都会结束。

    • decoding_plugin

    解码插件,指定解码内容输出格式的so插件。

    取值范围:提供mppdb_decoding和sql_decoding两个解码插件。

    • xlog_path

    解码插件,指定解码文件的Xlog绝对路径。

    取值范围:NULL 或者 Xlog文件绝对路径的字符串。

    • options:此项为可选参数,由一系列options_name和options_value一一对应组成,可以缺省。
      • include-xids

        解码出的data列是否包含xid信息。

        取值范围:bool型,默认值为true。

        false:设为false时,解码出的data列不包含xid信息。

        true:设为true时,解码出的data列包含xid信息。

      • include-timestamp

        解码信息是否包含commit时间戳。

        取值范围:bool型,默认值为true。

        false:设为false时,解码信息不包含commit时间戳。

        true:设为true时,解码信息包含commit时间戳。

      • only-local

        是否仅解码本地日志。

        取值范围:Boolean型,默认值为true。

        false:设为false时,解码非本地日志和本地日志。

        true:设为true时,仅解码本地日志。

      • force-binary

        是否以二进制格式输出解码结果

        取值范围:Boolean型,默认值为false。

        false:设为false时,以文本格式输出解码结果。

        true:暂不支持设置。

      • white-table-list

        白名单参数,包含需要进行解码的Schema和表名。取值范围:包含白名单中表名的字符串,不同的表以','为分隔符进行隔离;使用'*'来模糊匹配所有情况;Schema名和表名间以'.'分割,不允许存在任意空白符。

      • white-database-list

        白名单参数,包含需要进行解码的database名。取值范围:包含白名单中database名的字符串,不同的database名以','为分隔符进行隔离;不允许存在任意空白符。如果不设置white-database-list时,只解码当前连接的database Xlog日志;如果设置white-database-list时,只解码white-database-list里的database Xlog日志。如果是对系统库解码时,也支持对系统库中普通表的数据找回。

      • enable-ddl

        支持含有DDL语法的解码。从起始位置到当前最新日志之间,如果出现DDL语法,不影响功能使用。取值范围:0或1。

        设置为1:打开状态。该函数支持含有DDL语法的解码。

        设置为0:默认关闭状态。该函数不支持含有DDL语法的解码,如果检测到DDL语句,直接退出。

        若表结构发生过删除列操作,enable-ddl在打开状态时,解码数据的列名会被UNDEFINED占位符替代。

      • data-limit

        解码输出数据量。单位:KB。

        取值范围:大于等于0的整数。默认值0,表示不限制解码结果大小。

        该函数入参data-limit与GUC中data-limit配合使用,解码超过data-limit大小结束。

        规则:

        1. GUC中data-limit设置为0,函数解码data-limit不设置或者设置为0,解码结果无上限。
        2. GUC中data-limit不设置,函数解码data-limit设置为0,解码结果上限为10GB。
        3. GUC中data-limit设置,函数解码data-limit不设置或者设置为0,解码结果上限为GUC中的data-limit。
        4. GUC中data-limit和函数data-limit同时设置,取两者较小值作为解码结果上限。
      • xlog_dir:

        支持归档日志文件夹解码,且文件夹名称与WAL日志文件前8位同名。当且仅当enable-ddl = 1,输入的start_lsn 和 upto_lsn 为有效区间,可以进行解码。取值范围:文件夹的全路径。

        具体可参考《开发指南》中“特性使用指导 > 逻辑复制 > 逻辑解码(非透明多写) > 逻辑解码数据找回功能”章节。

        gaussdb=# SELECT * FROM pg_logical_get_area_changes('1/F9FC24C8', '1/FA67B2A0', NULL, 'sql_decoding', NULL ,'enable-ddl','1','xlog_dir','/base/username/xlog_dir/00000000');
      • decode-sequence:

        逻辑解码控制参数,用来指定是否输出sequence值的变更日志的解码结果。

        取值范围:boolean型,默认值为false。

        • true:暂不支持设置。
        • false:设为false时,不输出sequence值的变更日志的解码结果。

        解码选项decode-sequence当前仅允许设置为false,设置为true会在启动解码时报错。

      • enable-rowno:

        逻辑解码控制参数,该参数用以控制解码包含rowid系统列的无主键表且REPLICA IDENTITY选项明确设置为FULL或者实际效果等同于FULL时,是否输出INSERT/UPDATE/DELETE操作中新元组和旧元组的rowno系统列。使用该选项输出rowno系统列,请确保目标库中存在名称和类型相同的列,否则回放逻辑解码日志可能失败。如有疑问,请联系华为技术工程师提供技术支持。

        取值范围:boolean型

        • true:输出rowno系统列。
        • false:不输出rowno系统列。

        默认值:false

    pg_logical_get_area_changes只对以上参数生效。其余参数max-txn-in-memory、include-user、exclude-userids、exclude-users、dynamic-resolution等(详见pg_logical_slot_peek_changes)不生效。

    返回值类型:text、xid、text

    示例:

    -在CN上执行DML操作,在DN上可以查询出当前DN上执行的DML:
    gaussdb=# SELECT * FROM pg_logical_get_area_changes('0/502E418', NULL, NULL, 'sql_decoding', NULL);
     location  |  xid  |                                  data
    -----------+-------+------------------------------------------------------------------------
     0/502E448 | 17365 | insert into public.t1 values (1, 1);
     0/502E5A0 | 17365 | COMMIT 17365 (at 2023-11-01 11:28:43.92526+08) 2010016
     0/502E5D0 | 17366 | delete from public.t1 where a = 1;insert into public.t1 values (1, 2);
     0/502E6D8 | 17366 | COMMIT 17366 (at 2023-11-01 11:28:45.889283+08) 2010017
     0/502E7B8 | 17367 | delete from public.t1 where a = 1;
     0/502E8B0 | 17367 | COMMIT 17367 (at 2023-11-01 11:28:48.301307+08) 2010018
    (6 rows)

    备注:函数返回解码结果,每一条解码结果包含三列,对应上述返回值类型,分别表示LSN位置、xid和解码内容。

  • gs_get_parallel_decode_status()

    描述:监控各个解码线程的读取日志队列和解码结果队列的长度,以便定位并行解码性能瓶颈。

    返回值类型:text、int、text、text、text、int64、int64、TimestampTz

    示例:

    gaussdb=# SELECT * FROM gs_get_parallel_decode_status();
     slot_name | parallel_decode_num | read_change_queue_length  | decode_change_queue_length | reader_lsn | working_txn_cnt | working_txn_memory |      decoded_time
    -----------+---------------------+---------------------------+----------------------------+------------+-----------------+--------------------+------------------------
     slot1     |                   2 | queue0: 1005, queue1: 320 | queue0: 63, queue1: 748    | 0/1DCE2578 |              42 |          192927504 | 2023-01-10 11:18:22+08
    (1 row)

    备注:返回值的slot_name代表复制槽名,parallel_decode_num代表该复制槽的并行解码线程数,read_change_queue_length列出了每个解码线程读取日志队列的当前长度,decode_change_queue_length列出了每个解码线程解码结果队列的当前长度,reader_lsn表示当前reader线程读取的日志位置,working_txn_cnt表示当前拼接-发送线程中正在拼接的事务个数,working_txn_memory代表拼接-发送线程中拼接事务占用总内存(单位字节),decoded_time代表该复制槽最新解码到的WAL日志时间。

    decoded_time时间来自检查点日志和事务提交日志,存在一定误差。如果没有解码到任何前述包含时间的日志,则显示“2000-01-01 08:00:00+08”(依照数据库设置的时区而定)。

  • gs_get_slot_decoded_wal_time(slot_name)

    描述:查看某个复制槽最新解码的WAL日志时间。

    参数说明:

    • slot_name:

      要查询的复制槽名称。

      取值范围:字符串,不支持除字母、数字以及“_”,“?”,“-”,“.”以外的字符。

    示例:

    gaussdb=# SELECT * FROM gs_get_slot_decoded_wal_time('replication_slot');
     gs_get_slot_decoded_wal_time
    ------------------------------
     2023-01-10 11:25:22+08
    (1 row)

    备注:返回一列值代表该复制槽最新解码到的WAL日志时间。

    • 返回的时间来自检查点日志和事务提交日志,存在一定误差。如果没有解码到任何前述包含时间的日志,则显示“2000-01-01 08:00:00+08”(依照数据库设置的时区而定)。查询一个当前不存在的逻辑复制槽的最新解码的WAL日志时间时,返回NULL,在gsql中NULL显示和设置有关,可以使用\pset null 'null'设置。
    • 不支持串行解码使用。
  • gs_logical_parallel_decode_status('slot_name')

    描述:获取并行逻辑解码中活跃复制槽的解码统计信息,包含29行指标。

    指标定义如下:

    Record - (stat_id int, stat_name TEXT, value TEXT)
    表2 指标含义

    指标名称

    说明

    slot_name

    逻辑解码任务复制槽名称。

    reader_lsn

    逻辑解码日志位置。

    wal_read_total_time

    日志模块加载耗时,单位:微秒。

    wal_wait_total_time

    日志模块等待耗时,单位:微秒。

    parser_total_time

    reader线程处理耗时,单位:微秒。

    decoder_total_time

    各decoder线程处理耗时总值,单位:微秒。

    sender_total_time

    sender线程处理耗时,单位:微秒。

    net_send_total_time

    网络发送逻辑日志耗时,单位:微秒。

    net_wait_total_time

    网络等待发送逻辑日志耗时,单位:微秒。

    net_send_total_bytes

    网络发送逻辑日志字节数,单位:byte。

    transaction_count

    事务数量。

    big_transaction_count

    大事务数量。

    max_transaction_tuples

    事务操作元组的最大数量。

    sent_transaction_count

    发送事务数量(本库)。

    spill_disk_transaction_count

    落盘事务数量。

    spill_disk_bytes

    累计落盘字节数量,单位:byte。

    spill_disk_count

    落盘次数。

    input_queue_full_count

    各decode线程输入队列FULL次数总数。

    output_queue_full_count

    各decode线程输出队列FULL次数总数。

    dml_count

    各decode线程解码WAL日志中DML数量(本库)总数。

    dml_filtered_count

    各decode线程解码过滤WAL日志中DML数量(本库)总数。

    toast_count

    涉及TOAST表修改行数。

    candidate_catalog_xmin

    当前逻辑复制槽catalog_xmin候选点。

    candidate_xmin_lsn

    LSN序逻辑复制槽推进catalog_xmin所需要的日志确认接收点。

    candidate_restart_valid

    LSN序逻辑复制槽推进restart_lsn所需要的日志确认接收点。

    candidate_restart_lsn

    当前逻辑复制槽restart_lsn候选点。

    candidate_xmin_csn

    CSN序逻辑复制槽推进catalog_xmin所需要的日志确认接收点。

    candidate_restart_csn

    CSN序逻辑复制槽推进restart_lsn所需要的日志确认接收点。

    candidate_csn_min

    当前逻辑复制槽dictionary_csn_min(参考函数pg_get_replication_slot...)的候选点。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    返回值类型:int、text、text

    示例:

    gaussdb=# SELECT * FROM gs_logical_parallel_decode_status('replication_slot');
     stat_id |          stat_name           |        value
    ---------+------------------------------+----------------------
           1 | slot_name                    | replication_slot_lsn
           2 | reader_lsn                   | 0/1E249228
           3 | wal_read_total_time          | 4769541
           4 | wal_wait_total_time          | 4754879
           5 | parser_total_time            | 12727
           6 | decoder_total_time           | 215633
           7 | sender_total_time            | 41707
           8 | net_send_total_time          | 28435
           9 | net_wait_total_time          | 11918
          10 | net_send_total_bytes         | 931076
          11 | transaction_count            | 19
          12 | big_transaction_count        | 1
          13 | max_transaction_tuples       | 10000
          14 | sent_transaction_count       | 19
          15 | spill_disk_transaction_count | 0
          16 | spill_disk_bytes             | 0
          17 | spill_disk_count             | 0
          18 | input_queue_full_count       | 226
          19 | output_queue_full_count      | 13
          20 | dml_count                    | 10000
          21 | dml_filtered_count           | 0
          22 | toast_count                  | 0
          23 | candidate_catalog_xmin       | 83576
          24 | candidate_xmin_lsn           | 0/1E0992A0
          25 | candidate_restart_valid      | 0/1E0992A0
          26 | candidate_restart_lsn        | 0/1E0992A0
          27 | candidate_xmin_csn           | 0
          28 | candidate_restart_csn        | 0
          29 | candidate_csn_min            | 17157
    (29 rows)

    备注:按照指标定义,指标应该满足下列约束关系:

    wal_read_total_time >= wal_wait_total_time;

    transaction_count >= big_transaction_count;

    transaction_count >= sent_transaction_count;

    transaction_count >= spill_disk_transaction_count;

    dml_count >= dml_filtered_count;

    dml_count >= toast_count;

    如果spill_transaction_count == 0,那么 spill_disk_bytes == 0;

    但由于严格保证需要频繁加锁解锁,将对性能造成较大影响,故上面约束关系在多线程情况下可能不满足。

    transaction_count 统计的是所有库的事务数量。

    sent_transaction_count统计的是本库的发送事务数量,因为非本库事务将不会被发送。

    当传入不存在的slot_name时,函数不报错,返回值为空。

  • gs_logical_parallel_decode_reset_status('slot_name')

    描述:重置gs_logical_parallel_decode_status('slot_name')中的指标。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    返回值类型:text

    示例:

    gaussdb=# SELECT * FROM gs_logical_parallel_decode_reset_status('replication_slot');
     gs_logical_parallel_decode_reset_status
    -----------------------------------------
     OK
    (1 row)
    
    gaussdb=# SELECT * FROM gs_logical_parallel_decode_status('replication_slot');
     stat_id |          stat_name           |        value
    ---------+------------------------------+----------------------
           1 | slot_name                    | replication_slot_lsn
           2 | reader_lsn                   | 0/1E2497F0
           3 | wal_read_total_time          | 0
           4 | wal_wait_total_time          | 0
           5 | parser_total_time            | 0
           6 | decoder_total_time           | 0
           7 | sender_total_time            | 0
           8 | net_send_total_time          | 0
           9 | net_wait_total_time          | 0
          10 | net_send_total_bytes         | 0
          11 | transaction_count            | 0
          12 | big_transaction_count        | 0
          13 | max_transaction_tuples       | 0
          14 | sent_transaction_count       | 0
          15 | spill_disk_transaction_count | 0
          16 | spill_disk_bytes             | 0
          17 | spill_disk_count             | 0
          18 | input_queue_full_count       | 0
          19 | output_queue_full_count      | 0
          20 | dml_count                    | 0
          21 | dml_filtered_count           | 0
          22 | toast_count                  | 0
          23 | candidate_catalog_xmin       | 83594
          24 | candidate_xmin_lsn           | 0/1E249528
          25 | candidate_restart_valid      | 0/1E249528
          26 | candidate_restart_lsn        | 0/1E249528
          27 | candidate_xmin_csn           | 0
          28 | candidate_restart_csn        | 0
          29 | candidate_csn_min            | 17176
    (29 rows)

    备注:返回值为执行结果,传入不存在的slot_name时,函数不报错,返回值为invalid slot name。

    不允许对正在进行observe的复制槽进行reset操作,异常信息按优先级如下:
    1. slot_name为空,报错,显示:ERROR: inputString should not be NULL。
    2. slot_name不为空,但不存在,不报错,显示:invalid slot name。
    3. slot_name不为空,但当前slot_name对应的复制槽正在被采样(observing),不报错,显示:can't reset during observing! use gs_logical_decode_stop_observe to stop。
  • gs_logical_decode_start_observe('slot_name', window, interval)

    描述:开启逻辑复制性能指标采样。分布式需要在DN上执行。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • window

      指定采样窗口大小

      取值范围:整数类型,最小2,最大1024,收集最近interval*window时间内采样数据。

    • interval

      性能监控的间隔,时间间隔类型,秒级。

      取值范围:时间间隔类型,最小1s,最大60s,收集最近interval*window时间内采样数据。

      返回值类型:text

    备注:返回值为执行结果,传入不存在的slot_name时,函数不报错,返回值为invalid slot name。

    不允许对已经开启observe的复制槽进行开启observe操作,异常信息按优先级如下:
    1. slot_name为空,报错,显示:ERROR: inputString should not be NULL。
    2. slot_name不为空,但不存在,不报错,显示:invalid slot name。
    3. 若window小于2,则显示:window has to be >= 2。
    4. 若window大于1024,则显示:window has to be <= 1024。
    5. 若interval小于1s,则显示:sample interval has to be >= 1s。
    6. 若interval大于60s,则显示:sample interval has to be <= 60s。
    7. slot_name不为空,但当前slot_name对应的复制槽已开启observe,不报错,显示:observe has started!
  • gs_logical_decode_stop_observe('slot_name')

    描述:停止逻辑复制性能指标采样。分布式需要在DN上执行。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • 返回值类型:text

    备注:返回值为执行结果,传入不存在的slot_name时,函数不报错,返回值为invalid slot name。

    不允许对已经停止observe的复制槽进行停止observe操作,异常信息按优先级如下:
    1. slot_name为空,报错,显示:ERROR: inputString should not be NULL。
    2. slot_name不为空,但不存在,不报错,显示:invalid slot name。
    3. slot_name不为空,但当前slot_name对应的复制槽已停止observe,不报错,显示:observe not started!
  • gs_logical_decode_observe_data('slot_name')

    描述:展示逻辑复制性能指标采样原始数据。分布式需要在DN上执行。

    表3 指标含义

    指标名称

    说明

    slot_name

    逻辑解码任务复制槽名称。

    sample_time

    性能指标采样时间,单位:微秒。

    reader_lsn

    逻辑解码日志位置。

    wal_read_total_time

    日志模块加载耗时,单位:微秒。

    wal_wait_total_time

    日志模块等待耗时,单位:微秒。

    parser_total_time

    reader线程处理耗时,单位:微秒。

    decoder_total_time

    各decoder线程处理耗时总值,单位:微秒。

    sender_total_time

    sender线程处理耗时,单位:微秒。

    net_send_total_time

    网络发送逻辑日志耗时,单位:微秒。

    net_send_total_bytes

    网络发送逻辑日志字节数,单位:byte。

    transaction_count

    事务数量。

    big_transaction_count

    大事务数量。

    sent_transaction_count

    发送事务数量(本数据库)。

    spill_transaction_count

    落盘事务数量。

    spill_disk_bytes

    累计落盘字节数量,单位:byte。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • 返回值类型:setof record

    示例:

    gaussdb=# SELECT * FROM gs_logical_decode_observe_data('replication_slot');
     slot_name |          sample_time          | reader_lsn | wal_read_total_time | wal_wait_total_time | parser_total_time | decoder_total_time | sender_total_time | net_send_total_time | net_send_total_bytes | transaction_count | big_
    transaction_count | sent_transaction_count | spill_transaction_count | spill_disk_bytes 
    -----------+-------------------------------+------------+---------------------+---------------------+-------------------+--------------------+-------------------+---------------------+----------------------+-------------------+-----
    ------------------+------------------------+-------------------------+------------------
     repl      | 2023-01-12 20:09:40.416798+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:09:45.416849+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:09:50.417006+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:09:55.417057+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:00.417115+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:05.417165+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:10.417217+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:15.417271+08 |   49447976 |           776846657 |           776846244 |                65 | {46,11,11,6}       |                56 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:20.417342+08 |   49448264 |           836085882 |           836085442 |                67 | {46,11,11,8}       |                58 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:25.417433+08 |   49448264 |           836085882 |           836085442 |                67 | {46,11,11,8}       |                58 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:30.417526+08 |   49448264 |           836085882 |           836085442 |                67 | {46,11,11,8}       |                58 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:35.417532+08 |   49448264 |           836085882 |           836085442 |                67 | {46,11,11,8}       |                58 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:40.417644+08 |   49448264 |           836085882 |           836085442 |                67 | {46,11,11,8}       |                58 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
     repl      | 2023-01-12 20:10:45.417763+08 |   49448264 |           836085882 |           836085442 |                67 | {46,11,11,8}       |                58 |                   0 |                    0 |                 0 |     
                    0 |                      0 |                       0 |                0
    (14 rows)

    备注:传入不存在的slot_name时,函数不报错,返回值为空记录。

  • gs_logical_decode_observe('slot_name')

    描述:展示逻辑复制性能指标数据。分布式需要在DN上执行。

    表4 指标含义

    指标名称

    说明

    slot_name

    逻辑解码任务复制槽名称。

    sample_time

    性能指标采样时间。

    logical_decode_rate

    逻辑解码整体推进速率,单位:byte/s。

    wal_read_rate

    WAL日志读取阶段处理速率,单位:byte/s。

    parser_rate

    WAL日志解析阶段处理速率,单位:byte/s。

    decoder_rate

    解码阶段处理速率,单位:byte/s。

    sender_rate

    发送阶段处理速率,单位:byte/s。

    net_send_rate

    网络发送速率,单位:byte/s。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • 返回值类型:setof record

    示例:

    gaussdb=# SELECT * FROM gs_logical_decode_observe('replication_slot');
        slot_name     |          sample_time          | logical_decode_rate | wal_read_rate | parser_rate  |  decoder_rate  |  sender_rate  | net_send_rate 
    ------------------+-------------------------------+---------------------+---------------+--------------+----------------+---------------+---------------
     replication_slot | 2023-01-12 20:16:50.42448+08  | 0.000               | 0.000         | 0.000        | 0.000          | 0.000         | 0.000
     replication_slot | 2023-01-12 20:16:55.424537+08 | 0.000               | 0.000         | 0.000        | 0.000          | 0.000         | 0.000
     replication_slot | 2023-01-12 20:17:00.424641+08 | 0.000               | 0.000         | 0.000        | 0.000          | 0.000         | 0.000
     replication_slot | 2023-01-12 20:17:05.424645+08 | 0.000               | 0.000         | 0.000        | 0.000          | 0.000         | 0.000
     replication_slot | 2023-01-12 20:17:10.424795+08 | 0.000               | 0.000         | 0.000        | 0.000          | 0.000         | 0.000
     replication_slot | 2023-01-12 20:17:15.424848+08 | 0.000               | 0.000         | 0.000        | 0.000          | 0.000         | 0.000
     replication_slot | 2023-01-12 20:17:20.424849+08 | 57.600              | 699029.126    | 96000000.000 | 1152000000.000 | 144000000.000 | 0.000
     replication_slot | 2023-01-12 20:17:25.424959+08 | 0.000               | 699029.126    | 96000000.000 | 1152000000.000 | 144000000.000 | 0.000
     replication_slot | 2023-01-12 20:17:30.42496+08  | 0.000               | 699029.126    | 96000000.000 | 1152000000.000 | 144000000.000 | 0.000
     replication_slot | 2023-01-12 20:17:35.425059+08 | 0.000               | 699029.126    | 96000000.000 | 1152000000.000 | 144000000.000 | 0.000
    

    备注:传入不存在的slot_name时,函数不报错,返回值为空记录。若分母为0,则返回最近一次有效数据。若分母不为0,分子为0,则返回0。

    指标计算公式:
    • logical_decode_rate = (reader_lsn1 - reader_lsn2) / (sample_time1 - sample_time2)
    • wal_read_rate = (reader_lsn1 - reader_lsn2) / (wal_read_total_time1 - wal_read_total_time2) - (wal_wait_total_time1 - wal_wait_total_time2)
    • parser_rate = (reader_lsn1 - reader_lsn2) / (parser_total_time1 - parser_total_time2)
    • decoder_rate = (reader_lsn1 - reader_lsn2) / avg(decoder_total_time1[i]- decoder_total_time2[i])
    • sender_rate = (reader_lsn1 - reader_lsn2) / (sender_total_time1 - sender_total_time2) - (net_send_total_time1 - net_send_total_time2)
    • net_send_rate = (net_sent_bytes1 - net_sent_bytes2) / (net_send_total_time1 - net_send_total_time2) - (net_wait_total_time1 - net_wait_total_time2)
  • gs_logical_decode_observe_status('slot_name')

    描述:查询指定逻辑解码任务的监控状态。分布式需要在DN上执行。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • 返回值类型:text

    示例:

    gaussdb=# SELECT * FROM gs_logical_decode_observe_status('replication_slot');
     gs_logical_decode_observe_status 
    ----------------------------------
     START
    (1 row)
    
    gaussdb=# SELECT * FROM gs_logical_decode_observe_status('replication_slot');
     gs_logical_decode_observe_status 
    ----------------------------------
     invalid slot name
    (1 row)
    
    gaussdb=# SELECT * FROM gs_logical_decode_stop_observe('replication_slot');
     gs_logical_decode_stop_observe 
    --------------------------------
     OK
    (1 row)
    
    gaussdb=# SELECT * FROM gs_logical_decode_observe_status('replication_slot');
     gs_logical_decode_observe_status 
    ----------------------------------
     STOP
    (1 row)

    备注:返回值为逻辑解码任务的监控状态,传入不存在的slot_name时,函数不报错,返回值为invalid slot name。

  • gs_get_parallel_decode_thread_info()

    描述:在并行解码所在的DN执行,返回当前DN上并行解码的线程信息。

    返回值类型:int64、text、text、int

    示例:

    gaussdb=# SELECT * FROM gs_get_parallel_decode_thread_info();
        thread_id    | slot_name | thread_type | seq_number
    -----------------+-----------+-------------+------------
     140335364699904 | slot1     | sender      |          1
     140335214098176 | slot1     | reader      |          1
     140335325312768 | slot1     | decoder     |          1
     140335291750144 | slot1     | decoder     |          2
     140335274968832 | slot1     | decoder     |          3
     140335258187520 | slot1     | decoder     |          4
     140335165404928 | slot2     | sender      |          1
     140335022864128 | slot2     | reader      |          1
     140335129818880 | slot2     | decoder     |          1
     140335113037568 | slot2     | decoder     |          2
    (10 rows)

    备注:返回值thread_id代表线程id,slot_name代表复制槽名,thread_type表示线程种类(共三种,sender代表发送线程、reader代表读取线程、decoder代表解码线程),seq_number代表每个线程在当前复制槽中同种线程的序号。其中sender和reader在每个并行解码连接中均只有一个,因此序号均为1,decoder的序号从1排列到当前复制槽解码并行度。

  • gs_get_logical_decode_parameter()

    描述:查询活跃的并行逻辑解码任务参数选项。

    表5 参数含义

    字段名称

    返回值类型

    说明

    slot_name

    text

    复制槽名。

    include_xids

    bool

    解码信息是否包含xid。

    include_timestamp

    bool

    解码信息是否包含时间戳。

    skip_empty_xacts

    bool

    解码结果是否忽略空事务。

    only_local

    bool

    是否只解码当前数据库产生的数据。

    include_username

    bool

    事务的BEGIN日志是否包含用户名。

    enable_ddl_decoding

    bool

    是否开启DDL语句的解码。

    enable_ddl_json_format

    bool

    是否开启DDL的反解析json输出形式。

    max_txn_in_memory

    int64

    事务占用内存最大值(该参数已废弃,不生效)。

    max_reorderbuffer_in_memory

    int64

    当前解码任务最大内存值。

    decode_style

    char

    解码格式。

    parallel_decode_num

    int64

    并行解码的decoder线程数量。

    sending_batch

    int64

    是否批量发送。

    parallel_queue_size

    int64

    并行逻辑解码线程间进行交互的队列长度。

    enable_heartbeat

    bool

    是否输出心跳日志。

    slice_id

    int64

    复制表分片id。

    output_start_csn

    int64

    开始输出的CSN位置。

    output_start_lsn

    int64

    开始输出的LSN位置。

    logical_reader_bind_cpu

    int64

    reader线程绑定CPU的编号。

    logical_decoder_bind_cpu_index

    int64

    decoder线程绑定CPU的索引。

    auto_advance

    bool

    是否自动推进。

    skip_generated_columns

    bool

    是否跳过生成列的结果输出。

    big_transaction_limit

    int64

    判断是否为大事务的内存使用限额(单位字节)。

    exclUser

    text

    黑名单用户的名称列表。

    table_white_list

    text

    白名单表参数。

    desc_memory_limit

    int64

    逻辑解码任务维护的表元信息总内存(单位MB)。

    max_logical_decode_memory

    int64

    并行解码任务的总内存(单位GB)。

    max_control_memory_size

    int64

    参数max-logical-decode-memory的上限值(单位GB)。

    max_queue_cache_num

    int64

    参数max-decode-to-sender-cache-num的上限值。

    max_toast_memory_size

    int64

    读取Xlog中toast字段的内存使用上限值(单位MB)。

    restart_lsn

    int64

    逻辑解码控制参数,用于指定解码开始点。

    timezone_is_utc

    bool

    逻辑解码控制参数,用于控制携带时区的时间类型数据的输出。

    enable_decode_position

    bool

    逻辑解码控制参数,该参数主要控制逻辑解码读取到解码位置日志时,是否发送该位置日志信息。

    standby_connection

    bool

    仅流式解码设置,是否仅限制备机解码。

    sender_timeout

    int64

    仅流式解码设置,GaussDB与客户端的心跳超时阈值(单位毫秒)。

    change_log_max_len

    int64

    逻辑日志缓存长度上限参数,单位为字节。

    max_decode_to_sender_cache_num

    int64

    并行解码日志的缓存条数阈值。

    output_order

    bool

    仅流式解码设置有效,代表是否使用CSN顺序输出解码结果。

    示例:

    gaussdb=# SELECT * FROM gs_get_logical_decode_parameter();
     slot_name |configs                                                                                                                                                              -----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------
     slot_1    | include_xids: 1, include_timestamp: 0, skip_empty_xacts: 0, only_local: 1, include_username: 0, enable_ddl_decoding: 1, enable_ddl_json_format: 0, max_txn_in_memory: 3072, max_reorderbuffer_in_memory: 1, decode_style: b, parallel_decode_num: 2, 
    sending_batch: 0, parallel_queue_size: 128, enable_heartbeat: 0, slice_id: -1, output_start_csn: 0, output_start_lsn: 0, logical_reader_bind_cpu: -1, logical_decoder_bind_cpu_index: -1, auto_advance: 0, skip_generated_columns: 0, big_transaction_limit: 10, desc_memory_limit: 200, max_logical_decode_memory: 6, max_control_memory_size: 10, max_queue_cache_num: 16384, max_toast_memory_size: 100,  restart_lsn: 274660168, timezone_is_utc: 1, enable_decode_position: 1, standby_connection: 0, sender_timeout: 10, change_log_max_len: 8192, max_decode_to_sender_cache_num: 10000, output_order: 0, exclUser: , table_white_list: 
    (1 row)
  • gs_logical_get_transaction_table_info('start_lsn', 'upto_lsn', 'xid', 'options_name', 'options_value')

    描述:指定LSN区间和xid,解析Xlog获取表相关信息。打开三权分立时,仅数据库初始用户可以调用;关闭三权分立时,具备系统管理员权限的用户可以调用。

    约束条件如下:
    • 当前网络和硬件环境正常。
    • 调用函数时,要求日志级别wal_level=logical,且只有在wal_level=logical期间产生的日志文件才能被解析,如果使用的Xlog文件为非logical级别,则解析内容没有对应的值和类型,无其他影响。如果wal_level未被设置成logical级别,则报错不解析。
    • 此解析方式为根据Xlog文本记录数据进行解析,因此不在此Xlog里的数据无法解析。若相关Xlog日志缺失,缺失日志也无法解析。
    • enable_decode_parent_xid不打开时,从start_lsn点开始,只解析该事务相关的Xlog,其父事务、子事务等都不解析。
    • enable_decode_parent_xid打开时,从start_lsn点开始解析,解析输出仅包含该子事务及后续产生的事务信息。因需解析至子事务方可确立父子关系,该子事务之前的父事务及同层级其他子事务信息不予输出。如果需要完整顶层事务信息,请将事务ID指定为顶层事务ID,并合理设置start_lsn。
    • 不支持获取relfilenode已变化场景的表名称,例如表被TRUNCATE/DROP等。
    • 不支持获取Schema、表名已经变化的历史版本名称。
    • 执行函数时,输出文件大小超过100MB将被截断并报错。
    • xid小于Xlog中事务最小值时不报错,返回文件内容为空。
    • 当start_lsn检索范围过大,或设置为NULL(即从头遍历)时,Xlog解析期间可能因底层Xlog日志已被回收而中断,建议调整start_lsn范围后重新执行。
    参数说明:
    • start_lsn

      指定开始解析的LSN。

      取值范围:字符串(LSN,格式为xlogid/xrecoff),如'1/2AAFC60'。为NULL时表示不对解析起始的日志位置做限制。

    • upto_lsn

      指定解析结束的LSN。

      取值范围:字符串(LSN,格式为xlogid/xrecoff),如'1/2AAFC60'。为NULL时表示不对解析截止的日志位置做限制。

    • xid

      事务ID。

      取值范围:3~18446744073709551615(即uint64最大值)。

      如果用户设置的xid超过当前数据系统使用的xid的最大值,则会提示输入事务ID非法。

    • options:可选参数,由一系列options_name和options_value一一对应组成,可以缺省。
      • enable_decode_parent_xid

        是否解析出的指定xid的父事务以及子事务信息。

        取值类型:布尔型。

        取值范围:
        • false:设为false时,解析出的指定事务的表信息。
        • true:设为true时,解析出指定事务的父事务以及相关子事务信息。

        默认值:false。

        仅505.2.0以后的版本产生的Xlog日志支持构建父子事务关系。

    返回值类型:text

    示例:

    gaussdb=# SELECT * FROM gs_logical_get_transaction_table_info('0/202FC320', '0/20306EE8', '221557', 'enable_decode_parent_xid', '1');
                                        output_filepath                                     
    ----------------------------------------------------------------------------------------
     /home/omm/install/clusters/clusters_cent/cxz/cxz_datanode/221557_202fc320_20306ee8.log
    (1 row)
    解析结果如下:
    === DETAIL RECORDS ===
    XID|TOP_XID|PARENT_XID|RELFILE_OID|START_LSN|END_LSN|CSN|TABLE_OID|SCHEMA_NAME|TABLE_NAME|OPERATION|ADDITIONAL_INFO
    9982031|9982031|0|324521|9/297251C8|9/29725260|9417216|324521|public|t_tran|INSERT|
    9982032|9982031|9982031|324521|9/297254E8|9/29725578|9417216|324521|public|t_tran|INSERT|
    9982034|9982031|9982032|324521|9/29725B80|9/29725C18|9417217|324521|public|t_tran|INSERT|
    9982041|9982031|9982031|324521|9/29727940|9/297279D0|9417221|324521|public|t_tran|INSERT|
    9982045|9982031|9982041|324521|9/2974C458|9/2974C4F0|9417224|324521|public|t_tran|INSERT|
    9982047|9982031|9982041|324521|9/2974CC00|9/2974CC98|9417225|324521|public|t_tran|INSERT|
    === SUMMARY RECORDS ===
    XID|TABLE_OID|SCHEMA_NAME|TABLE_NAME|IS_COMMITTED|INSERT_COUNT|UPDATE_COUNT|DELETE_COUNT|DDL_COUNT
    9982031|324521|public|t_tran|true|6|0|0|0
    表6 指标含义

    指标名称

    说明

    XID

    事务号。

    TOP_XID

    顶层事务号。

    PARENT_XID

    父事务号。

    RELFILE_NODE

    表文件对象标识符。

    START_LSN

    该事务起始LSN。

    END_LSN

    该事务结束LSN。

    CSN

    提交序列号。

    TABLE_OID

    表的对象标识符。

    SCHEMA_NAME

    表所属Schema。

    TABLE_NAME

    表名。

    OPERATION

    操作类型。

    ADDITIONAL_INFO

    DDL信息。

    IS_COMMITTED

    事务是否提交。

    INSERT_COUNT

    插入记录数。

    UPDATE_COUNT

    更新记录数。

    DELETE_COUNT

    删除记录数。

    DDL_COUNT

    DDL语句数。

  • gs_get_distribute_decode_status()

    描述:获取当前节点上分布式解码状态细节(以复制槽为粒度),需在CN上执行,DN上执行仅返回空。

    返回值类型:text、int、int、int64、xid、xid、text、text、text

    gaussdb=# SELECT * FROM gs_get_distribute_decode_status();
     slot_name | logical_receiver_num | slice_num | walsender_thread_id | last_sent_csn | last_confirmed_csn |      receiver_queue_length      |          connect_times          |                 csn_receive_array
    -----------+----------------------+-----------+---------------------+---------------+--------------------+---------------------------------+---------------------------------+---------------------------------------------------
     slot1     |                    1 |         3 |     139958481843968 |       2012169 |            2010107 | queue0: 1, queue1: 1, queue2: 0 | slice0: 2, slice1: 2, slice2: 2 | slice0: 2012244, slice1: 2012244, slice2: 2012244
    (1 row)
    表7 指标含义

    指标名称

    类型

    说明

    slot_name

    text

    复制槽名。

    logical_receiver_num

    int

    分布式解码启动的receiver线程数量。

    slice_num

    int

    集群分片数。

    walsender_thread_id

    int64

    walsender线程id。

    last_sent_csn

    xid

    最近发送的CSN。

    last_confirmed_csn

    xid

    最后从客户端返回的已确认接收的CSN。

    receiver_queue_length

    text

    各DN接收日志队列长度(拼接后以字符串格式显示)。

    connect_times

    text

    各DN连接次数(拼接后以字符串格式显示)。

    csn_receive_array

    text

    各DN获取到的最新CSN(拼接后以字符串格式显示)。

  • gs_logical_decode_meta_cache_summary('slot_name')

    描述:获取并行逻辑解码中活跃复制槽的解码元信息缓存的统计信息,包括缓存对象数、版本数、总内存占用、缓存命中率、扫描系统表命中率等全局指标。

    参数说明:
    • slot_name

      流复制槽名称。

      取值类型:字符串。

      取值范围:仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    表8 指标含义

    指标名称

    说明

    type

    逻辑解码元信息的类型(支持table、partition、type、enum、auth、database)。

    entry_num

    元信息实体个数。

    version_num

    元信息实体版本总数(每个实体可能有多个版本)。

    total_mem_size

    元信息缓存总内存,单位:字节。

    hit_count

    缓存命中次数。

    miss_count

    缓存未命中次数。

    hit_ratio

    缓存命中率。

    scan_count

    扫描系统表次数。

    scan_hit_count

    扫描系统表命中次数。

    scan_hit_ratio

    扫描系统表命中率。

    extra_info

    其它信息。

    示例:

    gaussdb=# SELECT * FROM gs_logical_decode_meta_cache_summary('slot1');
       type    | entry_num | version_num | total_mem_size | hit_count | miss_count | hit_ratio | scan_count | scan_hit_count | scan_hit_ratio | extra_info 
    -----------+-----------+-------------+----------------+-----------+------------+-----------+------------+----------------+----------------+------------
     table     |        53 |          53 |         173056 |         0 |          0 |         0 |          0 |              0 |              0 | 
     partition |         0 |           0 |              0 |         0 |          0 |         0 |          0 |              0 |              0 | 
     type      |        14 |          14 |           1791 |         0 |          0 |         0 |          0 |              0 |              0 | 
     enum      |         0 |           0 |              0 |         0 |          0 |         0 |          0 |              0 |              0 | 
     auth      |         1 |           1 |            136 |         0 |          0 |         0 |          0 |              0 |              0 | 
     database  |         0 |           0 |              0 |         0 |          0 |         0 |          0 |              0 |              0 | 
    (6 rows)
  • gs_logical_decode_meta_cache_stats('slot_name', 'type', 'mode', 'limit_num')

    描述:获取并行逻辑解码中活跃复制槽的解码元信息缓存指定维度的TopN对象统计信息,支持按内存占用(memory)、版本链长度(version_cnt)、未命中次数(miss_count)、命中率(hit_ratio)维度查询。

    参数说明:
    • slot_name

      流复制槽名称。

      取值类型:字符串。

      取值范围:仅支持小写字母、数字以及“_”、“?”、“-”、“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • type

      元信息类型名称。

      取值范围:支持table_oid、table_rfn、partition、type、enum、auth、database。

    • mode

      查询维度信息。

      取值范围:支持memory、version_cnt、miss_count、hit_ratio。

    • limit_num

      输出行数限制大小。

      取值类型:整型。

      取值范围:1 ~ 1000。

    表9 指标含义

    指标名称

    说明

    oid

    元信息实体的oid。

    name

    元信息实体的名称。

    relfilenode

    元信息实体的relfilenode。

    version_cnt

    元信息实体的版本个数。

    invalid_version_cnt

    元信息实体的失效版本个数。

    total_mem_size

    元信息实体的占用内存的总大小,单位:字节。

    avg_version_size

    元信息实体各版本占用内存的平均大小,单位:字节。

    hit_count

    元信息实体的命中次数。

    miss_count

    元信息实体的未命中次数。

    hit_ratio

    元信息实体的命中率。

    create_time

    元信息实体加载到内存中的时间。

    evict_fail_count

    元信息实体的淘汰失败次数。

    evict_count

    元信息实体的淘汰次数。

    latest_evict_time

    元信息实体的最近一次淘汰的时间。

    warning_flags

    元信息实体异常标记信息。

    extra_info

    其他信息。

    示例:

    gaussdb=# SELECT * FROM gs_logical_decode_meta_cache_stats('slot1', 'table_oid', 'memory', 20);
      oid  |                 name                  | relfilenode | version_cnt | invalid_version_cnt | total_mem_size | avg_version_size | hit_count | miss_count | hit_ratio |          create_time          | evict_fail_count | evict_count | latest_evict_time | warning_flags | extra_info 
    -------+---------------------------------------+-------------+-------------+---------------------+----------------+------------------+-----------+------------+-----------+-------------------------------+------------------+-------------+-------------------+---------------+------------
     16609 | snap_summary_statement                |       16609 |           1 |                   0 |           6544 |             6544 |         3 |          0 |         1 | 2026-07-01 10:55:57.313943+08 |                0 |           0 |                   |             0 | 
     16616 | snap_global_statement_count           |       16616 |           1 |                   0 |           3424 |             3424 |         3 |          0 |         1 | 2026-07-01 10:55:57.31703+08  |                0 |           0 |                   |             0 | 
     16622 | snap_summary_statement_count          |       16622 |           1 |                   0 |           3424 |             3424 |         3 |          0 |         1 | 2026-07-01 10:55:57.319207+08 |                0 |           0 |                   |             0 | 
     16758 | snap_global_stat_all_tables           |       16758 |           1 |                   0 |           2904 |             2904 |         3 |          0 |         1 | 2026-07-01 10:55:54.406154+08 |                0 |           0 |                   |             0 | 
     16664 | snap_global_redo_status               |       16664 |           1 |                   0 |           2800 |             2800 |         0 |          0 |         0 | 2026-07-01 10:55:54.385334+08 |                0 |           0 |                   |             0 | 
     16764 | snap_summary_stat_all_tables          |       16764 |           1 |                   0 |           2800 |             2800 |         3 |          0 |         1 | 2026-07-01 10:55:54.408911+08 |                0 |           0 |                   |             0 | 
    (6 rows)

    函数执行过程中需要访问解码元信息缓存的Hash表并获取锁,以保证统计数据一致性。执行过程中可能与逻辑解码线程存在锁竞争,对解码性能造成影响。建议避免频繁调用该函数,推荐在问题定位、性能分析等场景下使用。

  • gs_logical_decode_meta_cache_obj_detail('slot_name', 'type', oid, 'mode', 'limit_num')

    描述:获取并行逻辑解码中活跃复制槽的解码元信息缓存指定对象的详细统计信息和版本链详情,包括版本数、有效区间(csnmin/csnmax)、内存占用、命中情况等。

    参数说明:
    • slot_name

      流复制槽名称。

      取值类型:字符串。

      取值范围:仅支持小写字母、数字以及“_”、“?”、“-”、“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • type

      元信息类型名称。

      取值范围:支持table、partition、type、enum、auth、database。

    • oid

      查询元信息的oid。

    • mode

      查询结果输出模式。

      取值范围:支持memory、file。

    • limit_num

      输出行数限制大小。

      取值类型:整型。

      取值范围:当mode为memory时取值1 ~ 1000;当mode为file时取值1 ~ 2147483647。

    表10 指标含义

    指标名称

    说明

    oid

    元信息版本的oid。

    relfilenode

    元信息版本的relfilenode。

    name

    元信息版本的名称。

    csnmin

    元信息版本的csnmin信息。

    csnmax

    元信息版本的csnmax信息。

    is_invalid

    元信息版本是否有效。

    mem_size

    元信息版本的内存占用大小,单位:字节。

    hit_count

    元信息版本的命中次数。

    refcnt

    元信息版本的引用计数。

    createtime

    元信息版本加载到内存中的时间。

    extra_info

    其他信息,当mode=file时,表示输出文件路径。

    示例:

    gaussdb=# SELECT * FROM gs_logical_decode_meta_cache_obj_detail('slot1', 'table', 54921, 'memory', 100);
      oid  | relfilenode | name | csnmin | csnmax | is_invalid | mem_size | hit_count | refcnt |          createtime          | extra_info 
    -------+-------------+------+--------+--------+------------+----------+-----------+--------+------------------------------+------------
     54921 |       54921 | t1   | 409737 |      0 | f          |      408 |         0 |      0 | 2026-07-01 10:55:52.27585+08 | 
    (1 row)
    gaussdb=# SELECT * FROM gs_logical_decode_meta_cache_obj_detail('slot1', 'table', 54921, 'file', 100);
     oid | relfilenode | name | csnmin | csnmax | is_invalid | mem_size | hit_count | refcnt | createtime |                                         extra_info                                          
    -----+-------------+------+--------+--------+------------+----------+-----------+--------+------------+---------------------------------------------------------------------------------------------
       0 |           0 |      |      0 |      0 | f          |        0 |         0 |      0 |            | <DataDir>/meta_cache_slot1_1782874593.out
    (1 row)

    函数执行过程中需要访问解码元信息缓存的Hash表并获取锁,以保证统计数据一致性。执行过程中可能与逻辑解码线程存在锁竞争,对解码性能造成影响。建议避免频繁调用该函数,推荐在问题定位、性能分析等场景下使用。

  • gs_get_distribute_decode_status_detail()

    描述:获取当前节点上分布式解码状态细节(以DN为粒度),需在CN上执行,DN上执行仅返回空。

    返回值类型:text、int、int64、int、int、xid

    gaussdb=# SELECT * FROM gs_get_distribute_decode_status_detail();
     slot_name | slice_id |    thread_id    | queue_len | connect_times | received_csn
    -----------+----------+-----------------+-----------+---------------+--------------
     slot1     |        0 | 139959895848704 |         1 |             2 |      2012244
     slot1     |        1 | 139959895848704 |         1 |             2 |      2012244
     slot1     |        2 | 139959895848704 |         0 |             2 |      2012244
    (3 rows)
    表11 指标含义

    指标名称

    类型

    说明

    slot_name

    text

    复制槽名。

    slice_id

    int

    分片号(从0开始)。

    thread_id

    int64

    分布式解码启动的receiver线程号。

    queue_len

    int

    当前DN接收日志队列长度。

    connect_times

    int

    各DN连接次数。

    received_csn

    xid

    从当前DN获取的最新CSN。

  • gs_logical_dictionary_baseline()

    描述:执行逻辑解码数据字典的存量数据基线化,执行成功返回耗时,执行失败返回失败原因。

    返回值类型:text

  • gs_logical_dictionary_disabled()

    描述:关闭逻辑解码数据字典功能,停止增量DDL,执行成功返回OK,执行失败返回失败原因。

    返回值类型:text

    关闭数据字典功能之后,无法使用已有的数据字典模式复制槽继续解码,如需使用数据字典功能,须执行gs_logical_dictionary_baseline()函数,对逻辑数据字典重新进行基线化,然后重建逻辑复制槽。

  • gs_logical_decode_lock()

    描述:逻辑解码组件升级管理加锁接口,加锁成功返回t,失败返回f。内部使用功能,不建议用户使用。

    参数说明:wait_time:加锁等待时间。取值范围:非负数,单位:秒;支持不传入参,不传入参,加锁等待时间为0秒,即不等待。

    返回值类型:boolean

  • gs_logical_decode_unlock()

    描述:逻辑解码组件升级管理放锁接口,无入参,放锁成功返回t,失败返回f。内部使用功能,不建议用户使用。

    返回值类型:boolean

  • gs_add_logical_decoding_position_xlog()

    描述:执行该函数后会生成XLOG_STANDBY_DECODE_POSITION类型的Xlog日志。该日志会被当前数据库上的解码任务读取,用于反馈解码位置。具有sysadmin、replication或opradmin权限的用户才能调用该函数,否则调用失败。该函数执行频率依据数据库统计,按节点控制每个数据库调用该系统函数的频率,调用最小间隔为1秒。分布式场景也遵循此原则,每个CN单独控制调用频率。

    返回值类型:text

  • gs_change_replication_slot_plugin('slot_name', 'plugin_name')

    描述:修改逻辑复制槽插件类型。

    参数说明:

    • slot_name

      流复制槽名称。

      取值范围:字符串,仅支持小写字母、数字以及“_”,“?”,“-”,“.”字符,且不支持“.”或“..”单独作为复制槽名称。

    • plugin_name

      插件名称。

      取值范围:字符串,当前支持mppdb_decoding、sql_decoding、parallel_binary_decoding、parallel_json_decoding、parallel_text_decoding。

      返回值类型:boolean,默认值为true。

    示例:

    查询当前复制槽信息:

    gaussdb=# SELECT * FROM pg_get_replication_slots();
     slot_name |          plugin          | slot_type | datoid | active | xmin | catalog_xmin | restart_lsn | dummy_standby | confirmed_flush | confirmed_csn | dictionary_csn_min | slot_dictionary_type 
    -----------+--------------------------+-----------+--------+--------+------+--------------+-------------+---------------+-----------------+---------------+--------------------+----------------------
     slot1     | parallel_json_decoding   | logical   |  12834 | f      |      |              | 0/125A15E0  | f             | 0/125E84D0      |               |               7787 | dictionary table
     slot2     | parallel_binary_decoding | logical   |  12834 | f      |      |              | 0/E9C71B0   | f             | 0/E9CA638       |               |               3860 | dictionary table
     slot3     | parallel_text_decoding   | logical   |  12834 | f      |      |              | 0/E9D96D0   | f             | 0/EEE6508       |               |               3867 | dictionary table
     slot4     | mppdb_decoding           | logical   |  12834 | f      |      |              | 0/E9AFC38   | f             | 0/EEE6508       |               |               3853 | dictionary table
    (4 rows)

    修改复制槽类型:

    gaussdb=# SELECT * FROM gs_change_replication_slot_plugin('slot1', 'mppdb_decoding');
     gs_change_replication_slot_plugin 
    -----------------------------------
     t
    (1 row)

    再次查询复制槽信息:

    gaussdb=# SELECT * FROM pg_get_replication_slots();
     slot_name |          plugin          | slot_type | datoid | active | xmin | catalog_xmin | restart_lsn | dummy_standby | confirmed_flush | confirmed_csn | dictionary_csn_min | slot_dictionary_type 
    -----------+--------------------------+-----------+--------+--------+------+--------------+-------------+---------------+-----------------+---------------+--------------------+----------------------
     slot1     | mppdb_decoding           | logical   |  12834 | f      |      |              | 0/125A15E0  | f             | 0/125E84D0      |               |               7787 | dictionary table
     slot2     | parallel_binary_decoding | logical   |  12834 | f      |      |              | 0/E9C71B0   | f             | 0/E9CA638       |               |               3860 | dictionary table
     slot3     | parallel_text_decoding   | logical   |  12834 | f      |      |              | 0/E9D96D0   | f             | 0/EEE6508       |               |               3867 | dictionary table
     slot4     | mppdb_decoding           | logical   |  12834 | f      |      |              | 0/E9AFC38   | f             | 0/EEE6508       |               |               3853 | dictionary table
    (4 rows)
  • gs_get_inter_cluster_version_info()

    描述:查询主备数据库的版本号、逻辑解码组件的版本以及复制类型(逻辑复制或者物理复制)。当前版本暂不支持。

    返回值类型:int、text、int、text、text

相关文档