Autor Beitrag
Siegbert
Hält's aus hier
Beiträge: 10



BeitragVerfasst: So 15.03.15 13:14 
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:
ausblenden volle Höhe 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;  // --> Abfrage Benutzername und Passwort kommt noch, danach Fehlermeldung
          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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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 :-).
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.

user profile iconSiegbert hat folgendes geschrieben Zum zitierten Posting springen:
... 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 16.03.15 09:39 
ich verwende Delphi 2010.
Ich werde nun Deinem Tipp folgen und GBAK für beide Varianten verwenden.