Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbankbackup (Paradox) lokal auf dem Rechner (https://www.delphipraxis.net/38370-datenbankbackup-paradox-lokal-auf-dem-rechner.html)

chrissy 18. Jan 2005 12:54


Datenbankbackup (Paradox) lokal auf dem Rechner
 
hi,

Irgendwie habe ich nicht so ganz die Idee wie ich das realisieren soll...
hatte es mit

Delphi-Quellcode:
SQL.Add('BACKUP DATABASE "'+pfad+'\Daten\" TO DISK = "'+pfad+'\Backup\ddb_backup.bak" WITH INIT');
probiert, aber beim Ausführen bekomme ich folgende Fehlermeldung : 'SymbolString nicht gefunden! Symbolstring : Backup'

Woran liegt das?
Welche anderen Möglichkeiten gibt es, das Backup zu realisieren?

Gruß
Chrissy

VizeTE 18. Jan 2005 13:49

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
hallo,

die Fehlermeldung läßt ja schon vermuten, daß "Backup" nicht bekannt ist. Du verwendest mit Paradox ja Local-SQL und dieses kennt meines wissens nach nur eine beschränkte Anzahl an Befehlen.

Meine Idee wäre es selbst eine Tabelle anzulegen (das kann ja Dein Programm dynamisch erledigen) und dann mit der BatchMove-Komponent die Daten einfach in die neue Tabelle kopieren. Eventuell kann BatchMove sogar die neue Tabelle selbst anlegen. Bin ich mir jedoch nicht ganz sicher. Schau mal in der Hilfe nach.

Bye

urs.liska 18. Jan 2005 15:01

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Eine Paradox-Datenbank besteht aus einer Vielzahl einzelner Dateien in einem einzigen Verzeichnis.

Für ein Backup kann man doch einfach alle Dateien auf Windows-Ebene kopieren (und bei Bedarf auch noch Zip-en).
Oder sehe ich da was falsch?

MfG
Urs

chrissy 18. Jan 2005 18:17

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Danke...
Die Idee mit dem BatchMove werde ich mir mal genauer ansehen.

Das mit dem Zippen habe ich auch schon probiert, da bekam ich dann Fehlermeldungen, dass er die Tabellen nicht kennt, obwohl Name und Pfad meines erachtens korrekt waren.

Gruß
Chrissy

urs.liska 18. Jan 2005 18:32

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Auf welche Weise hast Du das mit dem Zippen versucht?
Grundsätzlich müsste das schon gehen. Ich glaube (!), es sollte auch keine Probleme geben, dass die Datei gerade benutzt wird (bei Firebird darf man nicht über das OS auf die Datenbankdatei zugreifen, da nie sicher ist, was der Server gerade mit der Datei macht)

MfG
Urs

bernau 18. Jan 2005 19:04

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Zitat:

Zitat von urs.liska
Ich glaube (!), es sollte auch keine Probleme geben, dass die Datei gerade benutzt wird

Geht nicht. Sobald eine Datenbankdatei (auch Paradox) im Zugriff ist, dann ist ein Zippen oder Backup nicht möglich.

Praktisch sind diese Dateien gesperrt. Fehler im Winzip oder im eigenen Packer-Programm etc.

Theoretisch ist folgendes zu beachten:

Stell dir vor, du hast eine 50 MB grosse Paradox-Datei. Das dauert schon etwas bis diese gezipt ist. wenn nun in der Zeit jemand einen Datensatz schreibt, würde er ggf. gesichert werden, wenn er am schluss der Datei geschrieben würde. Wenn dieser Datensatz aber am Anfang der Datei steht, wird dieser nicht mitgesichert. Hinzu kommt, daß die *.mb, *.px Datei später gesichert wird. Das bedeutet, daß in der Sicherung ein Datensatz nicht vorhanden ist, aber im Index (*.px) schon. Das gibt Datensalat.

Sogesehen kann man nur Datensatzweise die Daten auslesen und in eine SicherungsTabelle schreiben.

Ist nicht so einfach das Thema.



Gerd

chrissy 18. Jan 2005 20:17

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
@Gerd
Da die Datenbank nur lokal auf einem Rechner läuft, also auch kein anderer Zugriff hat, könnte ich doch theoretisch alle Tabellen Schließen und dann Zippen,...
Nur selbst das hat nicht funktioniert. ;)
(also: table.close, zippen, table.open)

Gruß
Chrissy

bernau 19. Jan 2005 07:47

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Zitat:

Zitat von chrissy
Da die Datenbank nur lokal auf einem Rechner läuft, also auch kein anderer Zugriff hat, könnte ich doch theoretisch alle Tabellen Schließen und dann Zippen,

Das sollte allerdings gehen.

Womit willst du die Daten zippen? Mit einer eigenen Software, oder mit einem fertigen Programm (z.B. Winzip).

chrissy 19. Jan 2005 08:37

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Ich hatte vor das mit der Unit LZip unter Delphi zu machen, hatte mir da eine CompressStream und DecompressStream prozedur geschrieben, die packen bzw. entpacken sollen, da ich keine Ahnung habe wie ich WinZip ansprechen soll und sozusagen von Delphi steuern soll

Gruß
Chrissy

bernau 19. Jan 2005 08:50

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Zitat:

Zitat von chrissy
Ich hatte vor das mit der Unit LZip unter Delphi zu machen, hatte mir da eine CompressStream und DecompressStream prozedur geschrieben, die packen bzw. entpacken sollen, da ich keine Ahnung habe wie ich WinZip ansprechen soll und sozusagen von Delphi steuern soll

WinZip kann nicht gesteuert werden. Winzip kannst erst mal nur Verwenden um zu sehen, ob die Paradox-Dateien gesperrt sind. Winzip würde dann eine Fehlermeldung bringen, wenn die DAteien in Benutzung sind. Wenn's keine Fehlermeldung gibt, dann kannst du den Fehler bei deiner LZIP-Programmierung suchen.

Hast du mal ein Codebeispiel, wie du LZip verwendest?

chrissy 19. Jan 2005 11:21

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Delphi-Quellcode:
  with Daten do
      begin
         tKunde.Close;
         tLehrer.Close;
         tAnrede.Close;
         tLehrangebot.Close;
         tStufe.Close;
         tFach.Close;
         tSchulform.Close;
         tOrtVorwahl.Close;
         tVermittlung.Close;
         tModul.Close;
         tVKL.Close;
         tVLL.Close;
         tbekanntdurch.Close;
         tradiotyp.Close;
         tzeitungstyp.Close;

         QLehrangebotauswahl.Close;
         QFachauswahlLehrer.Close;
         QFachauswahlKunde.Close;
         QSuchenVorwahl.Close;
         QSuchenOrt.Close;
         QVermittlungsarchiv.Close;
         QSucheKundeName.Close;
         QSucheKundeNummer.Close;
         QSucheLehrerName.Close;
         QSucheLehrerNummer.Close;
         QVKNRS.Close;
         QVLNRS.Close;
         QVKNVS.Close;
         QVLNVS.Close;
         QVermFach.Close;
         QVMS.Close;
         QVFSSS.Close;
         QVDatS.Close;
      end;

    output:=TFileStream.Create(pfad+'\backup\database.zip', fmCreate);
    try
      input:=TFileStream.Create(pfad+'\Daten\kunde.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\lehrer.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\anrede.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\lehrangebot.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\fach.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\schulform.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\stufe.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\ort_vorwahl.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\vermittlung.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\vkla.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\vlla.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\modul.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\Satistik\bekanntdurch.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\Statistik\radiotyp.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
      input:=TFileStream.Create(pfad+'\Daten\Statistik\zeitungstyp.db', fmOpenRead or fmShareDenyWrite);
      CompressStream(input, output);
      input.Free;
    except
        on EFOpenError do ShowMessage('EFOpenError Raised in '+pfad+'\Daten\ddb_backup.bak');
    end;

    with Daten do
      begin
         tKunde.Open;
         tLehrer.Open;
         tAnrede.Open;
         tLehrangebot.Open;
         tStufe.Open;
         tFach.Open;
         tSchulform.Open;
         tOrtVorwahl.Open;
         tVermittlung.Open;
         tModul.Open;
         tVKL.Open;
         tVLL.Open;

         tbekanntdurch.Open;
         tradiotyp.Open;
         tzeitungstyp.Open;

         QLehrangebotauswahl.Open;
         QFachauswahlLehrer.Open;
         QFachauswahlKunde.Open;
         QSuchenVorwahl.Open;
         QSuchenOrt.Open;
         QVermittlungsarchiv.Open;
         QSucheKundeName.Open;
         QSucheKundeNummer.Open;
         QSucheLehrerName.Open;
         QSucheLehrerNummer.Open;
         QVKNRS.Open;
         QVLNRS.Open;
         QVKNVS.Open;
         QVLNVS.Open;
         QVermFach.Open;
         QVMS.Open;
         QVFSSS.Open;
         QVDatS.Open;
      end;
dass der Aufruf

Delphi-Quellcode:
procedure CompressStream(inpStream, outStream: TStream);
var
  InpBuf, OutBuf: Pointer;
  InpBytes, OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, inpStream.Size);
    inpStream.Position := 0;
    InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
    CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
    outStream.Write(OutBuf^, OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;
Die Prozedur kommt gar nicht erst dazu CompressStream aufzurufen
Mit einem einfachen Image funktioniert es aber, das habe ich schon ausprobiert.
Kann das Ziparchiv aber nicht mit WinRar öffnen

bernau 19. Jan 2005 12:56

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Du kannst mit fileexists mal vorher prüfen, ob die Datei auch wirklich vorhanden ist.


Delphi-Quellcode:
Procedure SaveToZip(myFilename:string;myOutputStream:TStream);
var
  input:TFilestream;
begin
 if fileexist (myFilename)
 then begin
   try
      input:=TFileStream.Create(myFilename, fmOpenRead or fmShareDenyWrite);
      CompressStream(input, myoutputstream);
      input.Free;
    except end;
  end
 else
  begin
   //Fehlermeldung
  end;
end;



 output:=TFileStream.Create(pfad+'\backup\database.zip', fmCreate);
 SaveToZip(pfad+'\Daten\stufe.db',output);
 SaveToZip(pfad+'\Daten\stufe.db',output);
 SaveToZip(pfad+'\Daten\anrede.db',output);
 //usw.

chrissy 19. Jan 2005 22:55

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Ok, also, ich habs zumindest so gelößt, dass man zum Backup das Hauptprogramm Datenbank schließen muss (bzw. das ok dazu geben) und dann ein weiteres Programm nur fürs Backup zuständig ist. Dann können die einzelnen Dateien auch gezippt werden.

Gruß
Chrissy

chrissy 20. Jan 2005 21:43

Re: Datenbankbackup (Paradox) lokal auf dem Rechner
 
Hallo!!

Wenn ich die gezipten Daten wieder auslese, 1. Wie komme ich genau an die enzelnen Daten im Zipfile, 2. Wie komme ich an den ursprünglichen Pfad der Daten?
Irgendwie habe ich das noch nicht so ganz verstanden.

Gruß
Chrissy


Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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