2pc残留问题问题
问题描述
2pc为两阶段提交,正常运行也会有两阶段提交事务,大量分布式事务并行执行,可能会造成2pc事务堆积,数据库响应变慢等问题;而操作系统故障、实例节点异常重启等都可能会造成2pc事务残留,2pc残留会导致访问到该事务相关的SQL卡住,一直处理等待状态,影响业务运行,因此当有2pc残留时须尽快清理,正常情况Center可以定时发起2pc残留事务清理动作,当遇到一些异常情况时,2pc残留任务未发起或清理失败,会导致2pc残留下来,进一步阻塞相关SQL执行。
可能影响
- 可能会导致部分SQL执行一直处理等待状态,通过pg_blocking_pids(pid)返回pid为0,则表示事务被2pc两阶段事务阻塞;
- 可能会导致节点启动失败。
解决步骤
- 2pc是在每个CN主节点上各自管理,需要在每个CN主节点上执行
- 执行2pc残留检查SQL:
select pg_clean_check_txn();
返回结果如:
pg_clean_check_txn
-----------------------------------
(_$XC$1017222:cn001:F:2:0,test,TXN_STATUS_ABORTED,"cn001 :TXN_STATUS_INITIAL+
cn002 :TXN_STATUS_INITIAL +
dn001 :TXN_STATUS_PREPARED +
dn002 :TXN_STATUS_PREPARED")
(_$XC$1017223:cn001:F:2:0,test,TXN_STATUS_ABORTED,"
cn001 :TXN_STATUS_INITIAL+
cn002 :TXN_STATUS_INITIAL +
dn001 :TXN_STATUS_PREPARED +
dn002 :TXN_STATUS_PREPARED")
(2 rows)
- 在检查有2pc残留的CN节点上清理SQL:
select pg_clean_check_txn();
- 上述这方法通常可以清理掉2pc残留,还有可能在清理时提示pg_xact或pg_commit_ts文件失败的问题,可参考文档补全缺失文件后再执行2pc清理SQL。