
# 逻辑解码选项
逻辑解码选项可以用来为本次逻辑解码提供限制或额外功能，如"解码结果是否包含事务号"、"解码时是否忽略空事务"等等。对于具体配置方法，SQL函数解码请参考[逻辑复制函数](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/gaussdb_42_0318.html#ZH-CN_TOPIC_0000002221496201)章节中函数pg_logical_slot_peek_changes的可选入参''options_name'和'options_value'，JDBC流式解码请参考[逻辑复制](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/gaussdb_42_0076.html#ZH-CN_TOPIC_0000002221495937)章节中示例代码中函数withSlotOption的使用方法。
#### 通用选项（串行解码和并行解码均可配置，但可能无效，请参考相关选项详细说明）
- include-xids： 解码出的data列是否包含xid信息。
  取值范围：0或1，默认值为1。
  - 0：设为0时，解码出的data列不包含xid信息。
  
  - 1：设为1时，解码出的data列包含xid信息。
   
- skip-empty-xacts： 解码时是否忽略空事务信息。
  取值范围：0或1，默认值为0。
  - 0：设为0时，解码时不忽略空事务信息。
  
  - 1：设为1时，解码时会忽略空事务信息。
   
- include-timestamp： 解码信息是否包含commit时间戳。
  取值范围：0或1，默认值为0。
  - 0：设为0时，解码信息不包含commit时间戳。
  
  - 1：设为1时，解码信息包含commit时间戳。
   
- only-local： 是否仅解码本地日志。
  取值范围：0或1，默认值为1。
  - 0：设为0时，解码非本地日志和本地日志。
  
  - 1：设为1时，仅解码本地日志。
   
- white-table-list： 白名单参数，包含需要进行解码的schema和表名。
  取值范围：包含白名单中表名的字符串，不同的表以','为分隔符进行隔离；使用'\*'来模糊匹配所有情况；schema名和表名间以'.'分隔，不允许存在任意空白符。例如：
  ```
  select * from pg_logical_slot_peek_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2,*.t3,my_schema.*');
  ```
  
- max-txn-in-memory： 内存管控参数，单位为MB，单个事务占用内存大于该值即进行落盘。
  取值范围：0\~100的整型，默认值为0，即不开启此种管控。
  
- max-reorderbuffer-in-memory 内存管控参数，单位为GB，拼接-发送线程中正在拼接的事务总内存（包含缓存）大于该值则对当前解码事务进行落盘。
  取值范围：0\~100的整型，默认值为0，即不开启此种管控。
  
- include-user： 事务的BEGIN逻辑日志是否输出事务的用户名。事务的用户名特指授权用户------执行事务对应会话的登录用户，它在事务的整个执行过程中不会发生变化。
  取值范围：0或1，默认值为0。
  - 0：设为0时，事物的BEGIN逻辑日志不输出事务的用户名。
  
  - 1：设为1时，事物的BEGIN逻辑日志输出事务的用户名。
   
- exclude-userids： 黑名单用户的OID参数。
  取值范围：字符串类型，指定黑名单用户的OID，多个OID通过','分隔，不校验用户OID是否存在。
  
- exclude-users： 黑名单用户的名称列表。
  取值范围：字符串类型，指定黑名单用户名，通过','分隔，不校验用户名是否存在。
  
- dynamic-resolution： 是否动态解析黑名单用户名。
  取值范围：0或1，默认值为1。
  - 0：设为0时，当解码观测到黑名单exclude-users中用户不存在时将会报错并退出逻辑解码。
  
  - 1：设为1时，当解码观测到黑名单exclude-users中用户不存在时继续解码。
   
- standby-connection： 仅流式解码设置，是否仅限制备机解码。
  取值范围：bool型，默认值为false。
  - true：设为true时，仅允许连接备机解码，连接主机解码时会报错退出。
  
  - false：设为false时，不做限制，允许连接主机或备机解码。
   
- sender-timeout： 仅流式解码设置，内核与客户端的心跳超时阈值。当该时间段内没有收到客户端任何消息时，逻辑解码将主动停止，并断开和客户端的连接。单位为毫秒（ms）。
  取值范围：0\~2147483647的int型，默认值取决于GUC参数logical_sender_timeout的配置值。
  
- parallel-decode-num： 仅流式解码设置有效，并行解码的Decoder线程数量；系统函数调用场景下此选项无效，仅校验取值范围。
  取值范围：取1表示按照原有的串行逻辑进行解码，取其余值表示开启并行解码，默认值为1。
  ![](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  当parallel-decode-num不配置（即为默认值1）或显式配置为1时，下述"并行解码"中的选项不可配置。
  
 
#### 串行解码
- force-binary： 是否以二进制格式输出解码结果，针对不同场景呈现不同行为。
  - 针对系统函数pg_logical_slot_get_binary_changes和pg_logical_slot_peek_binary_changes： 取值范围：bool型，默认值为false。此值无实际意义，均以二进制格式输出解码结果。
    
  
  - 针对系统函数pg_logical_slot_get_changes、pg_logical_slot_peek_changes和pg_logical_get_area_changes： 取值范围：仅取false值的bool型。以文本格式输出解码结果。
    
  
  - 针对流式解码： 取值范围：bool型，默认值为false。此值无实际意义，均以文本格式输出解码结果。
    
   
 
#### 并行解码
以下配置选项仅限流式解码设置**。**
- decode-style： 指定解码格式。
  取值范围：char型的字符'j'、't'或'b'，分别代表json格式，text格式及二进制格式。默认值为'b'即二进制格式解码。
  对于json格式和text格式解码，开启批量发送选项时的解码结果中，每条解码语句的前4字节组成的uint32代表该条语句总字节数（不包含该uint32类型占用的4字节，0代表本批次解码结束），8字节uint64代表相应lsn（begin对应first_lsn，commit对应end_lsn，其他场景对应该条语句的lsn）。
  
 
![](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
二进制格式编码规则如下所示：
1. 前4字节代表接下来到语句级别分隔符字母P（不含）或者该批次结束符F（不含）的解码结果的总字节数，该值如果为0代表本批次解码结束。
2. 接下来8字节uint64代表相应lsn（begin对应first_lsn，commit对应end_lsn，其他场景对应该条语句的lsn）。
3. 接下来1字节的字母有5种B/C/I/U/D，分别代表begin/commit/insert/update/delete。
4. 第[3.接下来1字节的字母有5种B/C/I/U/D，...]步字母为B时。
   1. 接下来的8字节uint64代表CSN。
   
   2. 接下来的8字节uint64代表first_lsn。
   
   3. 【该部分为可选项】接下来的1字节字母如果为T，则代表后面4字节uint32表示该事务commit时间戳长度，再后面等同于该长度的字符为时间戳字符串。
   
   4. 【该部分为可选项】接下来的1字节字母如果为N，则代表后面4字节uint32表示该事务用户名的长度，再后面等同于该长度的字符为事务的用户名字。
   
   5. 因为之后仍可能有解码语句，接下来会有1字节字母P或F作为语句间的分隔符，P代表本批次仍有解码的语句，F代表本批次完成。
    
5. 第[3.接下来1字节的字母有5种B/C/I/U/D，...]步字母为C时：
   1. 【该部分为可选项】接下来1字节字母如果为X，则代表后面的8字节uint64表示xid。
   
   2. 【该部分为可选项】接下来的1字节字母如果为T，则代表后面4字节uint32表示时间戳长度，再后面等同于该长度的字符为时间戳字符串。
   
   3. 因为批量发送日志时，一个COMMIT日志解码之后可能仍有其他事务的解码结果，接下来的1字节字母如果为P则表示该批次仍需解码，如果为F则表示该批次解码结束。
    
6. 第[3.接下来1字节的字母有5种B/C/I/U/D，...]步字母为I/U/D时：
   1. 接下来的2字节uint16代表schema名的长度。
   
   2. 按照上述长度读取schema名。
   
   3. 接下来的2字节uint16代表table名的长度。
   
   4. 按照上述长度读取table名。
   
   5. 【该部分为可选项】接下来1字节字母如果为N代表为新元组，如果为O代表为旧元组，这里先发送新元组。
      1. 接下来的2字节uint16代表该元组需要解码的列数，记为attrnum。
      
      2. 以下流程重复attrnum次。
         1. 接下来2字节uint16代表列名的长度。
         
         2. 按照上述长度读取列名。
         
         3. 接下来4字节uint32代表当前列类型的Oid。
         
         4. 接下来4字节uint32代表当前列的值（以字符串格式存储）的长度，如果为0xFFFFFFFF则表示NULL，如果为0则表示长度为0的字符串。
         
         5. 按照上述长度读取列值。
          
       
   
   6. 因为之后仍可能有解码语句，接下来的1字节字母如果为P则表示该批次仍需解码，如果为F则表示该批次解码结束。
    
 
- sending-batch： 指定是否批量发送。
  取值范围：0或1的int型，默认值为0。
  - 0：设为0时，表示逐条发送解码结果。
  
  - 1：设为1时，表示解码结果累积到达1MB则批量发送解码结果。
  
  
  开启批量发送的场景中，当解码格式为'j'或't'时，在原来的每条解码语句之前会附加一个uint32类型，表示本条解码结果长度（长度不包含当前的uint32类型），以及一个uint64类型，表示当前解码结果对应的lsn。
  
- parallel-queue-size： 指定并行逻辑解码线程间进行交互的队列长度。
  取值范围：2\~1024的int型，且必须为2的整数幂，默认值为128。
  队列长度和解码过程的内存使用量正相关。
  
 
