
# 复制函数
复制函数是系统为实现高可用在各个实例间进行日志同步或数据同步所提供的统计或操作方法。
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
除统计查询外的复制函数为内部调用函数，不建议用户直接使用。
#### pg_create_logical_replication_slot('slot_name', 'plugin_name')
描述：创建逻辑复制槽。该函数在9.1.0.200及之后版本已废弃，为兼容历史版本功能保留该函数。
参数说明：
- slot_name 流复制槽名称。
  取值范围：字符串，不支持除字母，数字，以及（_?-.）以外的字符。
  
- plugin_name 插件名称。
  取值范围：字符串，当前只支持"mppdb_decoding"。
  
返回值类型：name, text
备注：第一个返回值表示slot_name，第二个返回值表示该逻辑复制槽解码的起始LSN位置。
#### pg_create_physical_replication_slot ('slot_name', isDummyStandby)
描述：创建物理复制槽。
参数说明：
- slot_name 流复制槽名称。
  取值范围：字符串，不支持除字母，数字，以及（_?-.）以外的字符。
  
- isDummyStandby 复制槽是否为从备。
  取值范围：布尔值，支持true或false。
  
返回值类型：name, text
备注：第一个返回值表示slot_name，第二个返回值表示该物理复制槽解码的起始LSN位置。
#### pg_get_replication_slots()
描述：显示当前DN上所有的复制槽信息。
返回值类型：record
函数返回信息如下：
表1pg_get_replication_slots()字段 
| 名称            | 类型      | 描述               |
|:---|:---|:---|
| slot_name     | text    | 复制槽的名称           |
| plugin        | name    | 逻辑复制槽对应的输出插件名    |
| slot_type     | text    | 复制槽的类型           |
| datoid        | oid     | 复制槽的数据库OID       |
| active        | boolean | 复制槽是否为激活状态       |
| xmin          | xid     | 复制槽事务标识          |
| catalog_xmin  | text    | 逻辑复制槽对应的最早解码事务标识 |
| restart_lsn   | text    | 复制槽的Xlog文件信息     |
| dummy_standby | boolean | 复制槽是否为从备         |
   
示例：
```
SELECT * FROM pg_get_replication_slots();
    slot_name    | plugin | slot_type | datoid | active | xmin | catalog_xmin |    restart_lsn    | dummy_standby
-----------------+--------+-----------+--------+--------+------+--------------+-------------------+---------------
 gs_roach_common |        | physical  |      0 | f      |      |    602861775 | FFFFFFFF/FFFFFFFF | f
(1 row)
```
#### pg_drop_replication_slot('slot_name')
描述：删除流复制槽。
参数说明：
- slot_name 流复制槽名称。
  取值范围：字符串，不支持除字母，数字，以及（_?-.）以外的字符。
  
返回值类型：void
 #### pg_logical_slot_peek_changes('slot_name', 'LSN', upto_nchanges, 'options_name', 'options_value')
描述：解码并不推进流复制槽（下次解码可以再次获取本次解出的数据）。该函数在9.1.0.200及之后版本已废弃，为兼容历史版本功能保留该函数。
参数说明：
- slot_name 流复制槽名称。
  取值范围：字符串，不支持除字母，数字，以及（_?-.）以外的字符。
  
- LSN 日志的LSN，表示只解码小于等于此LSN的日志。
  取值范围：字符串（LSN，格式为xlogid/xrecoff），如'1/2AAFC60'。为NULL时表示不对解码截止的日志位置做限制。
  
- upto_nchanges 解码条数（包含begin和commit）。假设一共有三条事务，分别包含3、5、7条记录，如果upto_nchanges为4，那么会解码出前两个事务共8条记录。解码完第二条事务时发现解码条数记录大于等于upto_nchanges，会停止解码。
  取值范围：非负整数。
  ![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
  LSN和upto_nchanges中任一参数达到限制，解码都会结束。
  
- options：此项为可选参数。
  - 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时间戳。
     
   
返回值类型：text, uint, text
备注：函数返回解码结果，每一条解码结果包含三列，对应上述返回值类型，分别表示LSN位置、xid和解码内容。
#### pg_logical_slot_get_changes('slot_name', 'LSN', upto_nchanges, 'options_name', 'options_value')
描述：解码并推进流复制槽。该函数在9.1.0.200及之后版本已废弃，为兼容历史版本功能保留该函数。
参数说明： 与pg_logical_slot_peek_changes一致，详细内容请参见[pg_logical_slot_peek_changes('slot_name', 'LSN', upto_nchanges, 'options_name', 'options_value')]。
#### pg_replication_slot_advance ('slot_name', 'LSN')
描述：直接推进流复制槽到指定LSN，不输出解码结果。
参数说明：
- slot_name 流复制槽名称。
  取值范围：字符串，不支持除字母，数字，以及（_?-.）以外的字符。
  
- LSN 推进到的日志LSN位置，下次解码时只会输出提交位置比该LSN大的事务结果。如果输入的LSN比当前流复制槽记录的推进位置还要小，则直接返回；如果输入的LSN比当前最新物理日志LSN还要大，则推进到当前最新物理日志LSN。
  取值范围：字符串（LSN，格式为xlogid/xrecoff）。
  
返回值类型：name, text
备注：返回值分别对应slot_name和实际推进至的LSN。
#### pg_stat_get_data_senders()
描述：显示当前DN上所有的数据页复制发送线程的统计信息。
返回值类型：record
函数返回信息如下：
表2pg_stat_get_data_senders()字段 
| 名称                     | 类型                       | 描述                    |
|:---|:---|:---|
| pid                    | bigint                   | 线程pid                 |
| sender_pid             | integer                  | 当前sender的pid          |
| local_role             | text                     | 本地的角色                 |
| peer_role              | text                     | 对端的角色                 |
| state                  | text                     | 当前sender的复制状态         |
| catchup_start          | timestamp with time zone | catchup启动的时间          |
| catchup_end            | timestamp with time zone | catchup结束的时间          |
| queue_size             | text                     | 数据队列大小                |
| queue_lower_tail       | text                     | 数据队列尾1位置              |
| queue_header           | text                     | 数据队列头位置               |
| queue_upper_tail       | text                     | 数据队列尾2位置              |
| send_position          | text                     | 发送端发送的位置              |
| receive_position       | text                     | 接收端接收的位置              |
| catchup_type           | text                     | catchup方式为全量还是增量      |
| catchup_bcm_filename   | text                     | catchup当前执行的bcm文件     |
| catchup_bcm_finished   | integer                  | catchup已操作完成的bcm文件数量  |
| catchup_bcm_total      | integer                  | catchup总共需要操作的bcm文件数量 |
| catchup_percent        | text                     | catchup已经操作完成的百分比     |
| catchup_remaining_time | text                     | catchup预估剩余时间         |
   
#### pg_stat_get_wal_senders()
描述：显示当前DN上所有的WAL复制发送线程的统计信息。
返回值类型：record
函数返回信息如下：
表3pg_stat_get_wal_senders()字段 
| 名称                         | 类型                       | 描述                      |
|:---|:---|:---|
| pid                        | bigint                   | 线程pid                   |
| sender_pid                 | integer                  | 当前sender的pid            |
| local_role                 | text                     | 本地的角色                   |
| peer_role                  | text                     | 对端的角色                   |
| peer_state                 | text                     | 对端的状态                   |
| state                      | text                     | 当前sender的复制状态           |
| catchup_start              | timestamp with time zone | catchup启动的时间            |
| catchup_end                | timestamp with time zone | catchup结束的时间            |
| sender_sent_location       | text                     | 发送端发送的LSN位置             |
| sender_write_location      | text                     | 发送端write的LSN位置          |
| sender_flush_location      | text                     | 发送端flush的LSN位置          |
| sender_replay_location     | text                     | 发送端replay的LSN位置         |
| receiver_received_location | text                     | 接收端received的LSN位置       |
| receiver_write_location    | text                     | 接收端write的LSN位置          |
| receiver_flush_location    | text                     | 接收端flush的LSN位置          |
| receiver_replay_location   | text                     | 接收端replay的LSN位置         |
| sync_percent               | text                     | 同步百分比                   |
| sync_state                 | text                     | 同步状态（异步复制，同步复制，还是潜在同步者） |
| sync_priority              | integer                  | 同步复制的优先级（0表示异步）         |
| sync_most_available        | text                     | 在备机同步失败时，是否阻塞主机         |
| channel                    | text                     | WALSender的信道信息          |
   
#### pg_stat_get_wal_receiver()
描述：显示当前DN上所有的WAL复制接收线程的统计信息。
返回值类型：record
函数返回信息如下：
表4pg_stat_get_wal_receiver() 
| 名称                         | 类型      | 描述                |
|:---|:---|:---|
| receiver_pid               | integer | 当前receiver的pid    |
| local_role                 | text    | 本地的角色             |
| peer_role                  | text    | 远端的角色             |
| peer_state                 | text    | 远端的状态             |
| state                      | text    | 当前receiver的复制状态   |
| sender_sent_location       | text    | 发送端发送的LSN位置       |
| sender_write_location      | text    | 发送端write的LSN位置    |
| sender_flush_location      | text    | 发送端flush的LSN位置    |
| sender_replay_location     | text    | 发送端replay的LSN位置   |
| receiver_received_location | text    | 接收端received的LSN位置 |
| receiver_write_location    | text    | 接收端write的LSN位置    |
| receiver_flush_location    | text    | 接收端flush的LSN位置    |
| receiver_replay_location   | text    | 接收端replay的LSN位置   |
| sync_percent               | text    | 同步百分比             |
| channel                    | text    | WALReceiver的信道信息  |
   
#### pg_stat_get_stream_replications()
描述：显示当前DN上所有的复制统计信息。
返回值类型：record
函数返回信息如下：
表5pg_stat_get_stream_replications() 
| 名称                 | 类型      | 描述    |
|:---|:---|:---|
| local_role         | text    | 本地的角色 |
| static_connections | integer | 连接统计  |
| db_state           | text    | 数据库状态 |
| detail_information | text    | 详细信息  |
   
示例：
```
SELECT * FROM pg_stat_get_stream_replications();
 local_role | static_connections | db_state | detail_information
------------+--------------------+----------+--------------------
 Normal     |                  0 | Normal   | Normal
(1 row)
```
#### pg_stat_xlog_space()
描述：显示当前DN上Xlog空间使用信息。
返回值类型：record
函数返回信息如下：
表6pg_stat_xlog_space() 
| 名称         | 类型     | 描述                                                               |
|:---|:---|:---|
| xlog_files | bigint | pg_xlog目录下，去除backup、archive_status等子目录，所有识别为xlog文件的数目。           |
| xlog_size  | bigint | pg_xlog目录下，去除backup、archive_status等子目录，所有识别为xlog文件的文件大小之和，单位为MB。 |
| other_size | bigint | pg_xlog目录下backup、archive_status等子目录文件的大小之和，单位为MB。                |
   
示例：
```
SELECT * FROM pg_stat_xlog_space();
 xlog_files | xlog_size | other_size
------------+-----------+------------
         79 |      1264 |          0
(1 row)
```
#### pgxc_stat_xlog_space()
描述：显示所有主DN上Xlog空间使用信息。
返回值类型：record
函数返回信息如下：
表7pgxc_stat_xlog_space() 
| 名称         | 类型     | 描述                                                               |
|:---|:---|:---|
| node_name  | name   | 节点名称                                                             |
| xlog_files | bigint | pg_xlog目录下，去除backup、archive_status等子目录，所有识别为xlog文件的数目。           |
| xlog_size  | bigint | pg_xlog目录下，去除backup、archive_status等子目录，所有识别为xlog文件的文件大小之和，单位为MB。 |
| other_size | bigint | pg_xlog目录下backup、archive_status等子目录文件的大小之和，单位为MB。                |
   
示例：
```
SELECT * FROM  pgxc_stat_xlog_space();
  node_name   | xlog_files | xlog_size | other_size
--------------+------------+-----------+------------
 dn_6001_6002 |         73 |      1168 |          0
 dn_6003_6004 |         73 |      1168 |          0
 dn_6005_6006 |         73 |      1168 |          0
 cn_5003      |         79 |      1264 |          0
 cn_5001      |         72 |      1152 |          0
 cn_5002      |         73 |      1168 |          0
(6 rows)
```
