REINDEX

REINDEX —重建索引

Synopsis

REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } name

Description

REINDEX使用存储在索引表中的数据重建索引,替换索引的旧副本。在几种情况下可以使用REINDEX

Parameters

Notes

如果您怀疑用户表上的索引损坏,则可以使用REINDEX INDEXREINDEX TABLE来重建该索引或表上的所有索引。

如果需要从系统表上的索引损坏中恢复,事情会变得更加困难。在这种情况下,重要的是系统不要使用任何可疑索引本身。 (实际上,在这种情况下,您可能会发现服务器进程由于依赖于损坏的索引而在启动时立即崩溃.)为了安全地恢复,必须使用-P选项启动服务器,以防止其使用系统目录查找的索引。

一种方法是关闭服务器,并使用命令行中包含的-P选项启动单用户 PostgreSQL 服务器。然后,可以发出REINDEX DATABASEREINDEX SYSTEMREINDEX TABLEREINDEX INDEX,这取决于您要重构多少。如有疑问,请使用REINDEX SYSTEM选择重建数据库中所有系统索引。然后退出单用户服务器会话并重新启动常规服务器。有关如何与单用户服务器界面进行交互的更多信息,请参见postgres参考页。

或者,可以使用其命令行选项中包含的-P来启动常规服务器会话。这样做的方法因 Client 端而异,但是在所有基于 libpq 的 Client 端中,可以在启动 Client 端之前将PGOPTIONS环境变量设置为-P。请注意,尽管此方法不需要锁定其他 Client 端,但在完成修复之前,防止其他用户连接到损坏的数据库可能仍然是明智的选择。

REINDEX与删除索引和重新创建索引相似,因为索引内容是从头开始重建的。但是,锁定注意事项却大不相同。 REINDEX锁定对索引的父表的写入但不对其进行读取。它还对正在处理的特定索引采取排他锁,这将阻止尝试使用该索引的读取。相反,DROP INDEX暂时在父表上获得排他锁,同时阻止写入和读取。随后的CREATE INDEX锁定写但不读;由于索引不存在,因此不会进行任何读取尝试,这意味着不会有阻塞,但可能会将读取强制进行昂贵的 Sequences 扫描。

重新索引单个索引或表要求是该索引或表的所有者。重新编制架构或数据库的索引要求是该架构或数据库的所有者。请注意,因此有时非超级用户可以重建其他用户拥有的表的索引。但是,作为一个特殊的 exception,当非超级用户发出REINDEX DATABASEREINDEX SCHEMAREINDEX SYSTEM时,除非用户拥有该目录,否则将跳过共享目录上的索引(通常情况并非如此)。当然,超级用户可以随时重新索引任何内容。

不支持重新索引分区表或分区索引。每个单独的分区都可以分别重新索引。

Examples

重建一个索引:

REINDEX INDEX my_index;

重建表my_table上的所有索引:

REINDEX TABLE my_table;

在不信任系统索引已经有效的情况下,重建特定数据库中的所有索引:

$ export PGOPTIONS="-P"
$ psql broken_db
...
broken_db=> REINDEX DATABASE broken_db;
broken_db=> \q

Compatibility

SQL 标准中没有REINDEX命令。

上一章 首页 下一章