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