Access-Datenbanken komprimieren und sichern

Das Problem

Einerseits enthalten Access-Datenbanken oft wichtige Informationen, andererseits gibt es in Access keinen vernünftigen Mechanismus, um Datenbanken zu sichern. Das folgende Beispielprogramm (Skript) ist eine VBS-Datei (=‘Visual Basic Script’) läuft mit dem ‘Windows Scripting Host’ und tut folgendes:

  1. Eine Access-Datenbank, z.B. Test.mdb, wird ausgewählt

  2. Wenn das Archiv-Attribut nicht gesetzt ist, ändert das Script nichts und die folgenden Schritte werden übersprungen

  3. Die Access-Datenbank wird komprimiert

  4. Davon wird eine Kopie einem Packprogramm (PowerArchiver, WinRAR, WinZip) gepackt und unter dem Namen Test.mdb.zip gespeichert

  5. Die vorherige Kopie von Test.mdb.zip wird unter dem Namen Test.mdb.zip.bak ebenfalls gesichert

  6. Das Archiv-Bit wird gelöscht

Die Benennung der Sicherungsdateien folgt einer UNIX-Idee, die auch unter Windows sehr zweckmäßig ist. Man nehme z.B. eine Tabellen-Datei und eine Grafik-Datei, die beide Backups mit der Endung *.BAK erstellen. Wenn beide Dateien den gleichen Dateinamen haben, z.B. 'Umsätze.*' dann überschreiben sich die Sicherungskopien bei jedem Speichern gegenseitig. Außerdem ist an einer Endung .BAK nicht zu erkennen, um welchen Dateityp es sich ursprünglich handelt.
Die hier benutzte Konvetntion stellt klar: Test.mdb.zip ist eine gepackte Access-Datenbank und test.mdb.zip.bak ist das Backup, welches zunächst entpackt werden muß, bevor man es als Datenbank lesen kann.

Voraussetzungen
  • Der Windows Scripting Host muß installiert sein. Bei Windows 98/ME und Windows 2000 ist er standardmäßig aktiv, es sind keine weiteren Maßnahmen erforderlich.

  • Zum Komprimieren muß entweder eine Access 2000-Version oder eine 'kostenlose' Access-2000 Runtime Version (aus dem Office 2000 Developers-Paket) auf dem System installiert sein.

  • Zum Packen muß ein Packprogramm auf dem System installiert werden. Besonders attraktiv ist das Packprogramm PowerArchiver (bis Version sehr gute 6.11 Freeware), ich finde, daß es fast so aussieht und etwas besser funktioniert als die Shareware WinZip. Freunde höchster Packraten greifen auch gerne zur Shareware WinRAR.

  • Um das Script regelmäßig auszuführen, kann man es in die Autostart-Ordner legen oder mit der Funktion ‘Geplante Vorgänge’ im Ordner Start -> Programme -> Zubehör -> Systemprogramme -> Geplante Vorgänge automatisieren

Anwendungsbereich und bekannte Probleme
  • Das Script kann auch für MDE-Dateien eingesetzt werden.

  • Das Programm arbeitet nur mit der ausgewählten Access-Version (z.B. Access 2000). Man sollte daher darauf achten, daß die angegebenen mdb/mde-Dateien nicht in einer neueren Access-Version erstellt wurden.

  • Das Programm prüft nicht, ob die mdb-Datei gerade bearbeitet wird. Besonders, wenn die Datei über das Netzwerk komprimiert wird, kann es zu Problemen kommen, wenn Benutzer eingeloggt sind.

  • Bei Fehlern (z.B. Access kann die Datenbank-Version nicht erkennen) bleibt die Access-Instanz geöffnet und das Skript bleibt ebenfalls hängen.

Das Script ‘AccessKomprimieren.VBS’
    ' Initialisierung
    Set ShellWSH = CreateObject("WScript.Shell")
    Set FSO      = CreateObject("Scripting.FileSystemObject")
    AccessPfad   = """" & CreateObject("Access.Application").SysCmd(9) & "MSACCESS.EXE"" """
    PackProgramm = """C:\Tools\PowerArchiver\POWERARC.EXE"" -a -c4 """

    '### Anfang: Liste der zu komprimierenden Datenbanken

      Komprimieren "C:\Eigene Dateien\Verliehen.mdb"
      Komprimieren "C:\Eigene Dateien\Schallplatten.mdb"
      ' ... (Nächste Datenbank)
      ' ... (Noch 'ne Datenbank)

    '### Ende: Liste der zu komprimierenden Datenbanken


    ' Unterprogramm
      Private Sub Komprimieren(DateiName)

        BackupDatei = DateiName + ".zip"
        If Not FSO.FileExists(DateiName) Then Exit Sub

        With FSO.GetFile(DateiName)
          If .Attributes And 32 Then

             ShellWSH.Run AccessPfad + DateiName + """ /compact", 0, True
             If FSO.FileExists(BackupDatei) Then FSO.CopyFile BackupDatei, BackupDatei & ".bak"

             ShellWSH.Run PackProgramm + BackupDatei + """ """ + DateiName + """", 0, True
             .Attributes = .Attributes And Not 32
          End If
        End With
      End Sub
Erstellen des Scripts

Damit das Script funktioniert, sind folgende Maßnahmen zu treffen:

  • NotePad öffnen, den oben angegebenen Quelltext in eine leere Textdatei kopieren

  • Die zu komprimierenden Dateien stehen am Anfang der Datei. Die Zahl der Dateien ist beliebig. Nach dem Schlüsselwort Komprimieren wird der vollständige Pfad der MDB-Datei eingetragen - fertig.

  • Datei mit der Endung .VBS speichern

  • Pfade zum Packprogramm prüfen / korrigieren

Das VBS läuft beim ersten Aufruf sehr langsam, weil jede MDB-Datei komprimiert und gepackt werden muß. Da über das Archiv-Attribut geprüft wird, ob die Datei verändert wurde, ist der Ablauf aber ab dem zweiten Mal erheblich schneller, da nur noch die geänderten Dateien geprüft werden.
Dies bietet auch einen weiteren Vorteil: Da die Backups nicht bei jedem Durchlauf erstellt werden, enthalten enthalten die Backup-Versionen wirklich ältere Daten, so daß nach einer Aktualisierung auch 'mal der Rückwärtsgang eingelegt werden kann.

Packprogramm ändern

Um die Auswahl der Packprogramme zu erweitern, habe ich hier noch ein paar Anpassungsvorschläge. Alle hier angegebenen Pfade der Packprogramme sind die Standard-Installationspfade und müssen je nach System noch angepasst werden.


Das Script enthält zu Beginn die Zeile

  PackProgramm = """C:\Tools\PowerArchiver\POWERARC.EXE"" -a -c4 """

Diese Zeile ruft den PowerArchiver auf und stellt die maximale Kompression ein.


Die folgende Änderung steigert die Packrate von PowerArchiver extrem - leider auch die Laufzeit:

  BackupDatei = DateiName + ".cab"

Dieser Archiv-Typ (CABinet-File) wird von allen drei Packprogrammen problemlos und ohne Nachfragen gelesen, die Angst vor proprietär-exotischen Archiv-Formaten wäre also unberechtigt.


Für WinZip ist nur die Zeile für die Definition des Packprogramms anzupassen:

  PackProgramm = """C:\Programme\WinZip\WinZip32.exe"" -a -ex """

Die Kompressionsrate wird mit -ex auf maximale Kompression eingestellt.


Bei WinRAR sorgt die folgende Zeile für maximale Kompression plus Multimedia-Kompresssion (günstig, wenn in Access OLE-Objekte gespeichert werden) und gleichzeitig für viele Wiederherstellungsinformationen (Wiederherstellung ist mit -rr16 angelegt und kann bis auf -rr4096 erhöht werden)

  PackProgramm = """C:\Programme\WinRAR\winrar.exe"" a -m5 -md1024 -rr16 -ep -mm """

Im Falle von WinRAR muss auch die Zeile

  BackupDatei = DateiName + ".zip"

in
  BackupDatei = DateiName + ".rar"

geändert werden.