REINDEX { DATABASE | TABLE | INDEX } name [ FORCE ]
REINDEX 用于重建损坏了的系统索引. 尽管理论上这种情况决不应该发声,但实际上索引可能因为软件臭虫 或者硬件失效而损坏.REINDEX 提供了一种恢复手段.
如果你怀疑一个索引在某用户表上崩溃了,那么你可以简单地重建 该索引,或者重建该表的所有索引,用 REINDEX INDEX 或者 REINDEX TABLE 命令.
注意: 另外一个处理崩溃了的用户表索引是删除然后重建它. 如果你同时还要维持一些在该表上表面的操作,那么这个方法可能更好. REINDEX 在表上施加排它的锁,而 CREATE INDEX 只锁住写,而不会限止对表的读取操作.
如果你想从一个系统表造成的崩溃中恢复,那么问题就更复杂一些. 在这种情况下,避免在做恢复的后端使用怀疑受损的索引本身是非常重要的. (实际上,在这种情况下,你可能会发现后端启动后马上就崩溃了, 因为它们倚赖于这些已经崩溃的索引.)为了安全地恢复,你必需关闭 postmaster,然后运行一个独立运行的 PostgreSQL 后端,给予它命令行参数 -O 和 -P (这些选项分别是允许对系统表进行修改 并且避免了系统索引的使用).然后发出 REINDEX DATABASE, REINDEX TABLE,或者 REINDEX INDEX, 命令,具体取决于你想重新构造多少东西.如果觉得有疑问,那么 用 REINDEX DATABASE FORCE 强制重建数据库中所有系统表. 然后退出独立运行的后端,重启 postmaster.
因为这种情况可能是大多数用户可能用到独立运行的后端的唯一机会, 那么我们必需事先知道一些用法在顺序上的注意事项∶
用下面这样的命令启动后端
postgres -D $PGDATA -O -P my_database
用 -D 给数据库区域提供正确的路径, 或者确保设置了环境变量 PGDATA.还要声明你想操作 的数据库名字.
你可以发出任何 SQL 命令,不仅仅是 REINDEX.
要注意独立运行的后端把换行符当做命令输入终止符; 它可不懂分号是什么东西,分号是 psql 里的东西. 要令一条命令跨多个行,你必需在除最后一个换行符之外的 每个换行符之前键入一个反斜杠. 同样,你也没有任何 readline 处理的便利可用(比如,没有命令历史).
要退出后端,键入 EOF(通常是 control-D).
参阅 postgres 手册页获取更多信息.