Deutsche Zope User Group
Gast 2 Benutzer online
DZUG-News

Wie packe ich meine ZOPE Datenbank automatisch?

Cronjob basiertes Packen der ZODB

Wer auf seinem ZOPE t�glich viele �nderungen vornimmt, wird schnell merken, da� die Zope Datenbank sehr rasant wachsen kann. Folgendes kleine Script kann ganz normal im laufenden ZOPE Betrieb per Linux cronjob aufgerufen werden und packt die ZODB wieder auf eine beschauliche Gr��e zusammen. �bergibt man dem Scipt als Parameter z.B. den Wert 3, werden alle �nderungen (undo Log) �lter als 3 Tage gel�scht. Das Script basiert auf dem Code von Oleg Broytmann , wurde aber um eine Backup-Optionen erg�nzt.

Da das Script das Password eines Managers enth�lt, sollte es dem System User root geh�ren oder dem User, unter dem der Zope-Server l�uft. Auch nur diese User sollten das Script lesen und ausf�hren d�rfen:


 chmod 700 /root/bin/zpackdb

Wer seine ZODB w�chentlich oder monatlich zusammenpacken m�chte, kann das Script einfach in das Verzeichnis /ect/cron.weekly oder /etc/cron.monthly kopieren. Da in diesem Fall an das Script kein Wert �bergeben werden kann, muss der Wert f�r "days" im Script entsprechend angepasst werden. Ansonsten k�nnte ein Eintrag in der /etc/crontab z.B. so aussehen:

 0 6 1,15 * * root /root/bin/zpackdb 7

oder:

 0 22 * * 0 root /root/bin/zpackdb 7

um die Datenbank jeweils am 1. und 15. des Monats um 6 Uhr morgens (Beispiel 1) oder jeden Sonntag um 22 Uhr zusammenzupacken (Bespiel 2) und alle �nderungen �lter als 7 Tage zu l�schen. Weitere Einstellungsm�glichkeiten mit "man 5 crontab".

eigene Anpassungen:

  • username: es muss sich um einen user der Rolle "Manager" handeln
  • password: das Password dieses Users
  • zope: URL und Port auf dem der ZOPE l�uft, hier http://localhost:8080
  • zope_path: Zope Installationsverzeichnis
  • backup_path: bevor das Script die Data.fs zusammenpackt, macht es eine Sicherheitskopie und zwar in das "backup_path" Verzeichnis.

Hier nun das Script "/root/bin/zpackdb":

 #!/usr/bin/python -O

 import sys, urllib, os, shutil
 from time import *

 username="MANAGER"
 password="PASSWORD"
 zope="http://localhost:8080/"

 zope_path = "/home/zope/Zope/"
 backup_path = "/backup/"

 datafs = zope_path + str("var/Data.fs")
 backup = backup_path + "Data.fs." + strftime("%Y%m%d%H%M%S", localtime(time()))

 class NoGUI_URLopener(urllib.FancyURLopener):
   def __init__(self, username, password, *args):
      apply(urllib.FancyURLopener.__init__, (self,) + args)

      self.username = username
      self.password = password
      self.asked = 0

   def prompt_user_passwd(self, host, realm):
      if self.asked:
         raise "Unauthorised"
      else:
         self.asked = 1
         return self.username, self.password

 try:
   days = sys.argv[1]
 except:
   days = 0

 try:
    shutil.copy(datafs, backup)
 except:
   print "Can't copy Data.fs"
   exit

 urllib._urlopener = NoGUI_URLopener(username, password)
 urllib.urlretrieve("%s/Control_Panel/Database/manage_pack?days:float=%s" % (zope, days))

 print "###" + zope_path + "/var ###"
 os.system("ls -l " + zope_path + "var/")

 print "\n###" + backup_path + " ###"
 os.system("ls -l " + backup_path)

Anmerkung:

Die Umsetzun des cronjobs mit Xron ist nicht zu empfehlen. Es arbeit nicht zuverl�ssig und erzeugt teilweise �ber l�ngere Zeit eine erhebliche, unkontrollierte Systemlast, die zum Absturz des Zopes f�hren kann.

Alternativ gibt es auf zope.org noch ein Bash Script von Fritz Mesedilla . Es wirft ein paar Fehlermeldungen aus, scheint aber zu funktionieren.

�nderungen und freundliche Kritik an: schopen at medienlabor dot de

Geschrieben von mschopen . Letzte �nderung 05.11.2003 11:21.