南大通用GBase 8a 手工设置分片dmlstorageevent方法

通常情况下如果出现gbase8a某个副本分片文件损坏或者缺失时,当读取该表的数据时会触发报错,并由产品机制自动设置dmlstorageevent并调用集群自动数据同步功能进行分片数据的恢复。但某些情况下此机制可能失效,需要手动对某些损坏的副本分片进行dmlstorageevent的设置,并调用集群的自动同步功能进行自动同步恢复。

备注

如果查询时,发现数据损坏,会自动设置event,但load,insert等DML不会,这些操作会认为是自己导致的,从而回滚,而不是认为原有的数据有故障。

在新的版本里(截止2022-11-24日尚未发布),会将报错分片设置event,由数据库自行检查是否有问题。

背景说明

由于GBase 8a MPP Cluster目前只开放了对副本分片设置dmlevent的操作接口,因此需要通过手工方式,让手工设置的dmlevent在自动同步过程中自动转为dmlstorageevent,从而实现全量恢复副本分片的能力,以下为操作示例供参考:

操作示例说明

以下示例中的副本间备份关系如下:可以由gcadmin showdistribution获取

主节点 分片号 备份节点

主节点		分片号	 	备份节点
10.185.204.115	146		10.185.204.116
10.185.204.112	143		10.185.204.115
10.185.204.113	144		10.185.204.114
10.185.204.114	145		10.185.204.117

示例中的执行环境为9.5.3多实例版本,9.5.2版本操作类似,例子中的db.tb可用具体的库名.表名来替换。

本例中恢复10.185.204.115上n146分片数据,将设置10.185.204.115上n146分片dmlstorageevent方式进行恢复

操作步骤

1)gc层对表加独占锁:

lock table [db.tb] write;

gc层对需要进行同步的表加独占锁锁(metalock E锁),避免表数据的存储层和元数据进行手工操作时有其他应用连入对操作的表进行读写操作造成进一步数据损坏和前端应用报错;

注意加锁后的session不要退出,否则将自动对该表的gc层独占锁解锁;

2)检查其他副本分片数据完好性:

连接10.185.204.115 gn层实例,执行:

select * from [db.tb]_n146 where rowid%65536=1;

如查询无报错,说明其他IP地址副本分片数据完好,可用于进行115节点n146分片的数据恢复

3)手动挪走元数据目录

登录10.185.204.115,手动将metadata目录下的db.tb_n146.GED目录挪走:

cd /opt/10.185.204.115/gnode/userdata/gbase/[db]/metadata

确认express引擎层元数据目录是否存在:

du -sh tb_n146.GED

如果存在则,将元数据目录挪走:

mv [tb]_n146.GED /home/gbase/

如果不存在,请确认tb_n146.frm文件存在,否则自动同步功能可能报错,

如果frm文件存在则可进行下一步操作,如果frm文件不存在,请从其他副本分片上copy一个frm文件到本目录下

4)设置分片转态

从gc层连入集群,执行手动设置10.185.204.115 n146分片dmlevent指令:

set self gcluster_node_status_list='vc00001.[db.tb]:n146:1942796554:2:123456';

设置10.185.205.115上[db.tb]_n146分片dmlevent

手动设置dmlevent指令接口简要说明:

set self gcluster_node_status_list='[tablename]:[dpname]:[nodeid]:[delaytag]:[scn]'

tablename:glcuster层表名,v95版本需要带上vcid,即vcid.库名.表名

nodeid:分片所在节点的gnode nodeid,可以从 show nodes命令中获取

dpname:分片名 如n1,n2。 如果是复制表,则为空

delaytag:即设置datacopy map中dpstate的状态,dmlevent对应值为2,ddlevent为16,dmlstorageevent为32

scn:同步操作的scn,可以为一串任意的数字即可

5)解锁gc层表独占锁:

在执行lock table ... write的session中执行:

unlock tables;

6)在10.185.204.115实例的同步日志中查看同步结果:

cd /opt/10.185.204.115/gnode/log/gbase/sync_log

检查同步日志是否最终同步结果为分片表同步success,success则同步成功

注意日志中一段开始时为dmlevent同步过程,会由于缺少[tb]_n146.GED express引擎层元数据目录失败,之后dmlevent将自动转为dmlstorageevent后进行dmlstorageevent同步,此为正常情况,操作中的第4步即为这个目的,即通过将元数据目录挪走,让手工设置的dmlevent自动转为dmlstorageevent,从而达到手动设置demlstorageevent的目标。

7)检查同步成功后的分片数据完好性:

连接10.185.204.115实例,进行如下查询:

select * from [db.tb]_n146 where rowid%65536=1;

一般自动同步日志中显示同步成功后对应分片的完好性是有保证的,第7步中的再次检查只是为了确认同步后的结果,也可以不做。

设置调度层coordinator的dmlstorageevent

请参考 GBase 8a手工设置表某个分片为故障状态的方法