Sdílet prostřednictvím


Automatické ladění ve službě Azure Database for PostgreSQL

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_diagnostics serveru na ONhodnotu .
  • 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_limit se 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 parametru autovacuum_vacuum_cost_limit .
  • autovacuum_vacuum_scale_factor je 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_delay hodnotu a snižte autovacuum_vacuum_cost_limit ji.
  • 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.

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:

  1. Udělení role uživateli

    GRANT pg_signal_autovacuum_worker TO app_user;
    
    1. Identifikace ID procesu automatického úklidu
    SELECT pid, query FROM pg_stat_activity WHERE query LIKE '%autovacuum%' and pid!=pg_backend_pid();
    
  2. Ukončení automatického úklidu

    SELECT pg_terminate_backend(<pid>);
    
  3. 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.