某现场,操作人员手误删除了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;