PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

wal_keep_segments por que mínimo, não máximo?


Para responder diretamente à sua pergunta, por que mínimo e por que não máximo? Porque os novos segmentos WAL podem crescer mais rápido que o RemoveOldXlogFiles(_logSegNo, recptr) função pode excluir os antigos.

Além disso, a fórmula para calcular o número provável de segmentos WAL nos documentos está errada. Eu sempre tenho alguns WALs a mais do que checkpoint_segments + wal_keep_segments + 1 Uma fórmula muito mais precisa é esta:wal_keep_segments + 2 * checkpoint_segments + 1

Há um post antigo, mas muito bom sobre isso aqui:http://www.postgresql.org/message-id/[email protected]

Se você fizer inserções maciças, seus segmentos WAL crescerão mais rápido do que podem ser removidos. Isso me pegou apenas esta semana. Eu esperava que o pg_xlog mantivesse um tamanho relativamente constante. Houve um grande processo executado à noite e, quando cheguei ao trabalho na manhã seguinte, minha instância do postgres travou porque o volume que montei para colocar esses WALs estava completamente cheio. Postgres encheu o volume, tentou escrever ainda mais WALs, não conseguiu e morreu abruptamente. Felizmente, executamos réplicas atrás do pgpool2.

Se você tem uma mente curiosa, eu encorajo você a navegar no código-fonte do postgres. É gigante e em C, mas os comentários do código ajudam bastante. Este arquivo em particular é esclarecedor, pois aborda os detalhes de como o checkpoint funciona e como a remoção de segmentos WAL antigos acontece:https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c