南大通用GBase 8a误操作后报错Can't get distribution info for getting all nodes

某现场,操作人员手误删除了gbase.nodedatamap里的数据,导致所有的表查询报错:ERROR 1105 (HY000): (GBA-030T-0002) Can't get distribution info for getting all nodes.

报错样例

ERROR 1105 (HY000): (GBA-030T-0002) Can't get distribution info for getting all nodes.

原因

GBase 8a的每张表,有个分布ID(date_distribution_id), 保存在gbase.table_distribution里。

gbase> desc gbase.table_distribution;
+----------------------+---------------+------+-----+---------+-------+
| Field                | Type          | Null | Key | Default | Extra |
+----------------------+---------------+------+-----+---------+-------+
| index_name           | varchar(128)  | NO   | PRI | NULL    |       |
| dbName               | varchar(64)   | NO   |     | NULL    |       |
| tbName               | varchar(64)   | NO   |     | NULL    |       |
| isReplicate          | varchar(3)    | NO   |     | YES     |       |
| hash_column          | varchar(4096) | YES  |     | NULL    |       |
| lmt_storage_size     | bigint(20)    | YES  |     | NULL    |       |
| table_storage_size   | bigint(20)    | YES  |     | NULL    |       |
| is_nocopies          | varchar(3)    | NO   |     | YES     |       |
| data_distribution_id | bigint(8)     | NO   |     | NULL    |       |
| vc_id                | varchar(64)   | NO   | PRI | NULL    |       |
| mirror_vc_id         | varchar(64)   | YES  |     | NULL    |       |
+----------------------+---------------+------+-----+---------+-------+
11 rows in set (Elapsed: 00:00:00.00)

而系统的数据分布规则,是保存在gbase.notedatamap表里面,同样对应一个 data_distribution_id。

gbase> desc gbase.nodedatamap;
+----------------------+-----------+------+-----+---------+-------+
| Field                | Type      | Null | Key | Default | Extra |
+----------------------+-----------+------+-----+---------+-------+
| hashkey              | int(11)   | YES  |     | NULL    |       |
| nodeid               | int(11)   | YES  |     | NULL    |       |
| data_distribution_id | bigint(8) | YES  |     | NULL    |       |
+----------------------+-----------+------+-----+---------+-------+
3 rows in set (Elapsed: 00:00:00.01)

操作该表时,要查询gbase.nodatamap 对应data_distribution_id分布信息,,如果没有找到则报如上的错误。

该问题,都是意外发生的,比如手工误删除了nodedatamap的数据。

处理方法

由于该表是调度节点(gcluster)的本地表,如果其它调度节点正常,可以从其恢复过来。

1、导出正常的调度节点数据,可以用gbasedump,导出成insert values格式。

2、在故障节点,调用该SQL,恢复数据。

如果所有节点nodedatamap已经完全空了,这个几率极低,除非系统就1个调度节点,那么可以重新生成一个,执行initnodedatamap;