postgresql-9.4.1索引文件丢失

postgresql-9.4.1索引文件丢失,应该是一个小BUG。具体模拟重现,看代码:

1、创建一个新的表空间:

postgres=# CREATE TABLESPACE mytbs LOCATION '/data/pg94/mytbs';
CREATE TABLESPACE

2、创建表和索引,都放在pg_default表空间内

postgres=# create table t(id int, msg text);
CREATE TABLE
postgres=# create index idx_t_id on t(id);
CREATE INDEX
postgres=# insert into t values(1, 'a'), (2, 'b');
INSERT 0 2
postgres=# select * from t;
 id | msg 
----+-----
  1 | a
  2 | b
(2 rows)

3、设置默认表空间为mytbs,并变更ID字段类型

postgres=# set default_tablespace = 'mytbs';
SET  
postgres=# alter table t alter COLUMN id set data type int;
ALTER TABLE
postgres=# select * from t;
ERROR:  could not open file "pg_tblspc/16550/PG_9.4_201409291/13003/16564": 没有那个文件或目录
postgres=# select pg_relation_filepath('idx_t_id');
             pg_relation_filepath             
----------------------------------------------
 pg_tblspc/16550/PG_9.4_201409291/13003/16564
(1 row)

查询报错,索引文件丢失。

原因分析:因为ID字段上有索引,而变更ID字段类型需要重建索引。此时默认表空间不是原来的表空间,数据字典中记录的新索引文件的目录在新的表空间中,而新的表空间中并没有创建索引文件。

算是PG9.4.1的一个BUG,应用时注意这种情况发生。解决方法:

postgres=# reindex index idx_t_id;
REINDEX
postgres=# select * from t;
 id | msg 
----+-----
  1 | a
  2 | b
(2 rows)











你可能感兴趣的:(postgresql-9.4.1索引文件丢失)