Comment remettre en état une ZODB corrompue avec le script fsrecover.py fournit directement dans le code de la ZODB.

Erreur rencontrée au démarrage de Zope

Dans mon cas le serveur Zope ne voulait plus démarrer et l’erreur suivante s’affichait dans la console (mon projet tourne dans un buildout) :

[...]
<buildout-directory>/parts/zope2/lib/python/ZODB/FileStorage/FileStorage.py
", line 52, in panic
raise CorruptedTransactionError(message)
ZODB.FileStorage.FileStorage.CorruptedTransactionError: %s data record exceeds t
ransaction record at %s

Correction de la base de données corrompue avec fsrecover.py

Il faut utiliser pour cela l’interpréteur python du projet. Ce dernier doit avoir accès à l’ensemble des modules de zope2. J’utilise pour cela l’interpréteur python zopepy généré par le buildout via la “part” suivante dans le fichier de configuration buildout.cfg :

[zopepy]
recipe = zc.recipe.egg
eggs = ${instance:eggs}
interpreter = zopepy
extra-paths = ${zope2:location}/lib/python
scripts = zopepy

Rétablissons à présent notre base de données:

cd <buildout-directory>/var/filestorage
../../bin/zopepy ../../parts/zope2/lib/python/ZODB/fsrecover.py -v 1 Data.fs Data.fs.recover

Il faut être patient, le script va scanner toutes les transactions de la base, des plus anciennes aux plus récentes.

Que fait le script “fsrecover.py” ? Tout est dans le code: “Recover data from a FileStorage data file, skipping over damaged data. Any damaged data will be lost. This could lead to useless output if critical data is lost.”.

Il ne reste plus qu’à mettre en production la base Data.fs.recover et à redémarrer le serveur Zope :

mkdir corrupted
mv Data.fs corrupted/
mv Data.fs.index corrupted/
mv Data.fs.tmp corrupted/

mv Data.fs.recover Data.fs
mv Data.fs.recover.index Data.fs.index
mv Data.fs.recover.tmp Data.fs.tmp

cd ../..
./bin/instance fg