ZODB FileStorage CorruptedTransactionError
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