Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird - DB Restore (https://www.delphipraxis.net/170577-firebird-db-restore.html)

user0815 24. Sep 2012 14:14

Datenbank: Firebird • Version: 2.5.1 • Zugriff über: UniDAC

Firebird - DB Restore
 
Hallo,

nach dem Datenbank Backup komme ich jetzt beim Restore nicht weiter.

Sichere ich den Befehl als .bat, schließe das Programm und führe die .bat aus, dann wird die Datenbank wiederhergestellt.
Delphi-Quellcode:
var
  BackupFile, DatabaseFile, Parameter : String;
  sl : TStringList;
begin
  // ...

  BackupFile := '"' + OpenDialog.FileName + '"';

  if Datenmodul.UniConnection.Server <> ''
   then DatabaseFile := '"' + Datenmodul.UniConnection.Server + ':' + Datenmodul.UniConnection.Database + '"'
    else DatabaseFile := '"' + Datenmodul.UniConnection.Database + '"';


  Parameter := '"' + ExtractFilePath(ParamStr(0)) + 'gbak.exe" -rep -v -user sysdba -password masterkey '+ BackupFile +' '+ DatabaseFile;

  sl := TStringList.Create;
  try
    sl.Add(Parameter);
    sl.SaveToFile(BackupDirectory + 'restore.bat');
  finally
    sl.Free;
  end;
Versuche ich das zur Laufzeit, Datenmodul trennen, Aufruf per ShellExecute dann erhalte ich die Fehlermeldung:
gbak: opened file BackupFile
gbak: ERROR:could not drop database DatabaseFile <database might be in use>
gbak: Exiting before completion due to errors


Delphi-Quellcode:
  Datenmodul.UniConnection.Connected := false; // oder Datenmodul.UniConnection.Disconnect;

  Parameter := '-rep -v -user sysdba -password masterkey '+ BackupFile +' '+ DatabaseFile;
  ShellExecute(0,nil,PChar(ExtractFilePath(ParamStr(0)) + 'gbak.exe'),PChar(Parameter),nil,SW_SHOW);
Kann ich die Datenbank zur Laufzeit überhaupt wiederherstellen?

Nersgatt 24. Sep 2012 14:20

AW: Firebird - DB Restore
 
Du kannst die Datenbank dann zur Laufzeit wieder herstellen, wenn wirklich niemand mehr auf die Datenbank zugreift.
Du schließt sicher irgendwo eine Verbindung nicht richtig. Oder Du hast noch was offen (2. Client, evtl. von remote, IBExpert, etc...).

user0815 24. Sep 2012 14:30

AW: Firebird - DB Restore
 
Delphi-Quellcode:
  if not Datenmodul.UniConnection.Connected then
  begin
    Parameter := '-rep -v -user sysdba -password masterkey '+ BackupFile +' '+ DatabaseFile;
    ShellExecute(0,nil,PChar(FormMain.ExeProgramDirectory + 'gbak.exe'),PChar(Parameter),nil,SW_SHOW);
  end;
habe nochmal eine Abfrage vorgepackt, der Code wird ausgeführt mit der obigen Fehlermeldung.
Ein anderes Programm greift nicht auf die DB zu, andernfalls müsste der Fehler doch auch bei der .bat auftreten.

Nersgatt 24. Sep 2012 14:34

AW: Firebird - DB Restore
 
Und wenn Du UniConnection vorher komplett freigibst?

Lemmy 24. Sep 2012 14:35

AW: Firebird - DB Restore
 
Hallo,

sinnvoller als -rep ist es die aktuelle DB umzubenennen und die Datenbank wiederherzustellen (wie gesagt ohne -rep).

Wegen dem Code: Mach mal vor dein Shellexecute oder nach deinem DB.Disconnect ein Application.Processmessage

Grüße

user0815 24. Sep 2012 14:42

AW: Firebird - DB Restore
 
Zitat:

Und wenn Du UniConnection vorher komplett freigibst?
Thx, das hat geholfen, funktioniert jetzt.
:thumb:

tsteinmaurer 24. Sep 2012 15:04

AW: Firebird - DB Restore
 
Ich würde niemals eine vorhandene Datenbank mit -rep überschreiben. Wenn z.B. das Backup defekt ist oder sonst irgend etwas beim Restore passiert, steht man schnell ohne Datenbank da.

lg,
Thomas

user0815 25. Sep 2012 06:50

AW: Firebird - DB Restore
 
Zitat:

Ich würde niemals eine vorhandene Datenbank mit -rep überschreiben. Wenn z.B. das Backup defekt ist oder sonst irgend etwas beim Restore passiert, steht man schnell ohne Datenbank da.
Also eher nur mit den Parameter´n gbak -c -v arbeiten und eine bestehende DB, falls überhaupt nötig, manuell ersetzen (copy & paste)?

Lemmy 25. Sep 2012 07:06

AW: Firebird - DB Restore
 
Guten Morgen,

Variante 1: Kurze Downtime: Backup mit einem anderen DBNamen wieder herstellen, anschließend ggf. testen. Alte DB abhängen, umbenennen und dann die neue DB umbenennen und diese aktivieren

Variante 2: längere Downtime: alte DB abhängen, umbenennen und dann Backup mit dem DBNamen wieder herstellen und ggf. testen und aktivieren.

Grüße

user0815 25. Sep 2012 07:16

AW: Firebird - DB Restore
 
ich nehme Tor 1 (hätte man mit nachdenken ja auch selber drauf kommen können...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz