Entwickler-Ecke
Datenbanken - Kann man IBBackupService auch mit Firebird embedded nutzen?
Siegbert - So 15.03.15 13:14
Titel: Kann man IBBackupService auch mit Firebird embedded nutzen?
Hallo zusammen,
meine Applikation kann sowohl als Standalone System installiert werden (mit Firebird embedded 2.5) als auch in einem Netzwerk und dann mit Firebird als Dienst auf dem Server. Für Backup/Restore wollte ich die Komponenten IBBackupService und IBRestoreService nutzen, was mit der Serverinstallation auch problemlos funktioniert.
Die embedded-Version gibt mir aber die Fehlermeldung aus: "cannot attach to Services Manager".
Da alles andere in der Applikation auch mit embedded korrekt funktioniert, ist die generelle Einrichtung des embedded Firebird vermutlich OK und das Problem liegt in der Nutzung der Komponente.
Mache ich etwas falsch oder geht das mit embedded und IBBackupService grundsätzlich nicht?
Info: es funktioniert weder mit hostname = "localhost" noch Hostname ="" (leer)
Hier der Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| procedure TfrmMain.menuBackupClick(Sender: TObject); var Zielordner: String; wjahr, wmonat, wtag: word; slProtokoll: TStringList; begin with dmBISaM_SQL do begin CloseDB; ZConnection1.Disconnect; IBBackupService1.ServerName := ZConnection1.HostName; Zielordner := 'C:\Backup'; slProtokoll := TStringList.Create(); if length(Zielordner) > 0 then with IBBackupService1 do begin DecodeDate(date, wjahr, wmonat, wtag); BackupFile.clear; Zielordner := Zielordner + '\' + Format('%0.4d', [wjahr]) + Format('%0.2d', [wmonat]) + Format('%0.2d', [wtag]) + '_BISAM_SQL.FBK'; BackupFile.add(Zielordner); DatabaseName := ZConnection1.Database; attach; try ServiceStart; while not eof do slProtokoll.add(getnextline); if Active = True then detach; except on E: Exception do begin; slProtokoll.Add(E.Message); showMessage(slProtokoll.text); end; end; ShowMessage(Format(rsBackupCompleted, [Zielordner, ServerName])); slProtokoll.Free; OpenDB; end; end; end; |
Habe schob Stunden gegoogelt, aber keinen echten Hinweis gefunden, ob es gar nicht funktionieren kann und ich auf einen ganz anderen Weg umstellen muss (GBAK, andere Komponenten,...) oder ob es sich nur um einen Fehler in meinem Code handelt und mit weniger Aufwand gelöst werden kann, als das Verfahren komplett umzustellen.
Danke für jeden Hinweis
Siegbert
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Delete - So 15.03.15 17:13
Offenbar ist deine Backup-Komponenten auf die Existenz eines FB-Servers angewiesen. Du kannst alternativ zu dieser Komponente (oder auch wenn deine DB-Komponenten keine Backup-Komponente bereitstellen) auch einfach die gbak.exe in deinem Bin-Ordner (dort wo du deine Exe-Datei erzeugst) platzieren und
gbak direkt [
http://www.firebirdsql.org/manual/gbak-cmdline.html] aus deiner Delphi-Anwendung aus aufrufen. So mache ich das jedenfalls problemlos. Bei FB-Embedded könntest du aber auch einfach eine Kopie der FBD-Datei erstellen, nachdem du deine Anwendung von der Datenbank getrennt und sicherheitshalber ein paar Sekunden gewartet (sleep) hast.
Siegbert - So 15.03.15 19:35
Ja, GBAK geht auf jeden Fall. Ich hatte aber gehofft, dass ich zwischen der Variante mit Server und embedded nicht auch noch die Komponente unterscheiden muss (ist übrigens die von Embarcadero bei Delphi mitgelieferte Komponente im Bereich "Interbase Admin"). Das reine Kopieren ist zwar sicher die einfachste Variante, dafür werden dann aber die Speicherbereiche nicht freigegeben, die von gelöschten Daten belegt sind, und die Datenbankdatei wird mit der Zeit unnötig groß.
Nun ja, dann wird es wohl nicht nur ein Unterschied im Speicher-Ziel sein (Server ein serverseitiger Backup-Ordner, Client/Embedded ein vom Anwender auswählbares Medium (USB-Platte...) sondern auch noch zwei verscheidene Techniken :-(.
Trotzdem Danke :-).
Delete - So 15.03.15 20:40
Wenn derselbe Code als Embedded- und Server-basiert funktionieren soll, nimmst du eben gbak. Damit kannst du ebenso ein Backup erzeugen wie auch via Restore die Datenbank aus der fbk-Datei wiederherstellen. Irgendwelche Delphi-DB-Komponenten machen das auch nicht viel anders bzw. ohne gbak.exe in deinem Firebird-Server-Ordner würden auch diese nicht funktionieren. Nur weiß deine Backup-Komponente ohne Server-Installation wohl nicht, wo es gbak.exe finden kann. Du kannst dir ja eine Klasse basteln, die Backup- und Restore-Funktionalität via gbak.exe zur Verfügung stellt. Die verfügbaren Parameter/Optionen hatte ich oben bereits verlinkt.
Siegbert hat folgendes geschrieben : |
... ist übrigens die von Embarcadero bei Delphi mitgelieferte Komponente im Bereich "Interbase Admin" ... |
Darf ich fragen, mit welcher Delphi-Version du arbeitest? Die Interbase-Komponenten unterstützen schon seit langem nicht mehr das Firebird-RDBMS, weil Codegear/Embarcardero so die Verwendung des eigenen Interbase-Servers zu bevorzugen suchte.
Siegbert - Mo 16.03.15 09:39
ich verwende Delphi 2010.
Ich werde nun Deinem Tipp folgen und GBAK für beide Varianten verwenden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!