AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[FibPlus] Restore

Ein Thema von MrSpock · begonnen am 23. Mär 2014 · letzter Beitrag vom 23. Mär 2014
Antwort Antwort
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
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

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

AW: [FibPlus] Restore

  Alt 23. Mär 2014, 16:39
Habe jetzt festgestellt, dass trotz Schließens der Datenbank noch ein Eintrag in der System-Tabelle

Delphi-Quellcode:
DatMod.DM.DBPost32.CloseDataSets;
DatMod.DM.pFIBQryDelMon.ExecQuery;
DatMod.DM.TAMain.Commit;
DatMod.DM.DBPost32.ForceCloseTransactions;
DatMod.DM.DBPost32.Close;
in der Query pFIBQryDelMon steht:

Zitat:
DELETE FROM MON$ATTACHMENTS
damit lösche ich auch den Eintrag, der von der Anwendung ja noch aktiv ist. Das ist ja wie sägen an dem Ast, auf dem man sitzt.

Danach lässt die das Restore dann ausführen. Aber es muss doch auch "eleganter" gehen, oder?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: [FibPlus] Restore

  Alt 23. Mär 2014, 19:05
Nur weil du die Verbindung zur DB schließt, heißt es ja nicht, dass der FB-Server das dann auch gleich macht und dann spielt auch noch das Betriebssystem mit rein (caching,...).

Nach dem Close also auf alle Fälle ein application.Processmessages machen - das Close zudem so weit wie möglich nach oben schieben - das ganze Vorbereitungszeug vor dem Dlg.execute - das kannst Du auch machen nachdem der Dialog ausgeführt wurde UND die Datenbankverbindung geschlossen wurde.

Ach ja: Und sicher sein, dass das wirklich die einzigste DB-Verbindung in der Anwendung ist

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

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

AW: [FibPlus] Restore

  Alt 23. Mär 2014, 20:31
Mit einem Application.ProzessMessages funktioniert es tatsächlich auch ohne das Löschen der Daten in der Systemtabelle
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 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