Discussion:
Archiwizacja bazy FB
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Art
2007-05-14 18:09:16 UTC
Permalink
Witam,
chcę zrobić archiwizację za pomocą IBBackupService, ale tak aby plik
docelowy znalazł się na komputerze, z którego jest archiwizacja robiona,
a tymczasem kopia robi się w katalogu na serwerze.
Oto kawałek kodu, który robi kopię.

IBBackup.Protocol:=TCP;
IBBackup.ServerName:='serwer';
IBBackup.Active:=True;
try
IBBackup.DatabaseName:='c:\baza.gdb';
IBBackup.BackupFile.Add('c:\baza.gdk');
IBBackup.ServiceStart;
finally
IBBackup.Active:=False;
end;

Czy mogę plik baza.gdk otrzymać na kompie klienta, a jak tak to w jaki
sposób?

Pozdrawiam ART
Grzegorz Skoczylas
2007-05-14 20:43:36 UTC
Permalink
Post by Art
Witam,
chcę zrobić archiwizację za pomocą IBBackupService, ale tak aby plik
docelowy znalazł się na komputerze, z którego jest archiwizacja robiona,
a tymczasem kopia robi się w katalogu na serwerze.
Oto kawałek kodu, który robi kopię.
IBBackup.Protocol:=TCP;
IBBackup.ServerName:='serwer';
IBBackup.Active:=True;
try
IBBackup.DatabaseName:='c:\baza.gdb';
IBBackup.BackupFile.Add('c:\baza.gdk');
IBBackup.ServiceStart;
finally
IBBackup.Active:=False;
end;
Czy mogę plik baza.gdk otrzymać na kompie klienta, a jak tak to w jaki
sposób?
Ten sposób wykonywania kopii korzysta z serwisu zaimplementowanego w
serwerze FB. Innymi słowy, aplikacja "zleca" wykonanie kopii. Realizacją
tego zlecenia zajmuje się serwer FB. Dlatego FB nie jest w stanie zrobić
kopii na dysku, do którego nie ma dostępu.

Jedyny znany mi sposób, aby wykonać kopię bazy do folderu na dysku
lokalnym, to uruchomienie programu GBAK. W każdym razie ten sposób
działa w przypadku InterBase 6, Firebird 1.0 oraz Firebird 1.5.
--
Pozdrawiam,

Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------
Art
2007-05-15 15:15:31 UTC
Permalink
Post by Grzegorz Skoczylas
Jedyny znany mi sposób, aby wykonać kopię bazy do folderu na dysku
lokalnym, to uruchomienie programu GBAK. W każdym razie ten sposób
działa w przypadku InterBase 6, Firebird 1.0 oraz Firebird 1.5.
A czy mógłbym prosić o kawałek kodu-komendy, która mi taką kopię utworzy
na lokalnym dysku?
Z góry bardzo dziękuję.


Pozdrawiam
Art
Grzegorz Skoczylas
2007-05-15 15:59:26 UTC
Permalink
Post by Art
Post by Grzegorz Skoczylas
Jedyny znany mi sposób, aby wykonać kopię bazy do folderu na dysku
lokalnym, to uruchomienie programu GBAK. W każdym razie ten sposób
działa w przypadku InterBase 6, Firebird 1.0 oraz Firebird 1.5.
A czy mógłbym prosić o kawałek kodu-komendy, która mi taką kopię utworzy
na lokalnym dysku?
Z góry bardzo dziękuję.
Pozdrawiam
Art
GBAK -b -user SYSDBA -password masterkey serwer:LokalizacjaBazy.fdb
c:\kopie\KopiaBazy.fbk

Program GBAK.EXE jest w folderze BIN serwera Firebird.

Kodując wykonanie powyższego polecenia pojawia się kilka problemów.
Jednym z nich jest lokalizacja pliku GBAK.EXE. Trzeba w aplikacji
wskazać tę lokalizację. Można też po prostu skopiować plik GBAK.EXE do
foldera aplikacji.

Jeżeli chcielibyśmy przechwycić raport z wykonania kopii to można
skorzystać z kodu na stronie
http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm.

Inny problem to obsługa sytuacji błędnych. Tutaj jedyne, co można
zrobić, to sprawdzenie kodu zakończenia aplikacji GBAK (ErrorLevel).
Wartość zero oznacza brak błędów, wartości niezerowe - błędy. Można go
pobrać przy pomocy funkcji API GetExitCodeProcess wywołanej po funkcji
WaitForSingleObject.

Podsumowując (najważniejsze kroki):
1. Inicjujemy powyższe polecenie przy pomocy funkcji CreateProcess.
2. Czekamy na zakończenie polecenia przy pomocy funkcji WaitForSingleObject.
3. Pobieramy kod zakończenia polecenia przy pomocy funkcji
GetExitCodeProcess.
--
Pozdrawiam,

Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------
Art
2007-05-15 17:22:13 UTC
Permalink
Serdecznie dziękuję za odpowiedź.

Loading...