本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在自動資料清理執行時重新為資料表建立索引
如果索引毀損,自動資料清理會繼續處理資料表並且失敗。如果您在此情況下嘗試手動清理,則會收到如下錯誤訊息。
postgres=>
vacuum freeze pgbench_branches;
ERROR: index "pgbench_branches_test_index" contains unexpected zero page at block 30521 HINT: Please REINDEX it.
當索引毀損且自動資料清理嘗試在資料表上執行時,您全力應付已在執行中的自動資料清理工作階段。當您發出REINDEX
在資料表上執行自動資料清理時重新為資料表建立索引
-
對包含要清理之資料表的資料庫,開啟兩個工作階段。在第二個工作階段中,如果連線中斷,請使用 "screen" 或其他公用程式來維持此工作階段。
-
在工作階段 1 中,取得在資料表上執行PID的自動清空工作階段的 。
執行下列查詢,以取得自動清空工作階段PID的 。
SELECT datname, usename, pid, current_timestamp - xact_start AS xact_runtime, query FROM pg_stat_activity WHERE upper(query) like '%VACUUM%' ORDER BY xact_start;
-
在第二個工作階段中,發出 reindex 命令。
\timing on
Timing is on.
reindex index pgbench_branches_test_index;
REINDEX Time: 9.966 ms
-
在第一個工作階段中,如果自動資料清理封鎖處理程序,您會在
pg_stat_activity
中看見清理工作階段的等待為 "T"。在此情況下,您就結束自動資料清理程序。SELECT pg_terminate_backend('the_pid');
此時,您的工作階段會開始。請特別注意,自動資料清理會立即重新啟動,因為此資料表可能排在其工作清單的最前面。
-
在第二個工作階段中啟動您的命令,然後在第一個工作階段中結束自動資料清理程序。