案例说明:
在执行表数据查询时,出现下图所示错误,索引故障导致表无法访问,后重建索引问题解决。本案例复现了此类故障解决过程。
适用版本:
KingbaseES V8R3/R6
一、创建测试环境
- # 表结构信息
- prod=# \d+ test1
- Table "public.test1"
- Column| Type |Collation| Nullable |Default| Storage | Stats target | Description
- --------+---------+-----------+----------+---------+----------+--------------+-------------
- id |integer||notnull|| plain ||
- v_name |varchar|||| extended ||
- Indexes:
- "test1_pkey" PRIMARY KEY, btree (id)
- "test1_name_ind" btree (v_name)
- Access method: heap
-
- # 插入测试数据
- prod=# insertinto test1 values (generate_series(1,10000),'usr'||generate_series(1,10000));
- INSERT010000
- prod=# selectcount(*) from test1;
- count
- -------10000
- (1row)
-
- # 查看索引应用
- prod=# explain analyze select*from test1 where v_name='usr2';
- QUERY PLAN
- -----------------------------------------------------------------------------------------------------------------------
- Index Scan using test1_name_ind on test1 (cost=0.29..8.30rows=1 width=11) (actual time=0.023..0.024rows=1 loops=1)
- Index Cond: ((v_name)::text ='usr2'::text)
- Planning Time: 0.055 ms
- Execution Time: 0.038 ms
- (4rows)
二、模拟数据文件故障
1、查看索引文件存储路径
- prod=# select pg_relation_filepath('test1_name_ind');
- pg_relation_filepath
- ----------------------
- base/16385/26800
- (1row)
2、模拟数据文件被破坏
- [kingbase@node102 data]$ ls -lh base/16385/26800
- -rw------- 1 kingbase kingbase 240K Nov 1715:01 base/16385/26800
-
- [kingbase@node102 data]$ dd if=/dev/zero of=/data/kingbase/v8r6_c6/data/base/16385/26800 bs=8k count=22+0 records in2+0 records out
- 16384 bytes (16 kB) copied, 0.000147959 s, 111 MB/s
-
- [kingbase@node102 data]$ ls -lh base/16385/26800
- -rw------- 1 kingbase kingbase 16K Nov 1715:04 base/16385/26800# 如下所示索引故障导致表访问错误
- prod=# select * from test1;ERROR: index "test1_name_ind" contains unexpected zero page at block 0HINT: Please REINDEX it.
三、重建索引解决故障
1、查看表索引信息
- prod=# \d+ test1;
- Table"public.test1"Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
- --------+---------+-----------+----------+---------+----------+--------------+-------------
- id | integer | | not null | | plain | |
- v_name | varchar | | | | extended | |
- Indexes:
- "test1_pkey"PRIMARYKEY, btree (id)
- "test1_name_ind" btree (v_name)
- Access method: heap
2、重建索引
- # 索引重建
- prod=# reindex index test1_name_ind;
- REINDEX
-
- #如下所示,重建索引后表数据访问正常
- prod=# select*from test1 limit 3;
- id | v_name
- ----+--------1| usr1
- 2| usr2
- 3| usr3
- (3rows)
-
- prod=# select*from test1 where v_name='usr2';
- id | v_name
- ----+--------2| usr2
- (1row)
-
- prod=# explain analyze select*from test1 where v_name='usr2';
- QUERY PLAN
- -----------------------------------------------------------------------------------------------------------------------
- Index Scan using test1_name_ind on test1 (cost=0.29..8.30rows=1 width=11) (actual time=0.023..0.024rows=1 loops=1)
- Index Cond: ((v_name)::text ='usr2'::text)
- Planning Time: 0.055 ms
- Execution Time: 0.038 ms
- (4rows)
四、总结
对于KingbaseES数据库,索引块的损坏会影响到表数据的正常访问,对于索引块故障处理比较简单,直接重建索引一般都可以解决此类问题。