Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek poskytuje přehled funkce automatického vakua pro Službu Azure Database for PostgreSQL a průvodce pro odstranění potíží, které jsou k dispozici pro monitorování nadbytečných dat v databázi a blokátorů automatického vakua. Poskytuje také informace o tom, jak daleko je databáze od stavu nouze nebo stavu kritického zaplnění.
Poznámka:
Tento článek se zabývá laděním automatického úklidu pro všechny podporované verze PostgreSQL na flexibilním serveru Azure Database for PostgreSQL. Některé uvedené funkce jsou specifické pro verzi (například vacuum_buffer_usage_limit pro PostgreSQL 16 a novější a autovacuum_vacuum_max_threshold pro PostgreSQL 18 a novější).
Co je autovacuum?
Autovacuum je proces na pozadí PostgreSQL, který automaticky vyčistí mrtvé řazené kolekce členů a aktualizuje statistiky. Pomáhá udržovat výkon databáze automatickým spouštěním dvou klíčových úloh údržby:
- VACUUM – Uvolní místo v souborech databáze odebráním mrtvých záznamů a označením tohoto místa jako znovu použitelného PostgreSQL. Nemusí nutně snížit fyzickou velikost souborů databáze na disku. Pokud chcete vrátit místo do operačního systému, použijte operace, které přepíší tabulku (například VAKUUM FULL nebo pg_repack), které mají další aspekty, jako jsou exkluzivní zámky nebo časové intervaly údržby.
- ANALYZE – Shromažďuje statistiky tabulek a indexů, které plánovač dotazů PostgreSQL používá k výběru efektivních plánů provádění.
Chcete-li zajistit, aby autovacuum fungoval správně, nastavte parametr serveru autovacuum na ONhodnotu . Když je tato možnost povolená, PostgreSQL se automaticky rozhodne, kdy se má v tabulce spustit vakuum nebo ANALYZOVAT, aby databáze zůstala efektivní a optimalizovaná.
Interní funkce automatického úklidu
Funkce Autovacuum prochází stránky a hledá mrtvé řádky. Pokud nenajde žádné mrtvé záznamy, autovakuum stránku zahodí. Když autovacuum najde mrtvé řazené kolekce členů, odebere je. Náklady vycházejí z následujících parametrů:
| Parametr | Popis |
|---|---|
vacuum_cost_page_hit |
Náklady na čtení stránky, která už je ve sdílených vyrovnávacích pamětích a nepotřebuje čtení disku. Výchozí hodnota je 1. |
vacuum_cost_page_miss |
Náklady na načtení stránky, která není ve sdílených vyrovnávacích pamětích. Výchozí hodnota je 10. |
vacuum_cost_page_dirty |
Náklady na zápis na stránku, když jsou v ní nalezeny mrtvé řazené řazené kolekce členů. Výchozí hodnota je 20. |
Množství práce, které autovacuum provádí, závisí na dvou parametrech:
| Parametr | Popis |
|---|---|
autovacuum_vacuum_cost_limit |
Množství práce autovacuum dělá na jednom místě. |
autovacuum_vacuum_cost_delay |
Počet milisekund, které autovacuum spí po dosažení limitu nákladů určeného parametrem autovacuum_vacuum_cost_limit |
Ve všech aktuálně podporovaných verzích PostgreSQL je výchozí hodnota autovacuum_vacuum_cost_limit 200 (ve skutečnosti je nastavena na hodnotu -1, která se rovná hodnotě běžného vacuum_cost_limit, což je ve výchozím nastavení 200).
Výchozí hodnota pro autovacuum_vacuum_cost_delay 2 milisekundy v PostgreSQL verze 12 a novější (ve verzi 11 byla 20 milisekund).
Limit využití vyrovnávací paměti (PostgreSQL 16+)
Počínaje PostgreSQL verze 16 můžete pomocí parametru vacuum_buffer_usage_limit řídit využití paměti během operací VAKUA, ANALYZE a autovacuum.
| Parametr | Popis |
|---|---|
vacuum_buffer_usage_limit |
Nastaví velikost fondu vyrovnávací paměti pro operace VAKUA, ANALYZE a autovacuum. Tento parametr omezuje množství sdílené mezipaměti vyrovnávací paměti, kterou mohou tyto operace používat, a brání jim v využívání nadměrných paměťových prostředků. |
Tento parametr pomáhá zabránit VACUUM a automatickému čištění vysouvání příliš mnoha užitečných stránek ze sdílených vyrovnávacích pamětí, což může zlepšit celkový výkon databáze během operací údržby. Výchozí hodnota je obvykle nastavena na shared_buffers základě a můžete ji nakonfigurovat tak, aby výkon vakua vyrovnával s potřebami běžných databázových operací.
Maximální prahová hodnota pro autovacuum (PostgreSQL 18+)
Počínaje PostgreSQL verze 18 můžete pomocí autovacuum_vacuum_max_threshold parametru nastavit horní limit počtu aktualizací řazené kolekce členů nebo odstranit, které aktivují automatické úklidy.
| Parametr | Popis |
|---|---|
autovacuum_vacuum_max_threshold |
Nastaví maximální počet aktualizací nebo odstranění n-tic před spuštěním vakua. Pokud je nastavená hodnota -1, maximální prahová hodnota je zakázaná. Tento parametr použijte k vyladění kontroly nad automatickým úklidem aktivovaným u velmi velkých tabulek. |
Tento parametr je zvlášť užitečný pro velké tabulky, kde výchozí spouštění založené na faktoru měřítka může způsobit, že autovacuum čeká příliš dlouho na spuštění.
Autovacuum se probudí 50krát (50*20 ms=1000 ms) každou sekundu. Pokaždé, když se vzbudí, autovacuum čte 200 stránek.
To znamená, že v jedné sekundě může autovacuum dělat:
- ~80 MB/s [ (200 stran/
vacuum_cost_page_hit) * 50 × 8 kB na stránku] pokud jsou všechny stránky s mrtvými řazenými kolekcemi členů nalezeny ve sdílených vyrovnávacích pamětích. - ~8 MB/s [ (200 stran/
vacuum_cost_page_miss) * 50 × 8 kB na stránku] pokud se všechny stránky s mrtvými řazenými kolekcemi členů čtou z disku. - ~4 MB/s [ (200 stran/
vacuum_cost_page_dirty) * 50 × 8 kB na stránku] autovacuum může zapisovat až 4 MB/s.
Monitorování automatického úklidu
Azure Database for PostgreSQL poskytuje následující metriky pro monitorování automatického úklidu.
Metriky autovacuum lze využít k monitorování a optimalizaci výkonu autovacuum pro flexibilní server Azure Database for PostgreSQL. Každá metrika se vygeneruje v 30minutovém intervalu a má až 93 dnů uchování. Můžete vytvářet výstrahy pro konkrétní metriky a data metrik můžete rozdělit a filtrovat pomocí DatabaseName dimenze.
Jak aktivovat metriky autovacuum
- Metriky automatického úklidu jsou ve výchozím nastavení vypnuté.
- Pokud chcete tyto metriky povolit, nastavte parametr
metrics.autovacuum_diagnosticsserveru naONhodnotu . - Tento parametr je dynamický, takže se nevyžaduje restartování instance.
Seznam metrik autovacua
| Zobrazované jméno | ID metriky | Jednotka | Popis | Dimenze | Povoleno ve výchozím nastavení |
|---|---|---|---|---|---|
| Analýza tabulek uživatelů čítače | analyze_count_user_tables |
Počet | Kolikrát byly v této databázi ručně analyzovány tabulky pouze uživatelem. | Název databáze | Ne |
| Čítače uživatelských tabulek AutoAnalyze | autoanalyze_count_user_tables |
Počet | Počet, kolikrát byly tabulky pouze pro uživatele analyzovány démonem automatické údržby v této databázi. | Název databáze | Ne |
| Uživatelské tabulky čítačů AutoVacuum | autovacuum_count_user_tables |
Počet | Počet, kolikrát byly tabulky pouze pro uživatele v této databázi vyčištěny démonem automatického čištění. | Název databáze | Ne |
| Bloat Percent (Preview) | bloat_percent |
Procento | Odhadované procento nafouknutí pouze pro uživatelské tabulky. | Název databáze | Ne |
| Odhadované prázdné řádky – uživatelské tabulky | n_dead_tup_user_tables |
Počet | Odhadovaný počet mrtvých řádků pro tabulky pouze pro uživatele v této databázi. | Název databáze | Ne |
| Odhadovaný počet aktuálních řádků v uživatelských tabulkách | n_live_tup_user_tables |
Počet | Odhadovaný počet živých řádků pro tabulky určené pouze pro uživatele v této databázi. | Název databáze | Ne |
| Odhadované úpravy uživatelských tabulek | n_mod_since_analyze_user_tables |
Počet | Odhadovaný počet řádků, které byly změněny od poslední analýzy tabulek obsahujících pouze data uživatelů. | Název databáze | Ne |
| Analyzované uživatelské tabulky | tables_analyzed_user_tables |
Počet | Počet tabulek pouze uživatelů, které byly v této databázi analyzovány. | Název databáze | Ne |
| Automatické analyzované uživatelské tabulky | tables_autoanalyzed_user_tables |
Počet | Počet pouze uživatelských tabulek, které byly analyzovány autovacuum démonem v této databázi. | Název databáze | Ne |
| Tabulky uživatelů – automaticky vyprázdněné | tables_autovacuumed_user_tables |
Počet | Počet uživatelských tabulek, které byly očištěny démonem automatického čištění v této databázi. | Název databáze | Ne |
| Čítač uživatelských tabulek | tables_counter_user_tables |
Počet | Počet tabulek určených pouze pro uživatele v této databázi. | Název databáze | Ne |
| Uživatelské tabulky byly vyčištěny | tables_vacuumed_user_tables |
Počet | Počet pouze uživatelských tabulek, které byly v této databázi očištěny. | Název databáze | Ne |
| Uživatelské tabulky vakuového čítače | vacuum_count_user_tables |
Počet | Počet tabulek určených pouze pro uživatele, které byly v této databázi manuálně optimalizovány (nepočítá se VACUUM FULL). |
Název databáze | Ne |
Úvahy o používání metrik autovacuum
- Metriky autovakuových procesů, které používají dimenzi DatabaseName, mají limit 30 databází.
- U SKU typu Burstable je limit 10 databází pro metriky, které používají dimenzi DatabaseName.
- Pro sloupec OID se použije limit dimenze DatabaseName, který odpovídá pořadí vytvoření databáze.
Další informace najdete v tématu Metriky automatického čištění.
K monitorování automatického úklidu použijte následující dotazy:
select schemaname,relname,n_dead_tup,n_live_tup,round(n_dead_tup::float/n_live_tup::float*100) dead_pct,autovacuum_count,last_vacuum,last_autovacuum,last_autoanalyze,last_analyze from pg_stat_all_tables where n_live_tup >0;
Následující sloupce vám pomohou určit, zda autovacuum zvládá držet krok s aktivitou tabulky:
| Parametr | Popis |
|---|---|
dead_pct |
Procento mrtvých řazených kolekcí členů ve srovnání s živými řazené kolekcemi členů. |
last_autovacuum |
Datum posledního automatického úklidu tabulky. |
last_autoanalyze |
Datum poslední analýzy tabulky. |
Aktivace automatického úklidu
Akce autovacuum (ANALYZE nebo VACUUM) se aktivuje, když počet mrtvých tuple překročí určité číslo. Toto číslo závisí na dvou faktorech: celkový počet řádků v tabulce a pevné prahové hodnoty. Funkce ANALYZE se ve výchozím nastavení aktivuje, když dojde k 10% změn v tabulce plus 50 změn řádků, zatímco VACUUM se aktivuje, když dojde k 20% změn v tabulce plus 50 změn řádků. Vzhledem k tomu, že prahová hodnota vakua je dvakrát tak vysoká jako prahová hodnota ANALYZE , aktivuje funkce ANALYZE dříve než vakuum.
Pro PostgreSQL verze 13 a novější se funkce ANALYZE ve výchozím nastavení aktivuje, když dojde k 20% tabulky plus 1 000 vložení řádků.
Přesné rovnice pro každou akci jsou:
- Autoanalyze = autovacuum_analyze_scale_factor * tuply + autovacuum_analyze_threshold nebo autovacuum_vacuum_insert_scale_factor * tuply + autovacuum_vacuum_insert_threshold (pro PostgreSQL verze 13 a novější)
- Autovacuum = autovacuum_vacuum_scale_factor * řazené kolekce členů + autovacuum_vacuum_threshold
Pokud máte například tabulku s 100 řádky, zobrazí se při aktivaci akcí analýzy a vakua následující rovnice:
Aktualizace a odstranění: Autoanalyze = 0.1 * 100 + 50 = 60Autovacuum = 0.2 * 100 + 50 = 70
ANALYZE se spouští po změně 60 řádků v tabulce a VACUUM se spouští při změně 70 řádků v tabulce.
Pro vložení: Autoanalyze = 0.2 * 100 + 1000 = 1020
Se spustí ANALYZE po vložení 1 020 řádků do tabulky.
Tady je popis parametrů použitých v rovnici:
| Parametr | Popis |
|---|---|
autovacuum_analyze_scale_factor |
Procento insertů, aktualizací a smazání, které spustí ANALYZE na tabulce. |
autovacuum_analyze_threshold |
Minimální počet vložených, aktualizovaných nebo odstraněných záznamů pro ANALYZE tabulku. |
autovacuum_vacuum_insert_scale_factor |
Procento vložení, které aktivuje funkci ANALYZE v tabulce |
autovacuum_vacuum_insert_threshold |
Minimální počet řádků vložených do tabulky pro ANALYZE |
autovacuum_vacuum_scale_factor |
Procento aktualizací a mazání, které spouští VACUUM na tabulce. |
Pomocí následujícího dotazu zobrazte seznam tabulek v databázi a identifikujte tabulky, které mají nárok na proces automatického úklidu:
SELECT *
,n_dead_tup > av_threshold AS av_needed
,CASE
WHEN reltuples > 0
THEN round(100.0 * n_dead_tup / (reltuples))
ELSE 0
END AS pct_dead
FROM (
SELECT N.nspname
,C.relname
,pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins
,pg_stat_get_tuples_updated(C.oid) AS n_tup_upd
,pg_stat_get_tuples_deleted(C.oid) AS n_tup_del
,pg_stat_get_live_tuples(C.oid) AS n_live_tup
,pg_stat_get_dead_tuples(C.oid) AS n_dead_tup
,C.reltuples AS reltuples
,round(current_setting('autovacuum_vacuum_threshold')::INTEGER + current_setting('autovacuum_vacuum_scale_factor')::NUMERIC * C.reltuples) AS av_threshold
,date_trunc('minute', greatest(pg_stat_get_last_vacuum_time(C.oid), pg_stat_get_last_autovacuum_time(C.oid))) AS last_vacuum
,date_trunc('minute', greatest(pg_stat_get_last_analyze_time(C.oid), pg_stat_get_last_autoanalyze_time(C.oid))) AS last_analyze
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind IN (
'r'
,'t'
)
AND N.nspname NOT IN (
'pg_catalog'
,'information_schema'
)
AND N.nspname !~ '^pg_toast'
) AS av
ORDER BY av_needed DESC ,n_dead_tup DESC;
Poznámka:
Tento dotaz nebere v úvahu, že autovacuum lze konfigurovat na úrovni jednotlivých tabulek pomocí příkazu "alter table".
Běžné problémy s automatickým úklidem
Projděte si následující seznam běžných problémů s procesem automatického úklidu.
Nedržte tempo s zaneprázdněným serverem
Proces automatického úklidu odhaduje náklady na každou vstupně-výstupní operaci, kumuluje celkový součet pro každou operaci, kterou provádí, a pozastaví se po dosažení horního limitu nákladů. Proces používá dva parametry serveru: autovacuum_vacuum_cost_delay a autovacuum_vacuum_cost_limit.
Ve výchozím nastavení je autovacuum_vacuum_cost_limit nastavena hodnota -1, což znamená, že limit nákladů na autovacuum používá stejnou hodnotu jako parametr vacuum_cost_limit. Výchozí hodnota je vacuum_cost_limit 200.
vacuum_cost_limit představuje náklady na ruční vakuum.
Pokud nastavíte autovacuum_vacuum_cost_limit na hodnotu -1, autovacuum použije parametr vacuum_cost_limit. Pokud nastavíte autovacuum_vacuum_cost_limit na hodnotu větší než -1, autovacuum použije parametr autovacuum_vacuum_cost_limit.
Pokud autovacuum nedrží krok, zvažte změnu následujících parametrů:
| Parametr | Popis |
|---|---|
autovacuum_vacuum_cost_limit |
Výchozí hodnota: 200. Můžete zvýšit limit nákladů. Monitorujte využití procesoru a vstupně-výstupních operací v databázi před a po provedení změn. |
autovacuum_vacuum_cost_delay |
PostgreSQL verze 12 a novější – výchozí: 2 ms. Můžete snížit tuto hodnotu pro, aby autovacuumovací proces fungoval agresivněji. |
vacuum_buffer_usage_limit |
PostgreSQL verze 16 a novější – Nastaví velikost fondu vyrovnávací paměti pro operace vakua a automatického úklidu. Úprava tohoto parametru může pomoct vyvážit výkon automatického úklidu s celkovým výkonem systému tím, že řídí, kolik mezipaměti sdílené vyrovnávací paměti se používá během vakuových operací. |
Poznámka:
- Hodnota
autovacuum_vacuum_cost_limitse distribuuje úměrně mezi aktivní pracovníky autovacu. Pokud existuje více než jeden pracovní proces, součet limitů každého pracovního procesu nepřekračuje hodnotu parametruautovacuum_vacuum_cost_limit. -
autovacuum_vacuum_scale_factorje další parametr, který může aktivovat vakuum v tabulce na základě akumulace mrtvých řádků. Výchozí hodnota:0.2, Povolený rozsah:0.05 - 0.1. Měřítko je specifické pro úlohy a mělo by se nastavit v závislosti na množství dat v tabulkách. Před změnou hodnoty prozkoumejte zatížení a jednotlivé svazky tabulek.
Automatické úklidové jednotky neustále běží
Pokud autovacuum běží nepřetržitě, může ovlivnit využití procesoru a I/O operací na serveru. Tady je několik možných důvodů:
maintenance_work_mem
Démon autovacuum používá autovacuum_work_mem, který je ve výchozím nastavení nastaven -1 . Toto výchozí nastavení znamená, že autovacuum_work_mem používá stejnou hodnotu jako maintenance_work_mem parametr. Tento článek předpokládá, že autovacuum_work_mem je nastaven na -1 a autovacuum démon používá maintenance_work_mem.
Pokud maintenance_work_mem je nízký, můžete ho zvýšit až o 2 GB v instanci flexibilního serveru Azure Database for PostgreSQL. Obecným pravidlem je přidělení 50 MB maintenance_work_mem pro každých 1 GB paměti RAM.
Velký počet databází
Funkce Autovacuum se pokusí spustit pracovní proces v každé databázi každých autovacuum_naptime sekund.
Pokud má například server 60 databází a autovacuum_naptime je nastavený na 60 sekund, spustí se pracovní proces automatického úklidu každou sekundu [autovacuum_naptime/počet databází].
Pokud je v clusteru více databází, zvyšte autovacuum_naptime. Současně proveďte proces automatického úklidu agresivněji zvýšením parametrů autovacuum_cost_limit a snížením parametrů autovacuum_cost_delay. Můžete také zvýšit autovacuum_max_workers výchozí hodnotu 3 na 4 nebo 5.
Chyby Nedostatek paměti
Příliš agresivní maintenance_work_mem hodnoty mohou v systému pravidelně způsobovat chyby nedostatku paměti. Než parametr změníte, seznamte se s dostupnou maintenance_work_mem pamětí RAM na serveru.
Autovacuum je příliš rušivé
Pokud autovacuum spotřebovává příliš mnoho prostředků, vyzkoušejte následující akce:
Parametry automatického úklidu
Vyhodnocení parametrů autovacuum_vacuum_cost_delay, autovacuum_vacuum_cost_limita autovacuum_max_workers. Nesprávné nastavení parametrů automatického úklidu může vést ke scénářům, kdy se autovacuum stává příliš rušivým.
Pokud je autovacuum příliš rušivé, zvažte následující akce:
- Pokud nastavíte vyšší hodnotu než výchozí hodnota 200, zvyšte
autovacuum_vacuum_cost_delayhodnotu a snižteautovacuum_vacuum_cost_limitji. - Snižte počet
autovacuum_max_workers, pokud ho nastavíte vyšší než výchozí hodnota 3.
Příliš mnoho pracovních procesů automatického úklidu
Zvýšení počtu pracovníků automatického úklidu nezvyšuje rychlost vakua. Nepoužívejte velký počet autovacuum pracovníků.
Zvýšení počtu pracovníků autovacuum vede k větší spotřebě paměti. V závislosti na hodnotě maintenance_work_memmůže dojít ke snížení výkonu.
Každý pracovní proces automatického úklidu získá (1/autovacuum_max_workers) z celkového autovacuum_cost_limitsoučtu, takže když bude mít vysoký počet pracovních procesů, každý z nich bude pomalejší.
Pokud zvýšíte počet pracovníků, zvyšte autovacuum_vacuum_cost_limit a/nebo snižte autovacuum_vacuum_cost_delay, aby byl vakuový proces rychlejší.
Pokud však nastavíte parametr na úrovni tabulky autovacuum_vacuum_cost_delay nebo parametry autovacuum_vacuum_cost_limit, pracovní procesy spuštěné na těchto tabulkách budou vyloučeny z posuzování v algoritmech pro vyvažování [autovacuum_cost_limit/autovacuum_max_workers].
Ochrana zalomení id transakce autovacuum (TXID)
Když databáze narazí na zalamovací ochranu ID transakce, zobrazí se chybová zpráva podobná následující chybě:
Database isn't accepting commands to avoid wraparound data loss in database 'xx'
Stop the postmaster and vacuum that database in single-user mode.
Poznámka:
Tato chybová zpráva je způsobená dlouhodobým opominutím. Obvykle nemusíte přepnout do režimu s jedním uživatelem. Místo toho můžete spustit požadované příkazy VACUUM a vyladit je tak, aby byly rychlejší. I když nemůžete spustit žádný jazyk pro manipulaci s daty (DML), můžete stále spouštět vakuum.
K problému wraparound dochází v případě, že databáze není vyčištěna, nebo když autovacuum neodstraní příliš mnoho mrtvých záznamů.
Mezi možné důvody tohoto problému patří následující důvody:
Úlohy s velkým zatížením
Náročné pracovní vytížení způsobí příliš mnoho mrtvých záznamů v krátkém období, což znesnadňuje, aby automatické úklidy dohonily. Mrtvé řazené řazené kolekce členů v systému se sčítají za určité období, což vede ke snížení výkonu dotazů a vede k zalomení situace. Jedním z důvodů, proč k této situaci dojít, může být to, že parametry automatického úklidu nejsou dostatečně nastavené a nedrží krok s zaneprázdněným serverem.
Dlouhotrvající transakce
Jakákoli dlouhotrvající transakce v systému neumožňuje autovacuum odstranit mrtvé záznamy. Jsou překážkou pro vakuový proces. Odebrání dlouhotrvajících transakcí uvolní mrtvé řazené kolekce členů pro odstranění při spuštění automatického úklidu.
Dlouhotrvající transakce lze zjistit pomocí následujícího dotazu:
SELECT pid, age(backend_xid) AS age_in_xids,
now () - xact_start AS xact_age,
now () - query_start AS query_age,
state,
query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY 2 DESC
LIMIT 10;
Připravené příkazy
Pokud jsou připravené příkazy, které nejsou potvrzeny, zabrání automatickému úklidu v odebrání mrtvých řazených kolekcí členů. Následující dotaz pomáhá najít nepotvrzené připravené příkazy:
SELECT gid, prepared, owner, database, transaction
FROM pg_prepared_xacts
ORDER BY age(transaction) DESC;
K potvrzení nebo vrácení těchto příkazů zpět použijte COMMIT funkci PREPARED nebo ROLLBACK PREPARED.
Nepoužité sloty replikace
Nepoužité sloty replikace brání automatickému úklidu v deklaraci mrtvých řazených kolekcí členů. Následující dotaz pomáhá identifikovat nevyužité sloty replikace:
SELECT slot_name, slot_type, database, xmin
FROM pg_replication_slots
ORDER BY age(xmin) DESC;
Slouží pg_drop_replication_slot() k odstranění nepoužívaných slotů replikace.
Když databáze narazí na zalamovací ochranu ID transakce, zkontrolujte všechny blokátory, jak jsme zmínili dříve, a odeberte blokátory ručně, aby automatické úklid pokračovaly a dokončily. Rychlost automatického úklidu můžete také zvýšit nastavením autovacuum_cost_delay na 0 a zvýšením autovacuum_cost_limit hodnoty větší než 200. Změny těchto parametrů se ale nevztahují na stávající pracovní procesy automatického úklidu. Pokud chcete použít změny parametrů, restartujte databázi nebo ukončete stávající pracovní procesy ručně.
Požadavky specifické pro tabulky
Pro jednotlivé tabulky můžete nastavit parametry automatického úklidu. Tato nastavení jsou obzvláště důležitá pro malé a velké tabulky. Například u malé tabulky, která obsahuje pouze 100 řádků, spustí autovacuum operaci VACUUM, když se změní 70 řádků (jak již bylo dříve vypočteno). Pokud tuto tabulku často aktualizujete, může se zobrazit stovky operací automatického úklidu za den. Tyto operace brání automatickému úklidu v údržbě jiných tabulek, kde procento změn není tak významné. Případně musí tabulka obsahující miliardu řádků změnit 200 milionů řádků, aby se aktivovaly operace automatického úklidu. Nastavení parametrů automatického úklidu odpovídajícím způsobem zabrání takovým scénářům.
Pokud chcete nastavit nastavení automatického úklidu pro každou tabulku, změňte parametry serveru, jak je znázorněno v následujících příkladech:
ALTER TABLE <table name> SET (autovacuum_analyze_scale_factor = xx);
ALTER TABLE <table name> SET (autovacuum_analyze_threshold = xx);
ALTER TABLE <table name> SET (autovacuum_vacuum_scale_factor = xx);
ALTER TABLE <table name> SET (autovacuum_vacuum_threshold = xx);
ALTER TABLE <table name> SET (autovacuum_vacuum_cost_delay = xx);
ALTER TABLE <table name> SET (autovacuum_vacuum_cost_limit = xx);
-- For PostgreSQL 16 and later:
ALTER TABLE <table name> SET (vacuum_buffer_usage_limit = 'xx MB');
Úlohy jen pro vložení
V PostgreSQL verzích 13 a starších se funkce autovacuum nespustí u tabulek se zátěží pouze na vkládání, protože neexistují žádné mrtvé záznamy a žádné volné místo, které je potřeba obnovit. Automatická analýza se ale spouští pro úlohy jen pro vložení, protože existují nová data. Nevýhody tohoto chování jsou:
- Mapa viditelnosti tabulek se neaktualizuje, a proto výkon dotazů, zejména pokud existují kontroly pouze indexů, začíná v průběhu času trpět.
- Databáze může narazit na ochranu zalamování ID transakce.
- Bity nápovědy nejsou nastavené.
Řešení
PostgreSQL verze 13 a starší
Pomocí rozšíření pg_cron můžete nastavit úlohu cron pro naplánování pravidelné analýzy vakua v tabulce. Frekvence úlohy cron závisí na úloze.
Pokyny najdete v zvláštních aspektech použití pg_cron ve službě Azure Database for PostgreSQL.
PostgreSQL 13 a novější verze
Funkce Autovacuum běží na tabulkách s úlohou jen pro vložení. Dva parametry serveru, autovacuum_vacuum_insert_threshold a autovacuum_vacuum_insert_scale_factor, pomáhají řídit, kdy lze aktivovat automatický úklid u tabulek pouze pro vložení.
Průvodce řešením potíží
Flexibilní server Azure Database for PostgreSQL poskytuje průvodce odstraňováním potíží na portálu, který vám pomůže monitorovat bloužení databáze nebo na úrovni jednotlivých schémat a identifikovat potenciální překážky procesu automatického úklidu.
K dispozici jsou dva průvodci odstraňováním potíží:
- Monitorování automatického úklidu – Pomocí této příručky můžete monitorovat bloudost databáze nebo na úrovni jednotlivých schémat.
- Blokátory autovakuování a wraparound – Tato příručka vám pomůže identifikovat potenciální blokátory autovakuování a poskytuje informace o tom, jak daleko jsou databáze na serveru od wraparound nebo nouzových situací.
Průvodci odstraňováním potíží také sdílejí doporučení ke zmírnění potenciálních problémů. Informace o nastavení a používání průvodců odstraňováním potíží najdete v průvodcích odstraňováním potíží s nastavením.
Ukončení procesu automatického čištění: úloha pg_signal_autovacuum_worker
Autovacuum je důležitý proces na pozadí, protože pomáhá s efektivní údržbou úložiště a výkonu v databázi. V normálním procesu autovacuum se zruší sám po deadlock_timeout. Pokud uživatel spustí příkaz DDL v tabulce, může být nutné počkat na deadlock_timeout interval. Funkce Autovacuum neumožňuje spouštění čtení nebo zápisů v tabulce požadované různými požadavky na připojení a přidává latenci v transakci.
Zavedli jsme novou roli pg_signal_autovacuum_worker z PostgreSQL, která umožňuje nesuperuživatelům ukončit probíhající úlohu automatického úklidu. Nová role pomáhá uživatelům zajistit zabezpečený a řízený přístup k procesu automatického úklidu. Nesuperuživatelé mohou zrušit proces autovacuum, jakmile jim udělíte roli pg_signal_autovacuum_worker pomocí příkazu pg_terminate_backend. Role pg_signal_autovacuum_worker je dostupná ve službě Azure Database for PostgreSQL ve verzích 15 a novějších.
Doporučený přístup pro opakované pracovní procesy automatického úklidu
Ve výjimečných scénářích, jako je antibalaround autovacuum, se můžou pracovní procesy okamžitě po ukončení restartovat, protože jsou důležité pro zabránění vyčerpání ID transakce. Pokud chcete minimalizovat opakované konflikty, postupujte takto:
Před ukončením zařaďte operaci DDL do fronty:
Sezení 1: Připravte a spusťte příkaz DDL.
Relace 2: Ukončete proces automatického úklidu.
Důležité
Tyto dva kroky musí proběhnout bez přerušení. Pokud příkaz DDL zůstane blokovaný příliš dlouho, může na serveru uchovávat zámky a blokovat další operace DML.
Ukončení automatického úklidu a spuštění DDL: Pokud DDL musí běžet okamžitě:
- Ukončete proces automatického úklidu pomocí pg_terminate_backend().
- Spusťte příkaz DDL ihned po dokončení dané operace.
Postup, jak se vyhnout opakovaným konfliktům:
Udělení role uživateli
GRANT pg_signal_autovacuum_worker TO app_user;- Identifikace ID procesu automatického úklidu
SELECT pid, query FROM pg_stat_activity WHERE query LIKE '%autovacuum%' and pid!=pg_backend_pid();Ukončení automatického úklidu
SELECT pg_terminate_backend(<pid>);Proveďte příkaz DDL okamžitě
ALTER TABLE my_table ADD COLUMN new_col TEXT;
Poznámka:
Nedoporučujeme ukončovat probíhající autovacuum procesy, protože by to mohlo vést k nabobtnání tabulek a databází, což může dále vést ke zhoršení výkonu. V případech, kdy existuje kritický obchodní požadavek zahrnující plánované spuštění DDL příkazu, který se shoduje s autovacuum procesem, mohou nesuperuživatelé ukončit autovacuum řízeným a bezpečným způsobem pomocí role pg_signal_autovacuum_worker.
Doporučení azure Advisoru
Doporučení Azure Advisoru proaktivně identifikují, jestli má server vysoký poměr bloat nebo jestli se server blíží scénáři zabalení transakce. Pro doporučení můžete také vytvořit upozornění Azure Advisoru.
Doporučení jsou:
Vysoký poměr bloat: Vysoký poměr bloat může ovlivnit výkon serveru několika způsoby. Jedním z významných problémů je, že optimalizátor modulu PostgreSQL může mít potíže s výběrem nejlepšího plánu provádění, což vede ke snížení výkonu dotazů. Proto se doporučení aktivuje, když procento na serveru dosáhne určité prahové hodnoty, aby se zabránilo takovým problémům s výkonem.
Zalamování transakcí: Tento scénář je jedním z nejdůležitějších problémů, se kterými může server narazit. Jakmile je váš server v tomto stavu, může přestat přijímat další transakce, což způsobí, že se server stane jen pro čtení. Proto se doporučení aktivuje, když server překročí 1 miliardu transakcí prahovou hodnotu.
Související obsah
- Úplné vakuum s využitím pg_repack ve službě Azure Database for PostgreSQL
- Řešení potíží s vysokým využitím procesoru ve službě Azure Database for PostgreSQL
- Řešení potíží s vysokým využitím paměti ve službě Azure Database for PostgreSQL
- Řešení potíží s vysokým využitím IOPS ve službě Azure Database for PostgreSQL
- Řešení potíží a identifikace pomalých dotazů ve službě Azure Database for PostgreSQL
- Parametry serveru ve službě Azure Database for PostgreSQL