更新时间:2024-05-07 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。

    • 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值无意义。

    返回值类型: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序逻辑复制槽,同时报错复制槽已存在。因此需删除DN上已有的同名复制槽(如为LSN序复制槽则需在对应节点手动删除)再在CN上重新创建。如果在CN上创建复制槽时指定output_order为0,则不会在DN上创建复制槽。CN上创建的复制槽仅用于标识DN上存在相关复制槽。

  • pg_create_physical_replication_slot('slot_name', 'isDummyStandby')

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

    参数说明:

    • slot_name

      流复制槽名称。

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

    • isDummyStandby

      预留参数。

      类型:Boolean

    返回值类型:name,text

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

  • pg_drop_replication_slot('slot_name')

    描述:删除流复制槽。

    参数说明:

    • slot_name

      流复制槽名称。

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

    返回值类型:void

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

    • 在CN上删除逻辑复制槽时,若为LSN序逻辑复制槽,则仅删除当前节点复制槽,其他节点同名复制槽不受影响;否则只要其他节点有残留同名CSN序逻辑复制槽,执行删除时不会因为某些节点不存在复制槽而报错,同时所有节点的同名复制槽会被成功删除;如果任何节点均不存在该复制槽,则报错。
    • 如果当前CN节点残留LSN序逻辑复制槽,同时其他某些节点上残留同名CSN序逻辑复制槽,则在当前CN节点上执行删除复制槽操作仅会删除本地LSN序逻辑复制槽,待删除完成再次执行删除操作方可删除其他节点的同名CSN序逻辑复制槽。
  • pg_logical_slot_peek_changes('slot_name', 'upto_lsn', upto_nchanges, 'options_name', 'options_value')

    描述:在解码DN上执行, 解码并不推进流复制槽(下次解码可以再次获取本次解出的数据)。

    参数说明:

    • 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信息。

        取值范围: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时,仅解码本地日志。
      • force-binary

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

        取值范围:0,默认值为0。

        • 0:设为0时,以文本格式输出解码结果。
      • white-table-list

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

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

        SELECT * FROM pg_logical_slot_peek_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2');
      • 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设置是否动态解析识别用户名字。若解码报错用户不存在而中断,在确定日志产生时刻不存在对应的黑名单用户,可以通过配置dynamic-resolution成true或者从用户黑名单中删除报错用户名字来启动解码继续获取逻辑日志。

      • dynamic-resolution

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

        取值范围:0或1,默认值为1。

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

    其他配置选项可参考《特性指南》中“逻辑复制 > 逻辑解码 > 逻辑解码选项”章节。

    返回值类型: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)

    备注:函数返回解码结果,每一条解码结果包含三列,对应上述返回值类型,分别表示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')

    描述:在解码DN上执行, 解码并推进流复制槽。

    参数说明:与pg_logical_slot_peek_changes一致,详细内容请参见•pg_logical_slot_peek_ch...

    备注:调用该函数的用户需要具有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')

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

    参数说明:

    • 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信息。

        取值范围: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时,仅解码本地日志。
      • force-binary

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

        取值范围:0或1,默认值为0,均以二进制格式输出结果。

      • white-table-list

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

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

      • 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设置是否动态解析识别用户名字。若解码报错用户不存在而中断,在确定日志产生时刻不存在对应的黑名单用户,可以通过配置dynamic-resolution成true或者从用户黑名单中删除报错用户名字来启动解码继续获取逻辑日志。

      • dynamic-resolution

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

        取值范围:0或1,默认值为1。

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

    某些配置选项在函数中仅能配置而不实际生效,可参考《特性指南》中“逻辑复制 > 逻辑解码 > 逻辑解码选项”章节。

    返回值类型: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')

    描述:在解码DN上执行, 以二进制格式解码并推进流复制槽。

    参数说明:与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')

    描述:在解码DN执行, 直接推进流复制槽到指定LSN,不输出解码结果。

    参数说明:

    • slot_name

      流复制槽名称。

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

    • upto_lsn

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

      在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的一个walsender。由于逻辑解码功能会为每个逻辑复制槽预留walsender,因此正常场景执行该函数会正常推进主DN的逻辑复制槽,如果短时间连续执行该函数会导致通知主DN推进失败,且没有报错。
  • pg_get_replication_slots()

    描述:获取复制槽列表。

    示例:
    在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
    -----------+----------------+-----------+--------+--------+------+--------------+-------------+---------------+-----------------+---------------
     dn_6002   |                | physical  |      0 | t      |      |              | 0/3622B528  | f             |                 |
     dn_6003   |                | physical  |      0 | t      |      |              | 0/3622B528  | f             |                 |
     slot_lsn  | mppdb_decoding | logical   | 131072 | f      |      |        66658 | 0/36252350  | f             | 0/362523D0      |
     slot_test | mppdb_decoding | logical   | 131072 | f      |      |        66658 | 0/36251718  | f             |                 |      10025527
    (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
    -----------+----------------+-----------+--------+--------+------+--------------+-------------+---------------+-----------------+---------------
     slot_test | mppdb_decoding | logical   | 139264 | f      |      |              |             | f             |                 |
    (1 row)

    返回值类型: text, text, text, oid, boolean, xid, xid, text, boolean, text, xid

    备注:返回值的slot_name代表复制槽名,plugin代表逻辑复制槽对应的输出插件名称,slot_type代表复制槽的类型(physical代表物理复制槽,logical代表逻辑复制槽),datoid代表复制槽所在的数据库OID,active代表复制槽是否为激活状态(f代表未激活,t代表已激活),xmin代表数据库须为复制槽保留的最早事务的事务号,catalog_xmin代表数据库须为逻辑复制槽保留的最早的涉及系统表的事务的事务号,restart_lsn表示复制槽需要的最早xlog的物理位置,dummy_standby为预留参数,confirmed_flush代表客户端确认接收到的日志位置(逻辑复制槽专用),confirmed_csn代表客户端确认接收到的日志中最后一个事务对应的CSN(逻辑复制槽专用)。

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

  • pg_logical_get_area_changes('LSN_start', 'LSN_end', upto_nchanges, 'decoding_plugin', 'xlog_path', 'options_name', 'options_value')

    描述:在解码DN执行, 没有ddl的前提下,指定lsn区间进行解码,或者指定xlog文件进行解码。

    约束条件如下:

    • 当前网络和硬件环境正常。
    • 单条元组大小建议不超过500MB,500MB~1GB之间会报错。
    • 不支持数据页复制这种不落xlog的数据找回。
    • 调用接口时,要求日志级别wal_level=logical,且只有在wal_level=logical期间产生的日志文件才能被解析。如果使用的xlog文件为非logical级别,则解码内容没有对应的值和类型,无其他影响。如果wal_level未被设置成logical级别,则报错不解码。
    • xlog文件只能被完全同构的dn的某个副本解析,且数据库发生没有DDL操作和VACUUM FULL,以确保可以找到数据对应的元信息。
    • 需注意一次不要读入过多xlog文件,在指定范围解码不指定文件解码时,推荐指定一次一个xlog文件的大小。一般情况下,一个xlog文件解码过程中占用内存约为该xlog文件大小的2~3倍。
    • 不支持VACUUM FULL之前的数据找回。
    • 不能解码扩容前的xlog文件。
    • 对于update语句解码需要表有主键,否则会导致update语句where里数据为空。
    • 此解码方式为根据xlog文本记录数据进行解码,将可解码内容解码出来,不基于事务进行解码。因此不在此xlog里的数据无法解码。
    • 从解码点开始,如果未指定解码文件,会先检测从解码开始点到最新redo值之间是否发生ddl,如果发生ddl则全部不解码;如果指定解码文件,会同时检测解码文件的开始点到文件最后可读内容之间,以及数据目录下xlog开始点到最新redo值之间是否发生ddl,检测到一条ddl则对所有表都不解码。

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

    参数说明:

    • LSN_start

      指定开始解码的lsn。

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

    • LSN_end

      指定解码结束的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一一对应组成,可以缺省,详见pg_logical_slot_peek_cha...

    示例:

    -在CN上执行DML操作,在DN上可以查询出当前DN上执行的DML:
    gaussdb=# execute direct on (datanode1) '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)
    
  • gs_get_parallel_decode_status()

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

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

    示例:

    gaussdb=# execute direct on (datanode1) '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)

    描述:在并行解码所在的DN执行, 查看某个活跃状态复制槽最新解码的WAL日志时间。

    参数说明:

    • slot_name:

      要查询的复制槽名称。

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

    示例:

    gaussdb=# execute direct on (datanode1) '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')

    描述:在并行解码所在的DN执行, 获取并行逻辑解码某一活跃状态复制槽的解码统计信息,包含26行指标。

    指标定义如下:

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

    指标名称

    说明

    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

    网络发送逻辑日志字节数。

    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

    推进catalog_xmin所需要的日志确认接收点。

    candidate_restart_valid

    推进restart_lsn所需要的日志确认接收点。

    candidate_restart_lsn

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

    参数说明:

    • slot_name

      流复制槽名称。

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

    返回值类型:int、text、text

    示例:

    gaussdb=# execute direct on (datanode1) 'select * from gs_logical_parallel_decode_status(''replication_slot'');';
     stat_id |          stat_name           |      value
    ---------+------------------------------+------------------
           1 | slot_name                    | replication_slot
           2 | reader_lsn                   | 0/357E180
           3 | wal_read_total_time          | 266694599
           4 | wal_wait_total_time          | 266691307
           5 | parser_total_time            | 39971
           6 | decoder_total_time           | 81216
           7 | sender_total_time            | 48193
           8 | net_send_total_time          | 19388
           9 | net_wait_total_time          | 0
          10 | net_send_total_bytes         | 266897
          11 | transaction_count            | 7
          12 | big_transaction_count        | 1
          13 | max_transaction_tuples       | 4096
          14 | sent_transaction_count       | 7
          15 | spill_disk_transaction_count | 1
          16 | spill_disk_bytes             | 244653
          17 | spill_disk_count             | 4096
          18 | input_queue_full_count       | 0
          19 | output_queue_full_count      | 0
          20 | dml_count                    | 4097
          21 | dml_filtered_count           | 0
          22 | toast_count                  | 0
          23 | candidate_catalog_xmin       | 17152
          24 | candidate_xmin_lsn           | 0/420A598
          25 | candidate_restart_valid      | 0/420A598
          26 | candidate_restart_lsn        | 0/420A598
    (26 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')

    描述:在并行解码所在的DN执行, 重置gs_logical_parallel_decode_status('slot_name')中的指标。

    参数说明:

    • slot_name

      流复制槽名称。

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

    返回值类型:text

    示例:

    gaussdb=# execute direct on (datanode1) 'select * from gs_logical_parallel_decode_reset_status(''replication_slot'');';
     gs_logical_parallel_decode_reset_status
    -----------------------------------------
     OK
    (1 row)
    
    gaussdb=# execute direct on (datanode1) 'select * from gs_logical_parallel_decode_status(''replication_slot'');';
     stat_id |          stat_name           |      value
    ---------+------------------------------+------------------
           1 | slot_name                    | replication_slot
           2 | reader_lsn                   | 0/357E420
           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       | 0
          24 | candidate_xmin_lsn           | 0/0
          25 | candidate_restart_valid      | 0/420A598
          26 | candidate_restart_lsn        | 0/420A598
    (26 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_get_parallel_decode_thread_info()

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

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

    示例:

    gaussdb=# execute direct on (decode_datanode1) '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_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)
    表2 指标含义

    指标名称

    类型

    说明

    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_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)
    表3 指标含义

    指标名称

    类型

    说明

    slot_name

    text

    复制槽名。

    slice_id

    int

    分片号(从0开始)。

    thread_id

    int64

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

    queue_len

    int

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

    connect_times

    int

    各DN连接次数。

    received_csn

    xid

    从当前DN获取的最新CSN。