Vous êtes ici : Accueil / 2011 / Juin / Réaliser un pack d'une base de données ZODB

Réaliser un pack d'une base de données ZODB

écrit le 06/06/2011 Par Joseph Rozencwajg
Cet article se propose de lister les différentes méthodes disponibles pour effectuer un pack d'une base de données ZODB, afin d'en diminuer la taille.

Introduction

La ZODB fonctionne de manière incrémentale : chaque transaction est ajoutée à la fin du fichier Data.fs. Même si un objet est supprimé, il se contente d'écrire que l'objet a été supprimé, mais l'objet reste présent.

Il est possible pour le code d'accéder aux anciennes versions des objets, ainsi que d'annuler des transactions (par exemple de restaurer des objets supprimés).

Cependant la BDD ne fait que grossir, ce qui peut poser des problèmes de maintenance. Il existe donc une opération nommée le *pack* qui permet de consolider la base de données à une date donnée, puis de ne garder que les transactions ultérieures à cette date.

Généralités sur les packs

Prérequis pour un pack

Il est nécessaire pour lancer un pack qu'il y ait suffisamment d'espace disque disponible pour stocker à la fois la base de données avant le pack, et la base de données après le pack.

Par précaution, il est recommandé de s'assurer que la place libre est supérieure à la taille du 'Data.fs'.

Effet d'un pack

Pendant un pack, le Zope continue à répondre aux requêtes, cependant, le pack est une opération coûteuse en I/O et peut donc provoquer des ralentissements.

Après un pack, la base de données ne contient plus d'informations d'historique antérieur à une date choisie. Si on "pack à 30 jours", tout l'historique plus datant d'avant 30 jours est perdu.

L'ancienne base de données (celle d'avant le pack) est conservée en 'Data.fs.old'. Ce fichier peut être supprimé si nécessaire, pour gagner de l'espace disque.

Pack et ZODB multiples

Lorsqu'il y a plusieurs ZODB sur un même Zope, chaque base peut (et doit) être packée séparément.

Politique de pack

Généralités

En fonction de la taille de votre/vos base(s) de données ZODB, et de l'utilisation qui en est faite, nous vous recommandons de déterminer une périodicité en nombre de jours pour packer les instances Zope que vous utilisez (dans notre cas, nous convenons de ce paramètre avec nos clients, et nous packons après accord explicite de celui-ci).

Il est possible de packer automatiquement des instances de Zope via un job cron. Si ce cron ne suffit pas, on peut dans ce cas packer manuellement une instance.

Cas particuliers

Il ne faut **jamais** packer le Data.fs d'une application Zope utilisant l'historique des transactions ZODB. C'est le cas par exemple de !ZWiki.

Méthodes de pack

Sur une instance stand-alone

Sur une instance Zope stand-alone (non-ZEO) le pack se fait en ZMI, dans le Control Panel, Database Management, à l'adresse suivante : http://[host]:[port]/Control_Panel/Database/main/manage_main.

Sur un cluster ZEO

Sur un cluster ZEO le pack se fait en ligne de commande, avec une commande du type :

export PYTHONPATH=/usr/lib/zope2.10/lib/python/
/usr/lib/zope2.10/bin/zeopack.py -p 8002 -S multicatalog -d 30 -h 127.0.0.1

L'argument de '-p' est le port du serveur ZEO, de '-S' le nom du 'Data.fs' dans la configuration du ZEO, de '-d' le nombre de jours. Ne pas oublier le '-h 127.0.0.1' sinon l'opération ne fonctionne pas, mais n'affiche pas non plus d'erreur (le processus reste inactif éternellement).

Utilisez toujours la version de zeopack correspondant à l'instance Zope (2.10 dans l'exemple).

Erreurs possibles

Already packing

Un pack est déjà en cours (lancé par une autre personne ou pas), il faut attendre qu'il se termine.

Actions sur le document