本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
判斷自動資料清理目前是否執行中且執行多久時間
如果您需要手動清理資料表,請判斷目前是否在執行自動資料清理功能。如果是,您可能需要調整參數,使其更有效率地執行,或暫時關閉自動清空,以便手動執行 VACUUM。
使用以下查詢來判斷自動資料清理是否執行中、已執行多久時間,以及是否正等待另一個工作階段。
SELECT datname, usename, pid, state, wait_event, current_timestamp - xact_start AS xact_runtime, query FROM pg_stat_activity WHERE upper(query) LIKE '%VACUUM%' ORDER BY xact_start;
在執行此查詢之後,您應會看到類似底下的輸出:
datname | usename | pid | state | wait_event | xact_runtime | query --------+----------+-------+--------+------------+-------------------------+-------------------------------------------------------------------------------------------------------- mydb | rdsadmin | 16473 | active | | 33 days 16:32:11.600656 | autovacuum: VACUUM ANALYZE public.mytable1 (to prevent wraparound) mydb | rdsadmin | 22553 | active | | 14 days 09:15:34.073141 | autovacuum: VACUUM ANALYZE public.mytable2 (to prevent wraparound) mydb | rdsadmin | 41909 | active | | 3 days 02:43:54.203349 | autovacuum: VACUUM ANALYZE public.mytable3 mydb | rdsadmin | 618 | active | | 00:00:00 | SELECT datname, usename, pid, state, wait_event, current_timestamp - xact_start AS xact_runtime, query+ | | | | | | FROM pg_stat_activity + | | | | | | WHERE query like '%VACUUM%' + | | | | | | ORDER BY xact_start; +
有幾個問題可能造成長時間執行自動資料清理階段 (長達數天)。最常見的問題就是資料表大小或更新率的 maintenance_work_mem
建議您依照下列公式來設定 maintenance_work_mem
參數值。
GREATEST({DBInstanceClassMemory/63963136*1024},65536)
短時間執行的自動資料清理工作階段也可以指出問題:
-
它可指出您的工作負載沒有足夠的
autovacuum_max_workers
。在此情況下,您需要指出工作者數目。 -
它可指出有索引損毀 (自動資料清理會當機並以相同的關聯重新啟動,但沒有任何進度)。在這種情況下,請手動執行
vacuum freeze verbose
來查看確切原因。table