在自動資料清理執行時重新為資料表建立索引 - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在自動資料清理執行時重新為資料表建立索引

如果索引毀損,自動資料清理會繼續處理資料表並且失敗。如果您在此情況下嘗試手動清理,則會收到如下錯誤訊息。

postgres=> vacuum freeze pgbench_branches; ERROR: index "pgbench_branches_test_index" contains unexpected zero page at block 30521 HINT: Please REINDEX it.

當索引毀損且自動資料清理嘗試在資料表上執行時,您全力應付已在執行中的自動資料清理工作階段。當您發出REINDEX命令時,您會在資料表上擷取專屬鎖定。寫入操作遭到封鎖,也使用特定索引讀取操作。

在資料表上執行自動資料清理時重新為資料表建立索引
  1. 對包含要清理之資料表的資料庫,開啟兩個工作階段。在第二個工作階段中,如果連線中斷,請使用 "screen" 或其他公用程式來維持此工作階段。

  2. 在工作階段 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;
  3. 在第二個工作階段中,發出 reindex 命令。

    \timing on Timing is on. reindex index pgbench_branches_test_index; REINDEX Time: 9.966 ms
  4. 在第一個工作階段中,如果自動資料清理封鎖處理程序,您會在 pg_stat_activity 中看見清理工作階段的等待為 "T"。在此情況下,您就結束自動資料清理程序。

    SELECT pg_terminate_backend('the_pid');

    此時,您的工作階段會開始。請特別注意,自動資料清理會立即重新啟動,因為此資料表可能排在其工作清單的最前面。

  5. 在第二個工作階段中啟動您的命令,然後在第一個工作階段中結束自動資料清理程序。