在最近的一次项目之中,我经历了一次Phoenix 的一次删除索引,删除表的惨痛经历。历时2天才找到解决方案,特此分享给大家。
背景:
想要在Hbase的的表中(表也是phoenix建立的)再建一个phoenix的二级索引。代码如下:
-- 建表
CREATE TABLE "FN1"."CHATDOC" (
ID UNSIGNED_LONG NOT NULL PRIMARY KEY,
PARENTID UNSIGNED_LONG ,
TITLE VARCHAR(2000),
LINKURL VARCHAR(2000),
DOCCREATOR VARCHAR(100)
);
-- 创建的二级索引
CREATE INDEX IDX_CHATDOC_INCLUD ON FN1.CHATDOC(PARENTID) INCLUDE(TITLE,LINKURL,DOCCREATOR) COMPRESSION = 'GZ', SALT_BUCKETS = 2;
本以为是一个正常创建覆盖索引,但是没有想到这个却影响到了主表的数据,主表的PARENTID字段后面的几位变成了0,(这是一个偶然事件,只有这个表会出现,向phoenix提了issue 也没有解决)。那这种已经影响了元数据的事情肯定不能做了。所以我又将二级索引给删除了
DROP INDEX IDX_CHATDOC_INCLUD ON FN1.CHATDOC;
这个时候神奇的事情发生了,(可能是网络波动,可能是资源竞争)。我再查询我的主表的时候,发现表不见了。
一查,发现查询映射到了之前删除的二级索引中。那这个时候就问题严重了,我无法通过phoenix对原表进行任何的操作,hbase原生操作是可以的,而且也无法重新的去创建之前删除的二级索引。那之后我做了以下几件事:
1、去hbase 查看表信息
发现FN1.CHATDOC 这个表在 HBase 底层还有一个 phoenix indexer coprocessor 没有卸载掉。当时的解决思路有几种:
- phoenix 重新 drop 一次 index
- 未生效,hbase shell 手动卸载这个 coprocessor
但是2种都没有成功。
就当我排查来排查去,准备放弃准备删habse的数据的时候。我去查询了一下phoenix的mete数据
啊啊啊啊,简直了在这里还有个数据等着我呢。之后我就删除了该元数据,问题完美解决。
--查看元数据
select * from SYSTEM."CATALOG" where TABLE_NAME='CHATDOC' AND TABLE_SCHEM ='FN1';
--删除元数据字段
DELETE from SYSTEM."CATALOG" where TABLE_NAME='CHATDOC' AND TABLE_SCHEM ='FN1' AND COLUMN_FAMILY ='IDX_CHATDOC_INCLUD';
这就是我经历的全过程了,希望对大家有所帮助