DWS CN事务号回卷故障构造及恢复

举报
你怎么不讲道理 发表于 2021/05/29 11:41:03 2021/05/29
【摘要】 涉及版本:C80及以下版本相关原理:http://mysql.taobao.org/monthly/2018/03/08/从6.5.1版本开始,DWS采用64位事务号,不再存在此问题。此帖只用于技术交流。此方案属于高危操作,严禁用户与一线、二线在生产集群操作!操作不慎会导致集群无法修复的严重后果! 场景一:CN回卷,且正常cn的nextxid未超过21亿1. 确认集群状态:3c18d确认gt...

涉及版本:C80及以下版本

相关原理:http://mysql.taobao.org/monthly/2018/03/08/

6.5.1版本开始,DWS采用64位事务号,不再存在此问题。此帖只用于技术交流。

此方案属于高危操作,严禁用户与一线、二线在生产集群操作!操作不慎会导致集群无法修复的严重后果!

 

场景一:CN回卷,且正常cnnextxid未超过21亿

1. 确认集群状态:3c18d


确认gtm主备


2. 在三个cn分别执行

select txid_current();

select * from pg_get_xidlimit();

确定事务号当前处于正常状态

3. 将主gtmgtm.control中,xid的值改为19亿,然后kill -9 gtm


4. 查询事务号情况


5. 在所有cn都执行vacuum freeze,推进oldestXid18亿


6. 将gtm.controlxid的值改为39亿,kill -9 gtm,并且只在cn5001cn5002执行vacuum freeze

cn5001cn5002的事务号变成下图的情况(nextXid39亿,oldestXid推进到38亿)


cn5003的事务号变成下图的情况(nextXid39亿,oldestXid仍为18亿)


7. 将gtm.comtrolxid的值改为49亿,kill -9 gtm

cn5001cn5002执行select txid_current()可以正常执行。查看事务号情况,nextXid回卷至6亿,oldestXid38亿,还可以正常运行


cn5003执行select txid_current()会报错,因为此时cn5003nextXid6亿,oldestXid18亿,无法再执行写事务。场景已复现。

恢复方案:

gs_replace即可


 

场景二:CN回卷,且正常cnnextXid已超过21亿

1. 确认集群状态:3c18d


确认gtm主备


2. 在三个cn分别执行

select txid_current();

select * from pg_get_xidlimit();

确定事务号当前处于正常状态

3. 将主gtm.controlxid改为16亿,kill -9 gtm,并在cn5001cn5002执行vacuum freeze

此时cn5001cn5002nextXid16亿,oldestXid15亿


cn5003nextXid16亿,oldestXid5亿


4. 将主gtm.controlxid改为30亿,kill -9 gtm

此时cn5001cn5002nextXid30亿,oldestXid15亿,仍可正常使用;cn5003nextXid30亿,oldestXid5亿,问题复现

 

恢复方案:

1. 停掉集群cm_ctl stop

2. 将cn_5003数据目录进行备份


3. 对cn5003所有绝对表空间的真实目录进行备份(使用mv命令备份)。表空间真实路径可以在pg_tblspc查看,相对表空间因为路径在pg_location下,不用重复备份。(测试环境上只有一个相对表空间,没有绝对表空间,不重复备份)


4. 将cn5001的目录拷贝至cn5003


5. 在cn5001所在节点将所有绝对表空间下的cn5001目录拷贝至cn5003所在节点的对应位置,并重命名为cn5003。相对表空间直接去对应位置重命名即可。重命名之后重建软连接

mv PG_9.2_201611171_cn_5001/ PG_9.2_201611171_cn_5003/


pg_tblspc重建软连接


6. 从之前备份的cn5003目录中,将pg_hba.confpg_ident.confpostgresql.conf三个文件拷贝回去


7. 启动集群cm_ctl start

8. 连接cn5003,更新pgxc_node

由于cn5003是从cn5001拷贝过来的,pgxc_nodelocalhost还是cn5001,需要修改

查看当前视图


进行修改

update pgxc_node set (node_host,node_host1)=('localhost','localhost') where node_name = 'cn_5003';

update pgxc_node set (node_host,node_host1)=('100.185.183.29,'100.185.183.29') where node_name = 'cn_5001';


再次查看视图


9. 重启集群

10. 在cn5003创建一张表进行验证

11. 业务验证

 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。