Tout d'abord, plantons le décors...

Un PostgreSQL qui tournait avec un Slony pour gérer sa réplication a été modifié pour tester la Streaming Replication (réplication embarquée dans PostgreSQL), et qui va aujourd'hui revenir sur Slony.

Il a été arrêté puis redémarré, le répertoire pg_xlog a été déplacé car augmentant beaucoup trop en taille et la partition dédiée était trop petite. Bref, le gros fouttoir.

Et forcément, après avoir remis en place la réplication par Slony, remis les répertoires au bon endroit en prenant soin de bien copier les logs de l'ancien dossier, on relance Postgres et la... c'est le drame.

root@ma_db:~> /etc/init.d./postgresql start
Starting PostgreSQL 8.3 database server: main
* The PostgreSQL server failed to start. Please check the log output                                                   [FAIL]

On matte donc les logs et la... Ô drame, ô désespoir :

Dec 21 11:32:41 dbname postgres[4384]: [2-1] 2011-12-21 11:32:41.423 CET
4384 LOG:  invalid record length at 500C/5EFFF2B8
Dec 21 11:32:41 dbname postgres[4384]: [3-1] 2011-12-21 11:32:41.423 CET
4384 LOG:  invalid primary checkpoint record
Dec 21 11:32:41 dbname postgres[4384]: [4-1] 2011-12-21 11:32:41.423 CET
4384 LOG:  invalid resource manager ID in secondary checkpoint record
Dec 21 11:32:41 dbname postgres[4384]: [5-1] 2011-12-21 1132:41.423 CET
4384 PANIC:  could not locate a valid checkpoint record
Dec 21 11:32:41 dbname postgres[4383]: [1-1] 2011-12-21 11:32:41.424 CET
4383 LOG:  startup process (PID 4384) was terminated by signal 6: Aborted
Dec 21 11:32:41 dbname postgres[4383]: [2-1] 2011-12-21 11:32:41.424 CET
4383 LOG:  aborting startup due to startup process failure

Après avoir cherché plusieurs minutes, et n'ayant pas peur de la perte de données, j'ai exécuté :

root@ma_db:~> su - postgres
postgres@ma_db:~> cd /usr/lib/postgresql/9.0/bin/
postgres@ma_db:/usr/lib/postgresql/9.0/> ./pg_resetxlog -f /var/lib/postgresql/9.0/main

Et voila !

C'est tout réparé :D

Bonne journée et à bientôt