sql >> Databáze >  >> RDS >> PostgreSQL

wal_keep_segments proč minimum, ne maximum?

Abych odpověděl přímo na vaši otázku, proč minimum a proč ne maximum? Protože nové segmenty WAL mohou růst rychleji než RemoveOldXlogFiles(_logSegNo, recptr) funkce může odstranit staré.

Také vzorec pro výpočet pravděpodobného počtu segmentů WAL v dokumentech je chybný. Vždy mám o něco více WAL než checkpoint_segments + wal_keep_segments + 1 Mnohem přesnější vzorec je tento:wal_keep_segments + 2 * checkpoint_segments + 1

Je na to starý, ale opravdu dobrý příspěvek:http://www.postgresql.org/message-id/[email protected]

Pokud provádíte masivní vložky, vaše segmenty WAL porostou rychleji, než je lze odstranit. Tohle mě dostalo až tento týden. Očekával jsem, že pg_xlog si zachová relativně konstantní velikost. V noci probíhal velký proces, a když jsem se druhý den ráno dostal do práce, moje postgresová instance se zhroutila, protože svazek, na který jsem nainstaloval ty WAL, byl úplně plný. Postgres naplnil svazek, pokusil se napsat ještě více WAL, nedokázal to a náhle zemřel. Naštěstí spouštíme repliky za pgpool2.

Pokud máte zvědavou mysl, doporučuji vám procházet zdrojový kód postgres. Je to obří a v C, ale komentáře kódu opravdu pomáhají. Tento soubor je zvláště poučný, protože se dostává do matic a šroubů toho, jak funguje kontrolní bod a jak probíhá odstraňování starých segmentů WAL:https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c



  1. hodnota přepínače pro přidání

  2. MySQL:seznam součtů pro několik podmínek v jednom SQL příkazu

  3. Dynamický runtime výběr schématu PostgreSQL v jOOQ

  4. výběr řazení tabulek pro univerzální znaky