Datenbanken komprimieren, speichern und sichern

Manfred Hoffbauer, Düsseldorf, und André Minhorst, Duisburg

Access speichert alle Objekte einer Datenbank in einer einzigen Datei mit der Erweiterung .mdb. Wenn Sie einmal die Zeit für das Erstellen der Datenbankobjekte und die Zeit für die Datenbearbeitung zusammenrechnen, dann erhalten Sie einen Eindruck von dem Wert der Datenbankdatei. Der einzige wirksame Schutz gegen den totalen Verlust der .mdb-Datei ist die regelmäßige Datensicherung auf einem externen Medium. Dabei und bei einigen anderen Aufgaben hilft Ihnen das Tool, das wir Ihnen in diesem Beitrag vorstellen.

Um es vorwegzunehmen: Die Sicherung einer Datenbank ist immer lästig. Um hohe Sicherheit zu erlangen, müssen Sie die .mdb-Datei auf einem externen Medium (zum Beispiel Band, CD, DVD, FTP-Verzeichnis, Wechselplatte) sichern und dieses auch noch an einem sicheren Ort aufbewahren.

Die Datenbank sollte sich selbst bei einem Totalverlust des Server-PC beispielsweise durch Diebstahl oder Brand wieder rekonstruieren lassen.

Eine weniger sichere, aber weitaus einfacher zu realisierende Form der Datensicherung ist das regelmäßige Kopieren der Dateibankdatei. Hierbei tritt immer wieder das Problem auf, dass die .mdb-Dateien unter Umständen zahlreich und an verschiedensten Orten auf der Festplatte verstreut sind. An dieser Stelle hilft Ihnen das im Folgenden beschriebene Access-Programm weiter, das das Kopieren der Datenbanken für Sie übernimmt. Weiter unten in diesem Beitrag reichern wir das Basisprogramm um eine Funktion zum Komprimieren der Datenbanken an.

Zum Schluss erfahren Sie noch, wie Sie die Sicherungsvorgänge mit dem Windows-Dienst Geplante Tasks zeitlich planen können. Ein Verlegen der Sicherung auf die Nacht verringert die Wahrscheinlichkeit, dass Datenbanken nicht zuverlässig gesichert werden können, weil diese noch durch Benutzer gesperrt sind.

Hinweis

Access-Datenbanken können nur zuverlässig gesichert werden, wenn sie zum Zeitpunkt der Sicherung nicht geöffnet sind. Weitere Informationen zu diesem Thema erhalten Sie im Beitrag Datenbanksperre abfragen in der vorliegenden Ausgabe von Access im Unternehmen.

Tabelle zum Speichern derSicherungsvorgänge

Die für die Steuerung der Sicherungsfunktion benötigten Daten werden in der Tabelle tblDatensicherung gespeichert (s. Tab. 1). Anhand des Tabellenentwurfs können Sie erkennen, dass das Tool einige Zusatzfunktionen enthält:

  • Sichern von Datenbanken
  • Komprimieren von Datenbanken
  • Packen von Datenbanken
  • Packen aller in einem Verzeichnis und dessen Unterverzeichnissen enthaltenen Datenbanken
  • Zeitliche Steuerung der Sicherungsvorgänge
  • Hinweis

    Zum Packen verwenden Sie das Programm Arj32.exe. Es dampft .mdb- und andere Dateien gewaltig ein und hilft damit, Festplattenspeicher zu sparen. Sie können das Programm von der Seite Fehler! Hyperlink-Referenz ungültig. kostenlos zum Test herunterladen. Die Datei befindet sich im Bereich Download. Zur Installation der Software starten Sie einfach die heruntergeladene Datei.

    Parametertabelle

    Die Tabelle tblParameter besteht aus drei Feldern: ParamterID, Parameter und Wert. Hier speichern Sie unterschiedliche Parameter wie beispielsweise den Pfad zur Datei MSAccess.exe auf dem aktuellen Rechner oder den Pfad zu dem in dieser Anwendung verwendeten Packprogramm Arj.exe.

    Die Parameter werden von Hand in diese Tabelle eingetragen; bei Bedarf können Sie dazu ein geeignetes Formular anlegen.

    Formular zur Eingabe derSicherungsdaten

    Um die Eingabe der Daten in die Tabelle zu vereinfachen, verwenden Sie ein geeignetes Formular (siehe Bild 1).

    In dem Formular können Sie beliebig viele Sicherungsvorgänge definieren, die verschiedene Dateien, Sicherungsarten und Zeitpunkte beinhalten. Durch das Speichern eines Datensatzes wird automatisch eine Aufgabe im Windows-Dienst Geplante Tasks erstellt.

    Hinweis

    Weitere Informationen zum Planen von Aktionen mit Geplante Tasks finden Sie im Beitrag Geplante Tasks mit Access in der vorliegenden Ausgabe von Access im Unternehmen.

    Feldname

    Bedeutung

    DatenbankID

    Zahlenfeld. Als Primärschlüssel und zur Sortierung geeignet.

    Quelldatei

    Laufwerk, Pfad und Dateiname der Quelldatei.

    Zieldatei

    Laufwerk, Pfad und Dateiname der Zieldatei.

    IstKomprimieren

    Erhält den Wert ja, wenn die Datenbank vor der Sicherung komprimiert werden soll.

    IstPacken

    Erhält den Wert ja, wenn die Sicherung mit ARJ32 gepackt werden soll.

    IstRekursiv

    Nur bei IstPacken = JA relevant. Erhält den Wert ja, wenn ARJ32 Unterverzeichnisse rekursiv durchsuchen soll.

    IstGestartet

    Ja/Nein-Feld anhand dessen Sie feststellen können, ob der Vorgang begonnen wurde.

    IstAbgeschlossen

    Ja/Nein-Feld anhand dessen Sie feststellen können, ob der Vorgang abgeschlossen wurde.

    Fehlermeldung

    Textfeld, das das Ergebnis des Vorgangs beschreibt.

    Letzteänderung

    Zeitpunkt der letzten änderung an diesem Datensatz.

    Uhrzeit

    Uhrzeit des Backups

    Samstag, Sonntag, …

    Tag/e der Woche, an dem beziehungsweise denen gesichert werden soll

    JobID

    ID, unter der dieser Sicherungsvorgang in Geplante Tasks gespeichert ist

    Tab. 1: Die Felder der Tabelle tblDatensicherung

    Neben dem Festlegen der Eigenschaften eines Sicherungsvorgangs können Sie jeden Sicherungsvorgang einzeln starten. Dazu finden Sie am rechten Rand des Formulars für jeden Datensatz eine entsprechende Schaltfläche. Diese Funktion kann nicht nur zum manuellen Sichern, sondern auch zum Testen der Sicherungsfunktion verwendet werden.

    Bild 1: Das Formular zeigt den Inhalt der Tabelle tblDatensicherung und steuert die Datensicherung.

    Der Start der Datensicherung erfolgt mit der Prozedur Sichere (s. Quellcode 1). Diese wird von zwei Stellen aus aufgerufen:

  • direkt über eine der Schaltflächen zum Starten eines Sicherungsvorgangs
  • über eine Funktion, die durch das AutoExec-Makro beim Starten der Datenbank durch den Windows-Dienst Geplante Tasks ausgelöst wird
  • Die Prozedur Sichere erwartet die DatenbankID eines Sicherungsdatensatzes aus der Tabelle tblDatensicherung.

    Die erste Aufgabe der Prozedur Sichere besteht darin, die Felder IstAbgeschlossen und Fehlermeldung zu initialisieren.

    Werte von einem vorhergehenden Durchlauf werden dadurch gelöscht. Das Feld Letzteänderung wird auf die aktuelle Systemzeit und das Feld IstGestartet auf Ja gesetzt.

    Steuerung

    Die anschließende If-Abfrage übernimmt die grundlegende Steuerung für den aktuellen Datensatz und verzweigt in verschiedene Prozeduren. Der Funktionsaufruf IstDateiVorhanden(rst!Quelldatei) prüft zunächst, ob die angegebene Quelldatei überhaupt existiert. Die dahinter liegende Funktion ermittelt das Vorhandensein mittels Dir-Funktion. Diese liefert sowohl bei einzelnen Dateien (zum Beispiel C:\Temp\Test.mdb) als auch bei der Verwendung von gültigen Wildcards (zum Beispiel C:\Temp\*.mdb) den Wert True zurück. Falls Laufwerk, Pfad oder Datei nicht existieren, zeigt die Funktion den Wert False an.

    Das Programm vermerkt das Fehlen der Quelldatei in dem Feld Fehlermeldung des aktuellen Datensatzes.

    Falls die Quelldatei gefunden werden kann, prüft das Programm zunächst, ob die Datenbank komprimiert werden soll. Falls ja, wird die Komprimierung mit dem Aufruf der Prozedur Komprimiere initiiert.

    Danach wird entweder mit SichereMitArj das einfache Kopieren der Datei oder mit SichereOhneArj das Komprimieren unter Verwendung des Arj32-Packers gestartet. Mit dieser Logik können Sie die .mdb-Datei zuerst komprimieren und sie dann kopieren oder packen.

    Public Sub Sichere(DatenbankID As Integer)
        On Error GoTo Sichere_Fehler
        Dim strQuelldatei As String
        Dim rst As Recordset
        Set rst = CurrentDb.OpenRecordset("SELECT * FROM tblDatensicherung " _        & "WHERE DatenbankID = " & DatenbankID)
        Do While Not rst.EOF
            With rst
               .Edit
               !Letzteänderung = Now
               !IstGestartet = True
               !IstAbgeschlossen = False
               !Fehlermeldung = ""
               .Update
            End With
            If IstDateiVorhanden(Nz(rst!Quelldatei, "")) Then
                If rst!IstKomprimieren Then
                    Komprimiere rst
                End If
                If rst!IstPacken Then
                    SichereMitArj rst
                Else
                    SichereOhneArj rst
                End If
            Else
                rst.Edit
                rst!Fehlermeldung = rst!Fehlermeldung & _                "Quelldatei konnte nicht gefunden werden."
                rst!Letzteänderung = Now
                rst.Update
            End If
            rst.Edit
            rst!IstAbgeschlossen = True
            rst!Letzteänderung = Now
            rst.Update
    Sichere_WeiterNachFehler:
            rst.MoveNext
        Loop
        rst.Close
        Set rst = Nothing
        Exit Sub
    Sichere_Fehler:
        rst.Edit
        rst!Fehlermeldung = rst!Fehlermeldung & Err.Description
        rst!Letzteänderung = Now
        rst.Update
        GoTo Sichere_WeiterNachFehler
    End Sub

    Quellcode 1

    Falls Sie eine Datenbank eventuell zuerst sowohl kopieren als auch packen wollen, dann müssen Sie statt If Then…Else ein Konstrukt verwenden, mit dem Sie die beiden Prozeduren auch nacheinander aufrufen können. In diesem Fall wäre eventuell das Hinzufügen eines weiteren Feldes namens IstKopieren sinnvoll.

    Public Sub GetDateiListe(ByRef strDateiliste() As String, strDateimaske As String)
        Dim strDatei As String
        Dim strPfad As String
        ReDim strDateiliste(0)
        strPfad = GetPfad(strDateimaske)
        strDatei = Dir(strDateimaske)
        Do While Len(strDatei) > 0
            ReDim Preserve strDateiliste(UBound(strDateiliste) + 1) As String
            strDateiliste(UBound(strDateiliste) - 1) = strPfad & strDatei
            strDatei = Dir
        Loop
    End Sub

    Quellcode 2

    Unabhängig davon, welche Operationen im Einzelnen durchgeführt werden, schreibt die Prozedur Sichere am Ende den Wert True in das Feld IstAbgeschlossen. Außerdem wird die aktuelle Systemzeit im Feld Letzteänderung hinterlegt.

    Tritt ein Fehler auf, verzweigt das Programm direkt zur Sprungmarke Sichere_Fehler. Das Programm schreibt die Fehlermeldung in das Feld Fehlermeldung, vermerkt die Systemzeit und setzt den Programmablauf fort.

    Mit dieser Logik gewährleisten Sie, dass das Programm auch im Batchbetrieb ablaufen kann. Es dürfte nur noch äußerst selten vorkommen, dass das Programm auf Grund eines Fehlers unterbrochen wird. Sie haben vielmehr die Möglichkeit, eventuell aufgetretene Fehler auch nach einem längeren Programmdurchlauf in der Tabelle tblDatensicherung zu sichten, zu analysieren und die Fehlerursache zu beheben.

    Das Komprimieren der Datenbank erfolgt in der Prozedur Komprimiere. Diese dimensioniert ein dynamisches Stringarray. Der Aufruf der Prozedur GetDateiListe füllt dieses Array mit einer Liste der zu komprimierenden Dateinamen (s. Quellcode 2).

    Dateiliste lesen

    Die Prozedur GetDateiliste wird mit zwei Parametern aufgerufen. Der erste Parameter ist ein dynamisches Stringarray, der zweite eine Zeichenkette. Die Zeichenkette enthält den Wert des Feldes Quelldatei aus dem aktuellen Datensatz. Dies entspricht dem Laufwerk, dem Pfad und einem Dateinamen oder einer Dateimaskierung.

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar