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>

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh