REINDEX(7)

NAME
REINDEX - 重建索引

SYNOPSIS

REINDEX { DATABASE | TABLE | INDEX } name [ FORCE ]

DESCRIPTION 描述

REINDEX 基于存储在表上的数据重建索引， 替换旧的索引拷贝。使用 REINDEX 有两个主要原因：

•
     索引崩溃，并且不再包含有效的数据。尽管理论上这是不可能发生的， 但实际上索引会因为软件毛病或者硬件问题而崩溃。REINDEX 提供了一个恢复方法。

•   要处理的索引包含大量无用的索引页未被回收。在某些情况下， 这个问题会发生 在 PostgreSQL 里面的 B-树索引上。REINDEX 提供了一个缩小索引空间消耗的方 法，它采用的方法是写一个不带无用索引页的新版本的索引。 参阅Section 21.2 ``Routine Indexing'' 获取更多信息。

PARAMETERS 参数

DATABASE
     恢复一个声明了的数据库的所有系统索引。 不包含用户表上的索引。同样，除非在独立运行模式下，也会忽略在共享系统表上的索引（见下文）。

TABLE
     重新建立声明的表的所有索引。如果表有个从属的"TOAST"表，那么这个表也会重新索引。

INDEX
     重新建立声明了的索引。

name
     要重建的所声明的数据库/表/索引的名称。 表和索引名可以有模式修饰。

FORCE
     这是一个废弃的选项，如果声明，会被忽略。

NOTES 注意

 如果你怀疑一个用户表上的索引崩溃了，你可以简单地重建该索引， 或者该表上地所有索引，使用 REINDEX INDEX 或者 REINDEX TABLE。 另外一个对付用户表索引崩溃的方法时删除然后重建它。如果你还要在表上进行一些维护动作， 可能这么做更好一些。REINDEX 在表上请求排他锁，而 CREATE INDEX 只是锁住写动作， 而不会锁住读。

 如果你从一个崩溃的系统表索引上恢复，事情会更棘手一些。 这种情况下，系统必须不能使用任何有疑问的索引。 （实际上，在这种情况下，你可能发现服务器进程在启动之后马上就崩溃了， 因为依赖于崩溃了的索引。）要想安全恢复，服务器必须带着 -P 选项启动， 它禁止服务器在查找系统表的时候使用索引。

 这么做个一个办法事停止 postmaster 然后带着 -P 命令行选项启动一个独立的 PostgreSQL 服务器。 然后，根据你希望恢复的程度，可以发出 REINDEX DATABASE，REINDEX TABLE，或者 REINDEX INDEX。 如果还有怀疑，使用 REINDEX DATABASE 选择重新构造数据库中全部的系统索引。 然后退出独立服务器会话并且重启普通的服务器。参阅 postgres(1) 手册页获取有关如何与独立服务器交互的信息。

 另外，一个普通的会话可以在其命令行选项里带着 -P 启动。 这么做的方法因不同的客户端而异，但是在所有基于 libpq 的客户端上， 我们都可以通过在启动客户端之前设置 PGOPTIONS 环境变量为 -P 来实现。 请注意尽管这个方法并不要求锁住其它客户端，但是禁止其它客户端连接受损的数据库， 直到完成修补应该事一个明智的选择。

 如果怀疑任何共享的系统表的索引损坏（(pg_database， pg_group，或者 pg_shadow）， 那么必须用独立服务器的方式来修复它。REINDEX 不能在多用户环境下处理共享系统表。

 除了共享系统表之外的所有索引，REINDEX 是抗崩溃并且是事务安全的。 REINDEX 对于共享的索引而言不是抗崩溃的，这就是为什么不允许在正常操作中这么使用的原因。 如果在重新对一个共享表进行索引的时候发生了崩溃，那么在纠正问题之前，就不可能重新启动普通的服务器。 （一个建立了一部分的共享索引的典型症状是"index is not a btree/索引不是 btree 索引"错误。）

 在 PostgreSQL 7.4 之前，REINDEX TABLE 并不自动处理 TOAST 表，因此这些表必须用独立的命令进行处理。这么做仍然可以，但是已经多余了。

EXAMPLES 例子

 重建表 mytable 上的索引：

REINDEX TABLE my_table;

 重建单个索引：

REINDEX INDEX my_index;

 重建一个数据库上的所有系统索引，不管他们是否有效：

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

COMPATIBILITY 兼容性

 在SQL 标准里没有 REINDEX。

译者
Postgresql 中文网站 何伟平 <laser@pgsqldb.org>