Entwickler-Ecke

Datenbanken - [Firebird] Datenbank komplett leeren


pwsolaris - Mi 21.01.09 09:58
Titel: [Firebird] Datenbank komplett leeren
Hi,

ich habe eine Software geschrieben, die Daten in eine Firebird Datenbank schreibt. Bevor neue Daten in die DB geschrieben werden, werden die Tabellen geleert. Das Problem ist nun nur, das die DB dennoch immer größer wird, weil die alten Daten zwar nicht mehr in den Tabellen stehen, jedoch immer noch vorhanden zu sein scheinen da der Platz der alten Daten nicht freigegeben wurde.
Wie kann ich nun die Datenbank komplett leeren, dass die Tabellen leer sind, und die DB im leeren Zustand auch wirklich leer ist?

Mal zum Verständnis: Leere Datenbank (neu aufgesetzt): knapp 1 MB, Mit Daten: knapp 70 MB. Nach löschen von Daten undm it leeren Tabellen: immernoch 70 MB. Beim nächsten einfügen von Daten in die DB: 140 MB usw.


Xentar - Mi 21.01.09 10:14

normalerweise werden die "gelöschten" Datensätze erst von den neuen überschrieben, und erst danach wächst die DB weiter..
Sicher, dass du das Löschen auch mit einem COMMIT abschließt?

Aber du kannst die Datenbank auch händisch wieder komprimieren. Dazu gibt es den Backup / Restore Zyklus. Du machst also ein Backup der DB, und spielst dieses sofort wieder zurück.
Wie das genau funktioniert, dürfte davon abhängen, welche Komponenten du verwendest, um auf die DB zuzugreifen.


matze - Mi 21.01.09 10:20

normalerweise versucht Firebird die neuen Daten in die Speicherplätze der alten gelöschten Daten einzuschreiben. Das geht aber nicht immer, z.b. nicht, wenn du Daten hast, die sich stark voneinander unterscheiden.

Ansonsten hilft da nur wie gesagt: Backup & Restore.


pwsolaris - Mi 21.01.09 10:56

Erstmal Danke für die schnellen Antworten.

Die Daten die in die DB geschrieben werden, ähneln sich sehr stark. Leider ist es dennoch so, das die "alten" und / oder "gelöschten" Datensätze nicht von den neuen überschrieben werden.
Ich verwende auch nach dem Delete-Befehl ein COMMIT.

Wie kann ich denn über mein Programm ein BackUp der DB erstellen und dieses anschließend wieder einzuspielen?


Ich habe nun auch nochmal den Tipp bekommen, die Tabelle mit dem TRUNCATE BEfehl zu leeren. Leider musste ich feststellen, dass dieser Befehl für Firebird nicht existiert.


Xentar - Mi 21.01.09 11:17

user profile iconpwsolaris hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich denn über mein Programm ein BackUp der DB erstellen und dieses anschließend wieder einzuspielen?

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Wie das genau funktioniert, dürfte davon abhängen, welche Komponenten du verwendest, um auf die DB zuzugreifen.


Wenn du z.B. die IBX Komponenten verwendest, gibt es hierfür TIBBackupService und TIBRestoreService.


pwsolaris - Mi 21.01.09 11:38

Also ich benutze die Standard Interbase Komponente die bei Delphi RAD 2007 dabei war.

Wie schon oben erwähnt, werde ich mich auch mal nach einer Art TRUNCATE Befehl schlau machen.


pwsolaris - Mi 21.01.09 12:55

Ich habe jetzt mit dem Tool GBAK von Firebird eine Funktionierende, aber leider etwas umständliche Lösung gefunden.
Jetzt muss ich nur noch rausbekommen, wie ich das Tool mit den Parametern über ShellExecute aufrufe und mein Tag ist gerettet.


Danke für eure Hilfe


Delete - Mi 21.01.09 13:02

Als Alternative käme evtl. noch FBLib [http://fblib.altervista.org/] in Frage, damit bin ich bislang recht zufrieden. Die angesprochenen Services sind darin auch enthalten.