Python-3-Migration der ZODB

ZODB selbst ist mit Python 3 kompatibel, eine in Python 2.7 erstellte Datenbank kann jedoch nicht ohne vorherige Migration in Python 3 verwendet werden. Hierfür müssen folgende Schritte ausgeführt werden:

  1. Aktualisieren der Site auf Plone 5.2 mit Python 2, s.a. Upgrading Plone 5.1 to 5.2.

  2. Stellt sicher, dass der Code aller von euch verwendeten Add-Ons in Python 3 funktioniert, s.a. Python 3-Migration.

  3. ZODB packen.

  4. Backup der ZODB.

  5. Im Buildout mit py2env und zodbverify überprüfen, ob die Integrität eurer Datenbank gewährleistet ist:

    1. Installation von zodbverify. Hierfür wird zunächst die devel.cfg geändert und anschließend das bin/buildout aufgerufen:

      [instance]
      eggs +=
          zodbverify
      ...
      
    2. Anschließend kann die Datenbank überprüft werden mit:

      $ bin/zodbupdate --convert-py3 --file=var/filestorage/Data.fs --encoding utf8
      ...
      Updating magic marker for var/filestorage/Data.fs
      Ignoring index for /Users/pbauer/workspace/projectx/var/filestorage/Data.fs
      Loaded 2 decode rules from AccessControl:decodes
      Loaded 12 decode rules from OFS:decodes
      Loaded 2 decode rules from Products.PythonScripts:decodes
      Loaded 1 decode rules from Products.ZopeVersionControl:decodes
      Committing changes (#1).
      

      Zusätzlich können noch weitere Optionen angegeben werden, z.B.:

      -D

      falls defekte Pickles entdekckt werden, können diese direkt debugged werden.

      --encoding-fallback

      falls UnicodeDecodeError auftreten, ist die Instanz vermutlich nicht einheitlich utf-8 kodiert. Hier empfiehlt es sich, als Fallback latin1 zu verwenden, da dies die frühere Standardkodierung von Zope war, also --encoding-fallback latin1.

    Falls Integritätsprobleme, auftreten, müssen diese vor der Migration gelöst werden. Weitere typische Probleme sind:

    1. defekter Data.fs.index, z.B.:

      $ ./bin/zodbupdate --convert-py3 --file=var/filestorage/Data.fs --encoding=utf8
      Updating magic marker for var/filestorage/Data.fs
      loading index
      Traceback (most recent call last):
        File "/home/erral/downloads/eggs/ZODB-5.5.1-py3.6.egg/ZODB/FileStorage/FileStorage.py", line 465, in _restore_index
          info = fsIndex.load(index_name)
        File "/home/erral/downloads/eggs/ZODB-5.5.1-py3.6.egg/ZODB/fsIndex.py", line 134, in load
          v = unpickler.load()
      UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 249: ordinal not in range(128)
      

      Diesen Fehler solltet ihr beheben können indem ihr vor der Migration die Datei Data.fs.index löscht.

    2. fehlerhafte Suche

      In diesem Fall solltet ihr den Katalog neu erstellen. Hierzu geht ihr in eurer Plone-Site in den portal_catalog, wählt den Advanced-Reiter und klickt dann auf Clear and Rebuild.

  6. Kopiert die Datenbank nun in ein Buildout mit py3env, startet jedoch nicht die Instanz.

  7. Migriert die Datenbank mit zodbupdate.

    1. Zunächst wird zodbupdate mit Buildout installiert:

      [buildout]
      
      parts =+
          zodbupdate
      
      [zodbupdate]
      recipe = zc.recipe.egg
      eggs =
          zodbupdate
          ${buildout:eggs}
      
    2. Anschließend kann die ZODB aktualisiert werden mit:

      $ bin/zodbupdate -f var/filestorage/Data.fs
      
  8. Überprüft die Integrität eurer Datenbank mit zodbverify. Wenn Probleme auftreten, behebt diese und wiederholt die Migration.

  9. Startet die Instanz und überprüft manuell ob alles wie erwartet funktioniert.