» Start & Installation » ASP-Grundlagen » VBScript » Datenbanken » Erweiterte Techniken » Fehlercode-Suche » FAQ » Forum für aspfehlercodes » ASP » JavaScript » ASCII & ANSI » HTTP-Statuscodes » Codepage » LCID » VBScript » JScript
|
Link: Wichtiger Hinweis in eigener Sache!
| Autor: Klaus Keller | Erstellt am: 2005-12-01 | Aufrufe: 9194 |
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!
|
|