本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
執行手動清理凍結
您可以在清理程序已在執行中的資料表上執行手動清理。如果您已辨識出表單的交易將近 20 億 (或超出您所監控的任何閾值) 的資料表,此功能將很實用。
下列步驟是準則,而程序會有多種變化。例如,在測試期間,假設您會發現 maintenance_work_mem
maintenance_work_mem
參數設定,但您也需要採取立即動作並清理有問題的資料表。以下程序說明在此情況下的處理方式。
手動執行清理凍結
-
對包含要清理之資料表的資料庫,開啟兩個工作階段。在第二個工作階段中,如果連線中斷,請使用 "screen" 或其他公用程式來維持此工作階段。
-
在工作階段 1 中,取得在資料表上執行的自動清空工作階段的程序 ID (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;
-
在第二個工作階段中,計算您需要用於此作業的記憶體數量。在此範例中,我們判斷我們可以將最多 2 GB 的記憶體使用於此作業,所以將目前工作階段的
maintenance_work_mem
設定為 2 GB。 SET maintenance_work_mem='2 GB';
SET
-
在第二個工作階段中,對表格發佈
vacuum freeze verbose
指令。詳細設定很有用,因為雖然 PostgreSQL 中目前沒有此項目的進度報告,但您可以看到活動。\timing on
Timing is on.
vacuum freeze verbose pgbench_branches;
INFO: vacuuming "public.pgbench_branches" INFO: index "pgbench_branches_pkey" now contains 50 row versions in 2 pages DETAIL: 0 index row versions were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: index "pgbench_branches_test_index" now contains 50 row versions in 2 pages DETAIL: 0 index row versions were removed. 0 index pages have been deleted, 0 are currently reusable. CPU 0.00s/0.00u sec elapsed 0.00 sec. INFO: "pgbench_branches": found 0 removable, 50 nonremovable row versions in 43 out of 43 pages DETAIL: 0 dead row versions cannot be removed yet. There were 9347 unused item pointers. 0 pages are entirely empty. CPU 0.00s/0.00u sec elapsed 0.00 sec. VACUUM Time: 2.765 ms
-
在第一個工作階段,如果自動資料清理封鎖清理工作階段,您會在
pg_stat_activity
中看見清理工作階段的等待為 "T"。在此情況下,您需要按如下方式結束自動資料清理程序。SELECT pg_terminate_backend('the_pid');
此時,您的工作階段會開始。請特別注意,自動資料清理會立即重新啟動,因為此資料表可能排在其工作清單的最前面。
-
在第二個工作階段中啟動您的
vacuum freeze verbose
命令,然後在第一個工作階段中結束自動資料清理程序。