暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 2PC残留事务修复

墨天轮 2019-09-23
846

2PC残留事务修复

集群CN故障导致两阶段提交有残留事务时,可以根据本节内容对这些残留事务进行修复。CN故障分为两种情形,情形1下故障CN可访问历史数据,情形2下故障CN无法访问历史数据。该操作仅支持分布式部署模式下执行。

背景信息

部署集群时,建议用户将CN实例分散部署在其他多个服务器上,以避免主机故障造成的集群不可用。如表1所示。

表1 集群部署方案示例

主机

AZ

CN

CM

ETCD

DN

plat1

AZ1

CN 1

CM备

ETCD1

DN1备

plat2

AZ1

CN 2

CM主

ETCD2

DN2备

plat3

AZ1

-

-

ETCD3

DN1主

plat4

AZ1

-

-

-

DN2主

两阶段提交事务(2PC)的处理过程分为两个阶段:阶段1是PREPARE,阶段2是COMMIT。2PC必然涉及多个DN操作。

阶段1(PREPARE)中,CN先把事务信息记录在SYS_PENDING_DIST_TRANS中,标识事务状态为PREPARE,下发PREPARE给所有事务关联主DN。

阶段2(COMMIT)中,CN审查所有DN返回的预提交结果,如果所有主DN都可以提交,CN标识事务状态为COMMIT,并下发所有主DN做正式提交,这样该全局事务被提交。如果有任一主DN的PREPARE、COMMIT返回失败,CN将要求所有其它主DN回滚该事务操作,这样该全局事务被回滚。

注意:zengine.ini中CN配置参数tc_level配置为0时,CN不再把事务信息记录在SYS_PENDING_DIST_TRANS表中,需要参考情形2处理。

约束:提交或者回滚事务分支时,操作用户需要具备force any transaction权限,或者操作用户为事务的创建用户。

情形1:故障CN可访问

  • 查看CN上事务状态。

    • omm身份登录故障CN所在服务器。
    • 在故障CN上以本地登录方式使用zsql连接数据库。
      zsql / as clsmgr -D cn_data_dir
    • (可选)如果使用zsql连接失败,需要使用如下命令手工启动CN进程后再使用命令zsql / as clsmgr -D cn_data_dir”本地登录故障CN。
      zengine open --coordinator -D cn_data_dir
    • 查看CN上的2PC状态。
      SELECT * FROM SYS.SYS_PENDING_DIST_TRANS; GLOBAL_TRAN_ID TRAN_COMMIT_TIME TRX_STATUS NEED_CLEAN -------------- -------------------------------- ------------ ------------ 4B010900843D310101000000 0 1 DE6F0500F811310101000000 1 1 F2700500FB11310101000000 0 1

      TRX_STATUS值为0时,表示该事务状态为PREPARE;TRX_STATUS值为1时,表示该事务状态为COMMIT。

  • 查询DN上状态为PREPARED和COMMITTED的事务。

    对于CN上ID为GLOBAL_TRAN_ID的事务,DBA用户需要在所有DN上根据GLOBAL_TRAN_ID+format_id来查询对应的事务,之后根据CN和DN上查询出来的事务状态进行提交或回滚两阶段事务操作。

    • 使用DBA用户登录DN。
      zsql omm@192.168.0.1:40000 Please enter password: ***********

      omm为安装后创建的系统管理员,其默认密码是gaussdb_123。192.168.0.1为DN所在的服务器IP地址,40000为连接的端口号。

    • 查询DN上状态为PREPARED的记录。

      DN上状态为PREPARED的事务可通过查询表SYS.DV_GLOBAL_TRANSACTIONS获取。

      SELECT * FROM SYS.DV_GLOBAL_TRANSACTIONS; GLOBAL_TRAN_ID FORMAT_ID BRANCH_ID LOCAL_TRAN_ID STATUS RMID SID ---------------------------------------------------------------- -------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ------------ ------------ 3F030C0028DF310101000000 247 0000 1.10185.5 PREPARED 65535 54
    • 查询DN上状态为COMMITED的记录。

      DN上状态为COMMITED的事务可通过查询表SYS.SYS_PENDING_TRANS获取。

      SELECT * FROM SYS.SYS_PENDING_TRANS; GLOBAL_TRAN_ID LOCAL_TRAN_ID TLOCK_LOBS TLOCK_LOBS_EXT FORMAT_ID BRANCH_ID OWNER ---------------------------------------------------------------- -------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- -------------------- ---------------------------------------------------------------- ------------ 41030C0028DF310101000000 22161391640 0100000000000000000000002100000008000000 247 0000 2

  • 根据CN和DN上查询到的2PC状态确定事务操作。

    对于CN上ID为GLOBAL_TRAN_ID的事务,DBA用户在所有DN上根据GLOBAL_TRAN_ID+format_id来查询对应的事务之后,可根据CN和DN上查询出来的事务状态进行提交或回滚两阶段事务操作,具体规则请参见表2。

    DN上通过查询表SYS.DV_GLOBAL_TRANSACTIONS获取的事务的状态均为PREPARED。

    DN上通过查询表SYS.SYS_PENDING_TRANS获取的事务的状态均为COMMITED。

    表2 CN-DN 2PC状态操作对照表

    CN上2PC状态(SYS_PENDING_DIST_TRANS中TRX_STATUS的值)

    DN上2PC状态

    CN和DN上需进行的事务操作

    PREPARE(0)

    PREPARED

    强制ROLLBACK。

    PREPARE(0)

    COMMITED

    无此情形。

    PREPARE(0)

    COMMITED,且事务记录已在SYS_PENDING_TRANS表中删除

    无此情形。

    COMMIT(1)

    PREPARED

    强制COMMIT。

    COMMIT(1)

    COMMITED

    强制COMMIT。

    COMMIT(1)

    COMMITED,且事务记录已在SYS_PENDING_TRANS表中删除

    正常数据,无需处理。

  • 根据步骤3中确定的事务操作在CN和DN上处理事务。

    • 连接数据库。
      • 在CN上回滚事务时,通过CN端口以clsmgr身份连接数据库。
        zsql / as clsmgr -D cn_data_dir

        如果使用zsql连接失败,需要使用如下命令手工启动CN进程后再使用命令zsql / as clsmgr -D cn_data_dir”本地登录故障CN。

        zengine open --coordinator -D cn_data_dir
      • 在DN上回滚事务时,通过DN端口以DBA用户身份连接数据库。
        zsql omm@192.168.0.1:40000 Please enter password: ***********

        omm为安装后创建的系统管理员,其默认密码是gaussdb_123。

        40000为DN的端口号,可以通过查看安装配置文件clusterconfig.xml中dataPortBase对应的值确认自定义的DN端口号。

        127.0.0.1为本节点IP,如果要连接其他节点上的DN,此处应为其他节点的IP。

    • 处理事务。

      在CN和DN上需要进行的事务操作分为强制ROLLBACK和强制COMMIT两种,具体操作步骤分别介绍如下。

      • 强制回退两阶段事务。
        ROLLBACK PREPARED 'XID';
        强制回滚事务示例:
        ROLLBACK PREPARED '247.4B010900843D310101000000.0000'; Succeed.
      • 强制提交两阶段事务。
        COMMIT PREPARED 'XID';

      其中XID为查询表SYS.DV_GLOBAL_TRANSACTIONS的返回参数按照操作命令拼接而成的字符串,格式为FORMAT_ID.GLOBAL_TRAN_ID.BRANCH_ID。其中,FORMAT_ID默认247,可以在cfg/zengine.ini中指定XA_FORMAT_ID = XXX调整默认值。CN上BRANCH_ID默认为0。

情形2:故障CN无法访问

当故障CN无法访问时,可查询所有DN的SYS.PENDING_TRANS表,通过数据分析是否有残留2PC记录,判断是否需要强制回滚或强制提交。该情形下需要DBA结合业务分析。

  • 确定故障CN的NODE ID。
  • 查询DN上状态为PREPARED和COMMITTED的事务。

    对于CN上ID为GLOBAL_TRAN_ID的事务,DBA用户需要在所有DN上根据GLOBAL_TRAN_ID+format_id来查询对应的事务,之后根据CN和DN上查询出来的事务状态进行提交或回滚两阶段事务操作。

    • 使用DBA用户登录DN。
      zsql omm@192.168.0.1:8000 Please enter password: ***********

      omm为安装后创建的系统管理员,其默认密码是gaussdb_123。192.168.0.1为DN所在的服务器IP地址,40000为连接的端口号。

    • 查询DN上状态为PREPARED的记录。

      DN上状态为PREPARED的事务可通过查询表SYS.DV_GLOBAL_TRANSACTIONS获取。

      SELECT * FROM SYS.DV_GLOBAL_TRANSACTIONS; GLOBAL_TRAN_ID FORMAT_ID BRANCH_ID LOCAL_TRAN_ID STATUS RMID SID ---------------------------------------------------------------- -------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ------------ ------------ 3F030C0028DF310101000000 247 0000 1.10185.5 PREPARED 65535 54
    • 查询DN上状态为COMMITED的记录。

      DN上状态为COMMITED的事务可通过查询表SYS.SYS_PENDING_TRANS获取。

      SELECT * FROM SYS.SYS_PENDING_TRANS; GLOBAL_TRAN_ID LOCAL_TRAN_ID TLOCK_LOBS TLOCK_LOBS_EXT FORMAT_ID BRANCH_ID OWNER ---------------------------------------------------------------- -------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- -------------------- ---------------------------------------------------------------- ------------ 41030C0028DF310101000000 22161391640 0100000000000000000000002100000008000000 247 0000 2

  • 根据步骤3中确定的事务操作在DN上处理事务。

    在DN上需要进行的事务操作分为强制ROLLBACK和强制COMMIT两种,具体操作步骤分别介绍如下。

    • 强制回退两阶段事务。

      对于DN上状态为PREPARED的事务,即查询表SYS.DV_GLOBAL_TRANSACTIONS获取的事务记录,需要强制回退两阶段事务。需要注意的是,该操作可能导致数据不一致。

      ROLLBACK PREPARED 'XID';
      强制回滚事务示例:
      ROLLBACK PREPARED '247.4B010900843D310101000000.0000'; Succeed.
    • 强制提交两阶段事务。

      对于DN上状态为COMMITED的事务,即查询表SYS.SYS_PENDING_TRANS获取的事务记录,需要强制回退两阶段事务。

      COMMIT PREPARED 'XID';

    其中XID为查询表SYS.DV_GLOBAL_TRANSACTIONS的返回参数按照操作命令拼接而成的字符串,格式为FORMAT_ID.GLOBAL_TRAN_ID.BRANCH_ID。其中,FORMAT_ID默认247,可以在cfg/zengine.ini中指定XA_FORMAT_ID = XXX调整默认值。CN上BRANCH_ID默认为0。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论