某现场,操作人员手误删除了gbase.nodedatamap里的数据,导致所有的表查询报错: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;