PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

wal_keep_segments pourquoi minimum, pas maximum ?

Pour répondre directement à votre question, pourquoi minimum et pourquoi pas maximum ? Parce que les nouveaux segments WAL peuvent croître plus rapidement que RemoveOldXlogFiles(_logSegNo, recptr) fonction peut supprimer les anciens.

De plus, la formule de calcul du nombre probable de segments WAL dans la documentation est erronée. J'ai toujours quelques WAL de plus que checkpoint_segments + wal_keep_segments + 1 Une formule beaucoup plus précise est celle-ci :wal_keep_segments + 2 * checkpoint_segments + 1

Il y a un article assez ancien, mais vraiment bon à ce sujet ici :http://www.postgresql.org/message-id/[email protected]

Si vous faites des insertions massives, vos segments WAL grandiront plus vite qu'ils ne pourront être supprimés. Cela m'a eu juste cette semaine. Je m'attendais à ce que pg_xlog conserve une taille relativement constante. Il y avait un gros processus exécuté la nuit et quand je suis arrivé au travail le lendemain matin, mon instance postgres s'est écrasée parce que le volume que j'avais monté pour plop ces WAL était complètement plein. Postgres a rempli le volume, a essayé d'écrire encore plus de WAL, n'a pas pu et est mort brusquement. Heureusement, nous exécutons des répliques derrière pgpool2.

Si vous avez un esprit curieux, je vous encourage à parcourir le code source de postgres. C'est géant et en C, mais les commentaires de code aident vraiment. Ce fichier en particulier est éclairant car il aborde les détails du fonctionnement des points de contrôle et de la suppression des anciens segments WAL :https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c