一、版本信息
名称 | 值 |
CPU | Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz |
操作系统 | CentOS Linux release 7.9.2009 (Core) |
内存 | 3G |
逻辑核数 | 2 |
Gbase8a版本 | 8.6.2-R43 |
二、问题原因
由于gbase.table_distribution存储了所有引擎为express的表元数据信息,如果此表出现数据损坏,会导致本地调度节点无法获取表信息,在select、drop等操作时,将提示metadata is incomplete on localhost。但desc、show create table语句还是可以执行成功的。
三、gbase.table_distribution介绍
gbase> select index_name,dbName,tbName,isReplicate,hash_column,is_nocopies,data_distribution_id from gbase.table_distribution limit 10;
+-------------------------------+------------+--------------------+-------------+-------------+-------------+----------------------+
| index_name | dbName | tbName | isReplicate | hash_column | is_nocopies | data_distribution_id |
+-------------------------------+------------+--------------------+-------------+-------------+-------------+----------------------+
| gclusterdb.nodedatamap | gclusterdb | nodedatamap | YES | NULL | NO | 1 |
| gclusterdb.rebalancing_status | gclusterdb | rebalancing_status | NO | index_name | NO | 1 |
| gclusterdb.dual | gclusterdb | dual | YES | NULL | NO | 1 |
| czg.hash_tb_like | czg | hash_tb_like | NO | NULL | NO | 1 |
| czg.testtab | czg | testtab | NO | NULL | NO | 1 |
| czg.a | czg | a | NO | NULL | NO | 1 |
| czg.b | czg | b | NO | NULL | NO | 1 |
| czg.testtab_copy | czg | testtab_copy | NO | NULL | NO | 1 |
| czg.test_table | czg | test_table | NO | NULL | NO | 1 |
| czg.test_table_1 | czg | test_table_1 | NO | NULL | NO | 1 |
+-------------------------------+------------+--------------------+-------------+-------------+-------------+----------------------+
10 rows in set (Elapsed: 00:00:00.00)
列名 | 含义 |
index_name | 库名和表名组合,主键的作用。 |
dbName | 库名。 |
tbName | 表名。 |
isReplicate | 复制表的标记。 |
hash_column | 哈希分布表数据分布列。 |
is_nocopies | nocopy表的标记。 |
data_distribution_id | 表数据分部信息的 ID。 |
四、解决方法
1、多调度节点
我这边是出现了一个是一个DDL EVENT,查看gc_recover.log过一段时间会自动修复DDL EVENT。
如果没有立马恢复,例如你查的是一节点出的错误,可以换到二节点,也可以正常查询,因为二节点的gbase.table_distribution元数据没有损坏。
2、一个调度节点
一个调度节点无法自动修复,只能手动删除相应event,我这边是DDLevent,所以用下面方法,其他的event要调用相应的方法。
我们先查看存在哪些ddl event,调用gcware.getddlfevents()获取。
[gbase@czg2 Graph]$ python
Python 2.7.5 (default, Jun 28 2022, 15:30:04)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gcware
>>> gcware.getddlfevents()
({'eventid': 3, 'comment': '', 'distributionid': 1, 'tablename':
'test.t', 'delayTag': 0, 'content':
'\x01\x00\x02\x00\x01\x00\x02\x00\xe9\x00\x00\x00\xd2\x05\x00test\x0
0\x02\x00t\x00\x01\x00\x03\x00b\xc0\xa8\x06\xe8\x16\x00\x01\x00\x12\
x19\x07\x00\x00\x19\x00\x11\x02\x19\x00\x17\x03\x15\x00\x07\x1d\x00\
x00\x1b\x00S\x02\x00\x00\x00\x180\x00\x07\x1b\x00\xf3\x93\x9e\x00\x0
0\x00CREATE GCLUSTER_LOCAL TABLE /*+ sub_step,distribution(1) */
"test"."TNAME_00-1D-7D-C7-A5-17" (\n"a" INT(11) DEFAULT NULL\n)
TID_00-1D-7D-C7-A5-17 UID(1)
\x00\xb4\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'tableid': 22,
'datacopyids': ({'segid': 3, 'nodeipaddr': '192.168.6.232', 'nodeid':
3892750528, 'segname': 'n3'}, {'segid': 2, 'nodeipaddr':
'192.168.6.232', 'nodeid': 3892750528, 'segname': 'n2'}),
'nodecopyids': ({'nodeipaddr': '192.168.6.232', 'nodeid':
3892750528},), 'tabletype': 'DISTRIBUTION'},)
clearddlfevent(regex)介绍点 | 描述 |
实现功能 | 将符合正则表达式条件的表名对应的 ddl event 清除掉。 |
参数 | regex:用正则表达式描述的表名。 |
返回值 | 被删除的 event 个数。 |
>>> gcware.clearddlfevent('test.t')
1