元数据不一致类问题 主节点之间元数据不一致问题问题 问题描述 所有个CN、DN主节点之间元数据不一致问题,对应pgcheck()元数据检查返回类型“crosscheck”,例如,某个对象,如库、模式、表、索引、字段等,在其中1个或多个CN、DN主节点上不存在。 例如,以下select from pgcheck(); 查询结果: 产生元数据不一致的主要原因:在元数据缺失的节点上,主节点和备节点不同步,DDL语句在备节点未应用时,发起了主备切换,备升主后,该备节点元数据与其它主节点不一致。 可能影响 对于应存在,但某些节点实际缺失的情况,访问到该对象的语句会报错;例如上图元数据问题,查询表时会有如下报错: teledb select count() from testvarchar2; ERROR: node:dn002, backendpid:25375, nodename,backendpid,message:dn002,25375,could not open relation with OID 0 对于应不存在,但某些节点实际存在的情况,造成无用对象残留,空间被占用(如DN上大表残留)。 解决步骤 1. 元数据不一致检查及分析 首先根据select from pgcheck();结果梳理和分析元数据不一致情况,第一列checktypecrosscheck,最后一列isfoundtrue表示该节点上有此对象,isfoundfalse表示无此对象,根据各CN、DN节点的isfound结果分析,对象应存在,还是应不存在。通常情况: 1)对象不存在的场景,某个节点上isfoundtrue,其它所有节点上isfoundfalse; 2)对象应存在的场景,某个节点上isfoundfalse,其它所有节点上isfoundtrue; 3)初步判断后,或无法区分时,应与业务侧进行核实确认; 2. 制定修复方案: 1)对象应不存在的场景,修复起来相对简单,梳理出缺失的对象,然后执行drop if exists xxx;命令删除,需要增加if exists关键字,在缺失对象的节点上不会报错; 通常是表缺失,同时基于表的索引、类型、字段等缺失。例如上述截图中,可以判断出dn002节点上缺失了testvarchar2表。这里我们如果要修复,执行 drop if exists testvarchar2;语句就可以了; a、所有CN主节点上没有该对象,需要连接所有DN主节点,开启事务写,drop该对象; b、部分CN主节点上没有该对象,需要连接有该对象的主CN,执行drop if exists testvarchar2; c、部分DN主节点上没有该对象,需要连接有该对象的主CN,执行drop if exists testvarchar2; 2)对象应存在的场景,要在节点上补缺失的对象,需要判断缺失对象的节点类型 a、CN节点上需要补缺失的对象,需要单用户模式启动该CN主节点,创建对象; b、DN节点上需要补缺失的对象,需要连接该DN主节点,开启事务写,创建对象; 注意 元数据一致问题修复需要操作CN节点、DN节点,应在TeleDB运维专家/开发人员的指导下进行,避免因操作失误造成更大损失。