Reconstruir un portal_repository

Esta es una de las cosas en que nadie desea encontrarse: una corrupción de ZODB. De hecho es la primera que se ha producido desde que KMKey existe, y ha sido debida a una conjunción de uso de BLOGS en postgresql (cosa que no debería hacerse nunca, porque existe la alternativa de gestionarlos como ficheros locales) + errores de conexión a postgresql (que se encontraba en otra máquina y ha dado diversos problemas de conexión por DNS y máximo de conexiones permitidas). El hecho es que nos hemos encontrado con una corrupción de 11 objetos del portal_repository, que no había forma ni de borrar. Finalmente todo se ha solucionado recuperando copias de seguridad, exportando los objetos afectados del portal_repository no corrupto, y reconstruyendo el BTree. Después de eso, se han importado los objectos correspondientes el la BBDD de producción, y todo solucionado. La parte realmente dificil ha sido reconstruir el BTree, así que pego aquí el script para que quede para la posteridad:


repo = km.portal_repository
from BTrees.OOBTree import OOBTree
repo._tree_old = repo._tree
repo._tree = OOBTree()
i = 0
no_procesados = []
for mt in repo._mt_index.keys():
for id in repo._mt_index[mt]:
try:
ob = repo._tree_old[id]
repo._tree[id] = ob
except KeyError:
print "No se procesa %s" % id
no_procesados.append(id)

Etiquetas: