asphelper.de - Tipps & Skripts - Datenbank komprimieren/kompaktieren

Link: Wichtiger Hinweis in eigener Sache!


 Autor: Klaus Keller Erstellt am: 2005-12-01 Aufrufe: 9194 


 << Vorheriger Tipp Nächster Tipp >>



Tipp 88: Datenbank komprimieren/kompaktieren



Access hat leider die Negative Eigenschaft, wenn viele Datensätzen hinzugefügt und wieder gelöscht werden die Access-Datenbank immer grösser wird. Datensätze, die gelöscht werden, reduzieren dabei leider nicht die Datenbankgrösse.

Das wird dann zu einem Problem, wenn sehr viele Datensätze hinzugefügt und wieder gelöscht werden, wie z.B. bei einer Sitzungsverwaltung. Eine Möglichkeit, um die Datenbank zu verkleinern ist in Access oben auf Extras, Datenbank-Dienstprogramme, "Datenbank komprimieren und reparieren". Damit wird die Datenbank kompaktiert und die Datenbank um die gelöschten Datensätze verkleinert.

Was aber wenn es sich um eine sehr grosse Datenbank handelt die auch noch online ist? Dann besteht nicht immer die Möglichkeit, die Datenbank herunterzuladen, zu komprimieren und dann wieder auf den Server hochzuladen. Eine Möglichkeit besteht darin, die Datenbank zu kompaktieren, zu komprimieren. Dazu wird die JetEngine eingesetzt.

Zunächst einmal das Skript dazu:
1   
2
3
4
5
6
Dim jro, strConn1, strConn2
Set jro = Server.CreateObject("jro.JetEngine")
strConn1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\test.mdb"
strConn2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\test2.mdb"
jro.CompactDatabase strConn1, strConn2
set jro = nothing

In Zeile 2 wird das Objekt erstellt. In Zeile 3 und Zeile 4 wird der benötigte Datenbanktreiber zusammengestellt, hierfür wird ein OLEDB-Treiber eingesetzt. In Zeile 5 wird die Datenbank komprimiert, zuletzt wird das Objekt terminiert.

Vergleichen Sie die Zeilen 3 und 4, der Datenbankname unterscheidet sich, warum? Leider ist es nicht möglich, daß die vorhandene Datenbank einfach komprimiert wird, es muß eine neue erstellt werden. Und damit gibt es leider ein Problem, die Datenbank hat nun einen neuen Namen, was nun? 2 Möglichkeiten: Entweder Sie ändern die Datenbank-Verbindungsstrings, dann müssen Sie die "alte" Datenbank löschen. Etwas umständlich, wie ich meine.

Die zweite Möglichkeit funktioniert nur mit dem Skript dazu wird noch ein FileSystemObject eingesetzt. Die Datenbank wird weiterhin komprimiert und als neue Datenbank erstellt. Dann wird mit dem FileSystemObject die "alte" Datenbank gelöscht und die "neue" Datenbank wird umbenannt.

Dazu möchte ich Ihnen eine Funktion vorstellen, dieser müssen Sie lediglich den Pfad der Datenbank übergeben, und schon wird das ganze automatisch durchgeführt. Die Funktion:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
call compactdatabase("d:\inetpub\Test.mdb")

public function compactdatabase(byref strDBPath)
    Dim jro, strConn1, strConn2, strNewDBName, strDBName, fso
    
    strDBName = right(strDBPath, len(strDBPath) - instrrev(strDBPath, "\", -1))
    strDBName = left(strDBName, len(strDBName) - 4)
    strNewDBName = strDBName & "_compact_" & _
                        Replace(Replace(Replace(now(), " ", ""),":", ""),".","") & ".mdb"
    strPath = left(strDBPath, len(strDBPath) - len(strDBName) - 4)
    
    Set jro = Server.CreateObject("jro.JetEngine")
    strConn1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath
    strConn2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & strNewDBName
    jro.CompactDatabase strConn1, strConn2
    set jro = nothing
    
    set fso = Server.CreateObject("Scripting.FileSystemObject")
    fso.DeleteFile strDBPath
    fso.MoveFile strPath & strNewDBName, strDBPath
    set fso = nothing
end function


Mit der Funktion compactdatabase wird eine temporäre neue Datenbank angelegt, diese hat zum einen den Orignalnamen erweitert um "_compact_" und eine Zeitangabe, also in etwa: "test_compact_20051201000736.mdb". Nachdem die Datenbank per JetEngine neue angelegt (komprimiert) wurde, wird dann zuerst die alte Datenbank gelöscht und die neue Datenbank wird umbenannt, und heißt dann genauso wie die "alte" Datenbank.

Damit könnte man nun der Auffassung sein: Ist doch alles in Ordnung. Leider ist das nicht so. Denn viele/die meisten Webhoster haben zu Recht das Zugriffsrecht auf den Datenbankordner so eingestellt, daß eine derartige Aktion nicht möglich ist. Nun kann man den Webhoster bitten, die Zugriffsrechte so einzustellen, daß eine derartige Kompaktierung möglich ist. Eventuell sollten Sie dann Ihrem Webhoster das Skript vorlegen. Aber die meisten Webhoster werden das nicht durchführen, zu Recht wie ich meine.

Denn die Gefahr eines Mißbrauchs der Zugriffsrechte z.B. durch Hacker ist einfach zu gross. In derartigen Fällen gibt es dann leider nur noch 2 Lösungen:
1. Neue Datenbank erstellen, Tabellen wie bei der alten Datenbank und dann die Datensätze per Skript übertragen. Dann allerdings müssen die Datenbankpfade angepasst werden, oder die alte Datenbank wird (per FTP-Zugriff) gelöscht und die neue Datenbank umbenannt.
2. Einfach die Datenbank herunterladen, per Access kompaktieren und wieder hochladen. Nachteil: Während dieser Zeit können neue Datensätze dazukommen oder Datensätze verändert werden. Da könnte man dann allerdings eine Zugriffssperre einrichten. Natürlich bleibt dann aber der Nachteil, daß während diesem Zeitraum die Seiten dann nicht mehr aufrufbar sind, die Datenbank funktionert ja aktuell nicht.

Fazit: Eine 100%ige Lösung ist jro.JetEngine nicht, leider!



 << Zum vorherigen Tipp 87:
Voting - Eine Seite oder ein Beitrag bewerten

 Zum nächsten Tipp 89 >>
Ist Javascript im Browser aktiviert?

top top
© Copyright By Klaus Keller, 2001-2008 - Alle Rechte vorbehalten.