PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

wal_keep_segments perché minimo, non massimo?

Per rispondere direttamente alla tua domanda, perché minimo e perché non massimo? Perché i nuovi segmenti WAL possono crescere più velocemente di RemoveOldXlogFiles(_logSegNo, recptr) la funzione può eliminare quelli vecchi.

Inoltre, la formula per calcolare il numero probabile di segmenti WAL nei documenti è errata. Ho sempre qualche WAL in più rispetto a checkpoint_segments + wal_keep_segments + 1 Una formula molto più precisa è questa:wal_keep_segments + 2 * checkpoint_segments + 1

C'è un post vecchio, ma davvero buono su questo qui:http://www.postgresql.org/message-id/[email protected]

Se esegui inserti massicci, i tuoi segmenti WAL cresceranno più velocemente di quanto possano essere rimossi. Questo mi ha preso solo questa settimana. Mi aspettavo che pg_xlog mantenesse una dimensione relativamente costante. Di notte è stato eseguito un processo di grandi dimensioni e quando sono arrivato al lavoro la mattina seguente, la mia istanza postgres si è arrestata in modo anomalo perché il volume su cui ho montato per eseguire il plop di quei WAL era completamente pieno. Postgres riempì il volume, cercò di scrivere ancora più WAL, non ci riuscì e morì bruscamente. Fortunatamente eseguiamo repliche dietro pgpool2.

Se hai una mente curiosa, ti incoraggio a sfogliare il codice sorgente di postgres. È gigante e in C, ma i commenti del codice aiutano davvero. Questo file in particolare è illuminante in quanto approfondisce come funziona il checkpoint e come avviene la rimozione dei vecchi segmenti WAL:https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c