Thema: Delphi [FibPlus] Restore

Einzelnen Beitrag anzeigen

Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#1

[FibPlus] Restore

  Alt 23. Mär 2014, 14:38
Datenbank: Firebird • Version: 2.5 • Zugriff über: FibPlus
Hallo,

zu diesem Thema gibt es zwar schon einen Tread, aber der ist so alt, dass ich die Frage nocheinmal neu aufbringe.

Ich nutze folgenden Code, um ein Backup einzuspielen:

Delphi-Quellcode:
procedure TMainForm.Backupeinspielen1Click(Sender: TObject);
var
  server: string;
  posi: Integer;
begin
   server := DatMod.DM.DBPost32.DatabaseName;
   posi := Pos(':',server);
   server := Copy(DatMod.DM.DBPost32.DatabaseName, 1, posi -1);
   pFIBRS.ServerName := server;
   pFIBRS.DatabaseName.Clear;

   pFIBRS.DatabaseName.Add(Copy(DatMod.DM.DBPost32.DatabaseName, posi+1,
                        length(DatMod.DM.DBPost32.DatabaseName)-posi));
   pFIBRS.BackupFile.Clear;
   if iniSavePath = 'then
      OpenDlg.InitialDir := ExtractFileDir(pFIBBU.DatabaseName)
   else
      OpenDlg.InitialDir := iniSavePath;
   // OpenDlg.FileName := 'Post32Backup_'+DateToStr(Today);
   if OpenDlg.Execute then
   begin
      // ShowMessage(SaveDlg.FileName);
      try
         pFIBRS.BackupFile.Add(OpenDlg.FileName);
         pFIBRS.Params.Clear;
         pFIBRS.Params.Add('password=masterkey');
         pFIBRS.Params.Add('user_name=SYSDBA');
         DatMod.DM.DBPost32.Close; // << hier schließe ich die einzige Verbindung zur Datenbank
         pFIBRS.Attach;
         SB.Panels[0].Text := 'Bitte warten, Backup wird zurückgespielt.';
         SB.Update;

         pFIBRS.ServiceStart;
         while pFIBRS.IsServiceRunning do
         begin
            Application.ProcessMessages;
            Sleep(1000);
         end;

          SB.Panels[0].Text := '';
          SB.Update;
          // ShowMessage('Backup erstellt.');
          ShowMessage('Backup eingespielt. Programm neu starten!');
      except on E: Exception do
         begin
            ShowMessage('Backup konnte nicht eingespielet werden.'+#10#13+
                     E.Message);
            SB.Panels[0].Text := 'Fehler beim Backup einspielen. Programm neu starten';
         end;
      end;
      Close;
   end;

end;
An der markierten Stelle schließe ich die Datenbank, bevor ich mit dem Restore beginne.
Anschließend kommt die Fehlermeldung, dass die DB nicht gedropt werden kann, weil sie möglicherweise in Benutzung ist.

---------------------------
...
---------------------------
Backup konnte nicht eingespielet werden.

MainForm.pFIBRS:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Could not drop database G:\Daten\DBs\POST32.FDB (database might be in use).

---------------------------

Öffne ich dann IBExpert und versuche es dort, bekomme ich dieselbe Meldung.

Bestätige ich die Fehlermeldung in meinem Programm, schließt es sich. Dann kann ich über IBExpert ein Restore vornehmen.
Das heißt wohl, dass mein Programm beim Start des Restore noch immer die DB nutzt. Wie kann ich die Datenbank so schließen, dass ein Restore möglich ist?
OK
---------------------------
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat