跳转至

V2.3.0升级特性pg_clean使用说明

1. 安装 pg_clean 工具:

连接任意主CN:

CREATE EXTENSION pg_clean;

2. 构造两阶段事务残留用例:

session1—cn1

begin; 
create table a (id int); 
prepare transaction 'create_a';
set xc_maintenance_mode = on;
execute direct on (dn002) 'rollback prepared ''create_a''';
set xc_maintenance_mode = off;
\q

该用例中我们创建了一个gid为 'create_a' 的两阶段事务,然后将 xc_maintenance_mode 打开,使得该事务仅在dn002中执行rollback。

3. 查找集群中两阶段事务残留:

session2—cn2

select * from pg_clean_check_txn();

pg_clean_check_txn

上图打印出了集群中残留的两阶段事务。其中gid表示该事务的全局标识,global_transaction_status表示该事务在全局的状态,transaction_status_on_allnodes表示该事务在所有节点中的状态。

4. 查看2PC残留文件名

查询节点cn1中数据目录pg_2pc下所有的2PC残留文件名

session1—cn1

    postgres=# select * from pgxc_get_record_list();
     pgxc_get_record_list 
    ----------------------
     create_a
    (1 row)

5. 清理集群中两阶段事务残留:

session2—cn2

select * from pg_clean_execute();

pg_clean_execute

上图打印了所有残留的两阶段事务,以及对它们执行的操作。其中operation表示对事务在每个节点执行的操作,operation_status表示该操作是否执行成功。由于该事务的全局事务状态为ABORT因此,我们去到每个状态为prepare的节点中对该事务执行rollback操作。

6. 检查已清理的两阶段事务是否残留文件记录:

session1—cn1

    postgres=# select * from pgxc_get_record_list();
     pgxc_get_record_list 
    ----------------------

    (1 row)

由于在上个步骤pg_clean_execute执行成功,因此已经回滚的事务'create_a'在所有节点的文件记录均已删除,这里我们在cn1查看所有2pc文件记录,显示为空,结果正确。