Ta strona została przetłumaczona maszynowo. Przeczytaj oryginał angielski. English

Biblioteka IBSurgeon

Szybki przewodnik po tworzeniu kopii zapasowej i przywracaniu za pomocą Gbak

Co to jest gbak?

1. Opanuj tworzenie kopii zapasowych za pomocą Gbak

1.0 Przygotowanie

1.1 Najprostsza kopia zapasowa Firebird za pomocą polecenia gbak

1.2. Lokalna kopia zapasowa za pomocą gbak, którą można wykonać online w systemie Windows

1.3. Kopia zapasowa za pomocą gbak z ciągiem połączenia TCP/IP

1.4. Szybsza kopia zapasowa za pomocą gbak z Service Manager

1.5. Najszybsza kopia zapasowa za pomocą gbak z Service Manager i wyłączonym odśmiecaniem

1.6. Kopia zapasowa do udziału sieciowego lub lokalizacji sieciowej

1.7. Prosta kopia zapasowa z zdalnego serwera na lokalną maszynę

1.8. Szybsza kopia zapasowa z zdalnego serwera na lokalną maszynę za pomocą Service Manager

1.9. Kopia zapasowa bazy danych Firebird na zdalnym serwerze na ten sam zdalny serwer za pomocą Service Manager

1.10. Kopia zapasowa bazy danych Firebird 6 razy szybciej z Firebird 5 (lub HQbird w 2.5/3.0/4.0/5.0)

2. Przywracanie za pomocą narzędzia Gbak

2.1. Najprostsze polecenie przywracania

2.2. Przywracanie z ciągiem połączenia localhost

2.3. Przywracanie z XNET w systemie Windows

2.4. Szybsze przywracanie za pomocą Service Manager

2.5. Niezalecany przełącznik

2.6. Przywracanie bazy danych za pomocą aliasu

2.7. Przywracanie lokalnej kopii zapasowej na zdalny serwer

2.8. Przywracanie lokalnej kopii zapasowej na zdalny serwer za pomocą Service Manager

2.9. Przywracanie bardzo długich tabel

3. Dostrajanie i logowanie procesów tworzenia kopii zapasowych i przywracania

3.1. Gbak z pełnym wyjściem

3.2. Dodaj statystyki wydajności do pełnego wyjścia

3.3. Wyklucz tabele z kopii zapasowej i/lub z przywracania

3.4. Pobierz hasło do kopii zapasowej lub przywracania z pliku

4. Jednoetapowa kopia zapasowa-przywracanie

5. Podsumowanie wydajności

Bardzo często zadawane pytania dotyczące VM i kopii zapasowych Firebird

Dodatek A. Błędy podczas tworzenia kopii zapasowej/przywracania

Kontakty

Co to jest gbak?

Gbak to standardowe narzędzie wiersza poleceń Firebird (zobacz jego oficjalną dokumentację tutaj), zaprojektowane do wykonywania 1) pełnej kopii zapasowej bazy danych: odczytuje każdy rekord w bazie danych i zapisuje je do pliku kopii zapasowej, 2) przywracania kopii zapasowej do nowej bazy danych.

Dla programistów i administratorów z doświadczeniem w innych systemach RDBMS termin „kopia zapasowa” może być nieco mylący, ponieważ gbak tworzy nie dokładną kopię bazy danych, ale plik w formacie nie-bazodanowym, zawierający tylko dane (indeksy są przechowywane jako deklaracje).

Aby utworzyć bazę danych z pliku kopii zapasowej gbak, należy wykonać proces przywracania za pomocą gbak.

1. Opanuj tworzenie kopii zapasowych za pomocą Gbak

1.0. Przygotowanie

Utwórzmy folder C:\data i umieśćmy tam jakąś bazę danych. Użyjemy 5GB bazy danych z testu Firebird OLTP-EMUL, ale możesz oczywiście użyć własnej bazy danych.

Dla użytkowników Linux - utwórzmy folder /db i zmieńmy jego właściciela na „firebird”, a następnie skopiujmy tam bazę danych (upewnij się, że jej właścicielem jest również firebird).

Code
mkdir /db
chown firebird -R /db

1.1 Najprostsza kopia zapasowa Firebird za pomocą polecenia gbak

Windows

Code
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

W tym przykładzie narzędzie gbak uzyskuje dostęp do pliku bazy danych za pomocą dostępu lokalnego lub osadzonego.

Firebird 3.0: Dostęp osadzony w domyślnej konfiguracji Firebird 3.0 (z parametrem ServerMode = SuperServer w firebird.conf) spróbuje nałożyć wyłączną blokadę na bazę danych, więc inne połączenia nie będą mogły uzyskać dostępu do bazy danych (lub próba gbak zakończy się niepowodzeniem z powodu aktywnych połączeń).

Firebird 2.5: W przypadku Firebird 2.5 w systemie Windows polecenie będzie działać poprawnie przez protokół XNET (jeśli masz uruchomioną tylko jedną instancję Firebird, oczywiście). W systemie Linux Firebird spróbuje użyć dostępu osadzonego, a jeśli nie jest on dostępny, automatycznie (i niejawnie) spróbuje połączyć się przez TCP/IP. (Jeśli nie wiesz, co oznacza XNET, INET itp., zobacz Ściągawkę ciągów połączeń Firebird).

Uwaga 1: To polecenie działa na koncie użytkownika systemu operacyjnego (tj. Twoim) i używa jego uprawnień do dostępu do plików kopii zapasowej i bazy danych.

Zazwyczaj usługa Firebird w systemie Windows działa na koncie LocalSystem, a w systemie Linux na użytkowniku „firebird”, ale konsola jest zwykle uruchamiana na Twoim własnym koncie użytkownika.

Jeśli to konto użytkownika nie ma dostępu do ścieżki bazy danych lub ścieżki kopii zapasowej, gbak zakończy się niepowodzeniem z błędem „Cannot open backup file” (zobacz przykład w Dodatku A. Błędy, #5).

Uwaga 2: gbak -b po cichu nadpisuje plik kopii zapasowej. Jeśli więc masz już backup1.fbk, zostanie on nadpisany.

Uwaga 3: W systemie Linux to polecenie gbak utworzy plik kopii zapasowej z właścicielem równym użytkownikowi konsoli.

Czas tworzenia kopii zapasowej dla tego polecenia: 120 sekund

1.2. Lokalna kopia zapasowa za pomocą gbak, którą można wykonać online w systemie Windows

Ta sekcja jest przeznaczona tylko dla użytkowników Windows! Zazwyczaj musimy wykonać kopię zapasową, gdy mamy aktywne połączenia z bazą danych, więc zamiast połączenia osadzonego lepiej jawnie określić lokalny protokół, aby uniknąć nałożenia wyłącznej blokady na plik bazy danych przez sam gbak w Firebird 3, tj. XNET.

Dla Firebird 3.0:

Code
gbak -b xnet://c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Dla Firebird 2.5 możemy użyć lokalnego ciągu połączenia, który również użyje XNET:

Code
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

W systemie Linux Firebird nie obsługuje specyficznego lokalnego protokołu, takiego jak XNET w Windows, więc konieczne jest użycie ciągu połączenia TCP/IP (zobacz sekcję 1.3).

Ponadto XNET działa tylko dla pojedynczej instancji Firebird, więc jeśli uruchamiasz kilka instancji Firebird w systemie Windows, łatwiej może być użyć ciągu połączenia w stylu INET, aby określić docelową instancję serwera.

Czas tworzenia kopii zapasowej: 139 sekund

1.3. Kopia zapasowa za pomocą gbak z ciągiem połączenia TCP/IP

To najbardziej uniwersalne polecenie gbak do wykonywania kopii zapasowej online.

Windows

Code
gbak -b localhost:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b localhost:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

W tym przypadku, podając localhost: na początku ścieżki bazy danych, połączenie jest wykonywane przez podsystem sieciowy Firebird.

Jest to nieco wolniejsze niż dostęp lokalny, ale działa we wszystkich przypadkach, gdy mamy uruchomiony serwer akceptujący połączenia.

Niestandardowy port dla Firebird

Jeśli Firebird działa na niestandardowym porcie (np. 3051 zamiast 3050), możesz wykonać kopię zapasową w ten sposób:

Windows

Code
gbak -b localhost/3051:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b localhost/3051:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

Czas tworzenia kopii zapasowej: 182 sekundy

1.4. Szybsza kopia zapasowa za pomocą gbak z Service Manager

Jak możemy osiągnąć uniwersalność połączenia TCP/IP, z obsługą niestandardowego portu i szybką lokalną kopią zapasową? Użyjmy Service Manager! Service Manager, w prostych słowach, to sposób na uruchamianie standardowych narzędzi przez silnik Firebird. Należy pamiętać, że w przypadku Service Manager nie ma potrzeby podawania nazwy serwera w ścieżce do bazy danych, tylko w parametrze -se.

Windows

Code
gbak -b -se localhost:service_mgr c:\Data\test1.fdb  c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey

To polecenie używa przełącznika -service, aby określić, że chcemy użyć Service Manager instancji Firebird na porcie 3050 do wykonania kopii zapasowej.

W tym przypadku kopia zapasowa zostanie wykonana bezpośrednio wewnątrz procesu Firebird (ma on kopię kodu gbak), a ponieważ komunikacja wewnątrzprocesowa jest znacznie szybsza, kopia zapasowa będzie w tym przypadku znacznie szybsza.

Jeśli Firebird działa na niestandardowym porcie (np. 3051), polecenie może wyglądać tak:

Code
gbak -b -se localhost/3051:service_mgr c:\Data\test1.fdb  c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Uwaga: Istnieje znaczące ograniczenie w Firebird 2.5 i Firebird 3.0.0-3.0.5 (usunięte dopiero w 3.0.6): wiersz poleceń (wszystkie parametry i ścieżki dla bazy danych i kopii zapasowej) musi być krótszy niż 256 znaków.

Jeśli osiągniesz ten limit, na przykład z powodu długich ścieżek bazy danych i kopii zapasowej, możesz zadeklarować alias dla bazy danych w databases.conf (3.0 i nowsze) lub aliases.conf (2.5):

Code
mydb1=c:\Data\test1.fdb #Windows

lub

Code
mydb1=/db/test1.fdb  #linux

a następnie użyć go w naszym poleceniu:

Windows

Code
gbak -b -se localhost:service_mgr mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey

Czas tworzenia kopii zapasowej: 115 sekund

1.5. Najszybsza kopia zapasowa za pomocą gbak z wyłączonym odśmiecaniem

Aby przyspieszyć tworzenie kopii zapasowej, dodajmy przełącznik -g

Code
 -G(ARBAGE_COLLECT)    wyłącz odśmiecanie

Tak więc polecenie tworzenia kopii zapasowej będzie następujące:

Windows

Code
gbak -b -se localhost:service_mgr -g mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Linux

Code
gbak -b -se localhost:service_mgr -g mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey

Przełącznik -g wymusza na silniku Firebird wyłączenie odśmiecania dla procesu tworzenia kopii zapasowej w pliku bazy danych.

Nie oznacza to, że śmieciowe wersje rekordów zostaną zapisane w pliku kopii zapasowej; oznacza to, że serwer nie będzie próbował czyścić istniejących śmieci w bazie danych podczas tworzenia kopii zapasowej, a kopia zapasowa będzie szybsza.

Zdecydowanie zalecamy użycie tego przełącznika, ponieważ uważamy, że odśmiecanie i związane z nim czyszczenie powinno być wykonywane przez sweep (gfix -sweep lub autosweep), więc lepiej nie traktować gbak jako jakiejkolwiek alternatywy dla sweep.

Czas tworzenia kopii zapasowej: 105 sekund

1.6. Kopia zapasowa do udziału sieciowego lub lokalizacji sieciowej

Co jeśli musimy umieścić plik kopii zapasowej w udziale sieciowym?

W systemie Windows

Częste źródło zamieszania dla nowych użytkowników Firebird: ręczna kopia zapasowa (gdy uruchamiasz polecenie z wiersza poleceń) za pomocą prostego gbak -b do udziału sieciowego działa poprawnie, ale szybka wersja gbak z -se localhost:service_mgr nie działa.

Powodem jest to, że Firebird w systemie Windows działa na koncie LocalSystem, które nie ma dostępu do lokalizacji sieciowych (chyba że te udziały sieciowe mają skonfigurowany dostęp dla grupy „Everyone”, ale jest to bardzo, bardzo niebezpieczne w naszej erze oprogramowania ransomware).

Rozwiązaniem jest uruchomienie usługi Firebird w systemie Windows na koncie z wystarczającymi uprawnieniami do dostępu do udziału sieciowego oraz jednocześnie wystarczającymi uprawnieniami do dostępu do lokalnych plików bazy danych i plików systemowych w C:\ProgramData\Firebird. Dobrym pomysłem jest również skonfigurowanie parametru RestrictAccess w firebird.conf.

W systemie Linux

Ponieważ Firebird w systemie Linux działa na koncie „firebird”, zamontuj udział sieciowy z mapowaniem do użytkownika „firebird”, aby usługa Firebird mogła uzyskać dostęp do lokalizacji sieciowej w taki sam sposób, jak do lokalnego dysku.

1.7. Prosta kopia zapasowa z serwera zdalnego na maszynę lokalną

Możliwe jest wykonanie kopii zapasowej bazy danych z serwera zdalnego na maszynę lokalną.

Przykładowe polecenie poniżej uruchamiane jest na komputerze z systemem Windows, uzyskuje dostęp do bazy danych na serwerze Linux (z adresem IP 192.168.0.108, ale oczywiście można również użyć nazwy hosta serwera), a plik kopii zapasowej zapisywany jest do folderu C:\Data na Windows):

Code
gbak -b -user SYSDBA -pass masterkey 192.168.0.108:/db/test1.fdb c:\data\remotebackup1.fbk

Czas tworzenia kopii zapasowej: 568 sekund

To polecenie będzie zwykle znacznie wolniejsze niż lokalna kopia zapasowa, ponieważ gbak odczytuje dane z serwera zdalnego i przesyła rekordy przez sieć.

1.8. Szybsza kopia zapasowa z serwera zdalnego na maszynę lokalną za pomocą Service Manager

Polecenie poniżej jest szybsze niż tradycyjna kopia zapasowa z serwera zdalnego na maszynę lokalną, opisana w #1.7

Code
gbak -b -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb stdout > C:\Data\remoteback1.fbk

Używa ono Service Manager do wykonania kopii zapasowej na serwerze zdalnym, ale dane wyjściowe są wysyłane do potoku stdout, a następnie przekierowywane do pliku lokalnego.

To polecenie jest zwykle o 15%-20% szybsze niż w #1.7 (Prosta kopia zapasowa z serwera zdalnego na maszynę lokalną), z następujących powodów:

  1. wykonuje kopię zapasową przez Service Manager na serwerze zdalnym, więc wszystkie operacje odczytu i kompresji są wykonywane w najszybszy sposób,
  2. przez sieć przesyłany jest tylko wynikowy plik kopii zapasowej, którego rozmiar jest mniejszy niż dane w bazie danych

Jednak w przypadku tego polecenia nie jest możliwe włączenie trybu szczegółowego i zapisanie szczegółowych danych wyjściowych do pliku dziennika.

Czas tworzenia kopii zapasowej: 473 sekund

1.9. Kopia zapasowa bazy danych Firebird na serwerze zdalnym na ten sam serwer zdalny za pomocą Service Manager

Za pomocą Service Manager można wywołać kopię zapasową gbak bazy danych na serwerze zdalnym i zapisać ją również na tym samym serwerze zdalnym.

Code
gbak -b -se  192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb /db/back12.fbk

To polecenie przez Service Manager wywołuje kopię zapasową na serwerze zdalnym, z instrukcją zapisania pliku kopii zapasowej również na tym samym serwerze sieciowym.

Oczywiście lokalizacja kopii zapasowej powinna być dostępna dla usługi Firebird (na Linux działa ona jako użytkownik „firebird”, na Windows jako konto LocalSystem).

1.10. Kopia zapasowa bazy danych Firebird 6x szybsza dzięki wielowątkowej kopii zapasowej w Firebird 5 (lub HQbird 2.5/3.0/4.0/5.0)

Jeśli nadal nie jesteś zadowolony z wydajności kopii zapasowej gbak Firebird, rozważ migrację do Firebird 5 (lub użyj korporacyjnej dystrybucji Firebird: HQbird dla innych wersji).

Obsługuje ona wielowątkową kopię zapasową, która umożliwia nawet 6x szybsze operacje kopii zapasowej za pomocą gbak.

Code
gbak -b -par 8  -se localhost:service_mgr -g C:\Data\testbigdb1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkey

Jak widać, istnieje nowy parametr -par 8, który sprawia, że gbak używa 8 wątków do utworzenia kopii zapasowej.

HQbird wykonuje zadania konserwacyjne (sweep, kopia zapasowa, przywracanie) znacznie szybciej (wyniki na poniższym rysunku pochodzą oczywiście z innej bazy danych):

2. Przywracanie za pomocą narzędzia Gbak

Mamy plik kopii zapasowej backup1.fbk, utworzony jednym z powyższych poleceń, i musimy go przywrócić w szybki i wydajny sposób.

Załóżmy, że plik znajduje się w C:\Data\backup1.fbk w przypadku Windows lub /db/backup1.fbk w przypadku Linux.

2.1. Najprostsze polecenie przywracania

Na Windows

Code
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

Na Linux

Code
gbak -c /db/backup1.fbk /db/new1.fdb -user SYSDBA -pass masterkey

Przede wszystkim należy zauważyć, że gbak -c nie nadpisuje pliku bazy danych, a jeśli istnieje plik C:\data\new1.fdb lub /db/new1.fdb, gbak zwróci błąd informujący, że baza danych już istnieje.

Następnie, to polecenie działa w rzeczywistości bardzo różnie na 2.5/3.0+ oraz Windows/Linux.

Na Linux, to polecenie użyje dostępu osadzonego do utworzonej bazy danych (jeśli oczywiście nie zmieniłeś kolejności dostawców Firebird w firebird.conf) zarówno dla 3.0, jak i 2.5.

Na Windows, na Firebird 3.0 z domyślną kolejnością dostawców, będzie to dostęp osadzony, na 2.5 - XNET.

Następnie, to polecenie tworzy plik z prawami użytkownika, który uruchomił gbak - jest to szczególnie ważne na Linux - jeśli uruchomisz taki gbak jako root, właścicielem pliku bazy danych będzie root, a proces Firebird, który działa jako użytkownik „firebird”, nie będzie mógł uzyskać dostępu do przywróconego pliku.

Uwaga dla użytkowników Linux

Wiele osób, aby „naprawić” własność, nadaje uprawnienia dostępu do przywróconej bazy danych dla wszystkich, tj. coś w rodzaju „chmod 777 database”, ale jest to bardzo niebezpieczne; właściwym sposobem jest zmiana właściciela bazy danych na firebird za pomocą następującego polecenia:

Code
chown firebird /db/new1.fdb

Ogólnie rzecz biorąc, to polecenie jest wystarczająco dobre do prostego przywracania baz danych nieprodukcyjnych (używanych do testów lub w rozwoju).

Czas przywracania: 275 sekund

2.2. Przywracanie z ciągiem połączenia localhost

Najbardziej uniwersalną, ale nie najszybszą opcją przywracania jest następująca:

Windows

Code
gbak -c C:\Data\backup1.fbk localhost:C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey

Niestandardowy port

Jeśli Firebird działa na niestandardowym porcie, na przykład 3051, można go określić w poleceniu przywracania:

Windows

Code
gbak -c C:\Data\backup1.fbk localhost/3051:C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c /db/backup1.fbk localhost/3051:/db/new1.fdb -user SYSDBA -pass masterkey

Czas przywracania: 1225 sekund

2.3. Przywracanie z XNET na Windows

Aby przyspieszyć przywracanie, na Windows możemy użyć XNET (dla Firebird 3.0 i nowszych):

Code
gbak -c C:\Data\backup1.fbk xnet://C:\Data\New2.fdb -user SYSDBA -pass masterkey

Na Firebird 2.5 na Windows, dostęp XNET będzie używany z prostą linią poleceń (jeśli działa tylko jedna instancja Firebird):

Code
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

Czas przywracania: 585 sekund

2.4. Szybsze przywracanie za pomocą Service Manager

A najszybszym sposobem przywracania jest użycie Service Manager

Windows

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c -se localhost:service_mgr /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey

Za pomocą przełącznika -se wywołujemy Service Manager na adresie localhost i instruujemy go, aby wykonał kod przywracania wewnątrz silnika Firebird.

Gdy przywracanie jest wykonywane przez Service Manager, utworzony plik bazy danych będzie należał do konta uruchomionej instancji Firebird (procesu) - jest to „firebird” na Linux i LocalSystem na Windows.

Czas przywracania: 244 sekund

2.5. Niewskazany przełącznik

W pewnym momencie możesz mieć pokusę użycia następującego przełącznika:

Code
   -R(ECREATE_DATABASE) [O(VERWRITE)] create (or replace if OVERWRITE used)                               database from backup file (restore)
Code
w celu wymuszenia zastąpienia istniejącej bazy danych nową.

Z naszego doświadczenia wynika, że ten przełącznik znacznie zwiększa ryzyko przypadkowego nadpisania produkcyjnej bazy danych.

Zdecydowanie zalecamy przywracanie bazy danych za każdym razem z nową nazwą i jej zmianę, a także jawne usunięcie starej bazy danych.

Nie podamy nawet przykładu polecenia z tym przełącznikiem.

2.6. Przywracanie bazy danych za pomocą aliasu

Możliwe jest przywrócenie bazy danych za pomocą aliasu zadeklarowanego w databases.conf (lub aliases.conf w Firebird 2.5)

Na przykład mamy następującą deklarację:

Code
restdb=c:\Data\newrest1.fdb  #Windows

restdb=/db/newrest1.fdb  #Linux

Możemy więc uruchomić następujące polecenie, aby przywrócić kopię zapasową do ścieżki określonej przez alias

Windows

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk restdb -user SYSDBA -pass masterkey

Linux

Code
gbak -c -se localhost:service_mgr /db/backup1.fbk restdb -user SYSDBA -pass masterkey

2.7. Przywracanie lokalnej kopii zapasowej na serwer zdalny

Możliwe jest przywrócenie lokalnego pliku kopii zapasowej na zdalny serwer Firebird.

W tym przykładzie przywracamy plik kopii zapasowej zapisany na Windows na serwer Linux (jego adres IP to 102.168.0.108):

Code
gbak  -c C:\Data\backup1.fbk 192.168.0.108:/db/newdb1.fdb -user SYSDBA -pass masterkey

Czas przywracania: 7009 sekund

Jak możesz zauważyć, proces zdalnego przywracania działa bardzo wolno. Czy możemy go przyspieszyć za pomocą Service Manager?

2.8. Przywracanie lokalnej kopii zapasowej na serwer zdalny za pomocą Service Manager

Aby przywrócić lokalną kopię zapasową na serwerze zdalnym za pomocą Service Manager, konieczne jest zastosowanie triku ze strumieniem wejściowym stdin:

Code
gbak -c -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey stdin /db/new3.fdb <  C:\Data\backup1.fbk

To polecenie wywołuje przywracanie na serwerze zdalnym ze standardowego wejścia stdin jako źródła kopii zapasowej - i dostarcza dane wejściowe za pomocą części polecenia < C:\Data\backup1.fbk.

Wygląda to nieco skomplikowanie? Ale to łatwy sposób na 10-krotne zwiększenie wydajności gbak przy przywracaniu na serwer zdalny!

Czas przywracania: 450 sekund

2.9. Przywracanie bardzo długich tabel

Jeśli masz naprawdę dużą bazę danych z łączną liczbą wierszy przekraczającą 2 miliardy, konieczne jest określenie przełącznika -o[ne_at_a_time], aby przywrócić każdą tabelę w osobnej transakcji i uniknąć wewnętrznego przepełnienia.

Code
gbak -c -se localhost:service_mgr -one C:\Data\backup1.fbk C:\data\new44.fdb -user SYSDBA -pass masterkey

3. Dostrajanie i rejestrowanie procesów kopii zapasowej i przywracania

3.1. Gbak z pełnym wyjściem

Domyślnie gbak jest bardzo cichym narzędziem - nie zwraca nic w przypadku pomyślnego wykonania. Aby włączyć tryb szczegółowy, możemy dodać przełącznik -v[erify]

Code
gbak -b -se localhost/3050:service_mgr -g mydb1  c:\Data\backup1.fbk -v -user SYSDBA -pass masterkey

W rezultacie będzie więcej szczegółów. Drobny, ale irytujący problem polega na tym, że drukowanie danych wyjściowych na konsolę może sprawić, że szczegółowa kopia zapasowa będzie znacznie wolniejsza niż wersja cicha, więc dobrym pomysłem będzie zapisanie dziennika do pliku za pomocą przełącznika - y logfile:

Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1  c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

Uwaga: gbak nie nadpisze istniejącego pliku dziennika! Jeśli w tym przykładzie masz już C:\data\backuplog1.txt, kopia zapasowa zgłosi błąd (patrz #3 w Dodatku A).

Uwaga 2: istnieje opcja -verbint do kontrolowania interwału raportowania liczby przetworzonych rekordów podczas kopii zapasowej lub przywracania.

3.2. Dodawanie statystyk wydajności do pełnego wyjścia

W pełnym wyjściu gbak dla kopii zapasowej i przywracania możemy zobaczyć komunikaty takie jak:

Code
gbak:    writing data for table COUNTRY
gbak:16 records written

dla każdej tabeli i innych obiektów bazy danych.

Interesujące jest ustalenie, które tabele/obiekty zajmują najwięcej czasu, prawda?

W tym celu konieczne jest użycie przełącznika -st(atistics):

Code
 -ST(ATISTICS) TDRW    show statistics:
     T                 time from start
     D                 delta time
     R                 page reads
     W                 page writes
Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -st tdrw c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

Po zastosowaniu doda on do dziennika następujące kolumny:

Code
gbak: time   delta  reads  writes

dzięki czemu będziemy mogli zobaczyć czas i operacje wejścia/wyjścia dla każdej linii.

3.3. Wykluczanie tabel z kopii zapasowej i/lub z przywracania

Jeśli uważasz, że niektóre tabele można wykluczyć z kopii zapasowej (dobrym przykładem jest bardzo długa tabela dzienników), możesz określić je w parametrze SK[IP_DATA], używając wyrażenia regularnego jako parametru.

W poniższym przykładzie wykluczamy dane z tabel COUNTRY i JOB z kopii zapasowej:

Code
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -SKIP_D ‘(COUNTRY|JOB)’ c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt

A w poniższym przykładzie wykluczamy tabelę CLIENT z przywracania:

Code
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new33.fdb -user SYSDBA -pass masterkey -SKIP_D "CLIENT"

Proszę zauważyć, że parametr do SKIP_DATA musi być przekazany jako pojedynczy parametr, więc musi być w cudzysłowie!

W systemie Linux cudzysłowy powinny być pojedyncze, w Windows - podwójne.


Środki ostrożności przy wykluczaniu tabel z kopii zapasowej i/lub przywracania

Zdecydowanie zalecamy sprawdzenie warunku wyrażenia regularnego przed jego użyciem, za pomocą następującego zapytania - zwróci ono listę tabel, które odpowiadają warunkowi filtra (w zapytaniu cudzysłowy są zawsze pojedyncze):

Code
SQL> SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE TRIM(RDB$RELATION_NAME) SIMILAR TO '(COUNTRY|JOB)';

RDB$RELATION_NAME
===============================
COUNTRY
JOB

Proszę zauważyć, że tabele z kopii zapasowej lub przywracania zostaną wykluczone niezależnie od istniejących ograniczeń (kluczy obcych), więc jeśli nie zaplanowałeś takiego wykluczenia ostrożnie, bardzo łatwo jest otrzymać błąd „Cannot commit foreign key index” podczas procesu przywracania.

3.4. Pobieranie hasła do kopii zapasowej lub przywracania z pliku

Jeśli nie jesteś zwolennikiem ujawniania hasła wszystkim, którzy widzą Twoje polecenia, spodoba Ci się następujący przełącznik: -fetch passwordfile

Stwórzmy plik z hasłem w C:\Data\passfile.txt i użyjmy go (tutaj używamy bardzo prostej wbudowanej wersji, oczywiście przełącznik będzie działać również z Service Managerem):

Code
gbak -b c:\Data\test1.fdb c:\Data\backup5.fbk -user SYSDBA -fetch C:\Data\passfile.txt

Są 2 praktyczne korzyści:

  1. Jeśli przechowujemy hasło w pojedynczym pliku, możemy zapewnić, że wszystkie nasze pliki poleceń będą zawsze używać aktualnego hasła.
  2. Nie ujawniamy hasła w każdym pliku poleceń.

4. Jednoetapowa kopia zapasowa-przywracanie

Często celem kopii zapasowej jest natychmiastowe przywrócenie, aby uzyskać nową świeżą bazę danych, na przykład w celu zastosowania nowego rozmiaru strony dla bazy danych lub migracji istniejącej bazy danych z wersji 2.5 do 3.0.

W takim przypadku możliwe jest wykonanie kopii zapasowej-przywracania za pomocą pojedynczego polecenia, używając standardowego wejścia i wyjścia jako źródeł dla odpowiednich poleceń, aby pominąć tworzenie pośredniego pliku kopii zapasowej, zmniejszyć wymagania dotyczące wolnego miejsca i przyspieszyć proces.

Polecenie jest następujące:

Code
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout | gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdb

W istocie wykonujemy tutaj 2 polecenia, połączone symbolem |,

pierwsze do kopii zapasowej na stdout:

Code
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout

a drugie do przywracania ze stdin:

Code
gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdb

To polecenie jest najszybszym sposobem na wykonanie kopii zapasowej-przywracania na tej samej instancji Firebird.

Proszę zauważyć: do konwersji baz danych za pomocą jednoetapowej kopii zapasowej-przywracania z wersji 2.5 do 3.0 konieczne jest użycie 2 instancji Firebird, szczegóły znajdziesz tutaj.

5. Podsumowanie wydajności

Poniższy rysunek zawiera informacje o szybkości różnych poleceń kopii zapasowej lokalnej kopii testowej bazy danych:

Jak widać, najszybszym sposobem na wykonanie lokalnej kopii zapasowej jest użycie Service Managera (przełącznik -se[rvice]) i zahamowanie zbierania śmieci (przełącznik -ig).

W przypadku kopii zapasowej z serwera zdalnego na maszynę lokalną, Service Manager również jest najlepszą opcją:

Sytuacja z wydajnością przywracania jest podobna: Service Manager jest najszybszym sposobem na przywracanie.

Jeśli chodzi o dość rzadki przypadek, gdy przywracanie jest wykonywane z lokalnej kopii zapasowej na serwer zdalny, użycie Service Managera ze sztuczką stdin jest jedynym realnym wyborem:

Bardzo często zadawane pytanie dotyczące maszyn wirtualnych i kopii zapasowych Firebird

Dlaczego powinienem używać narzędzi do kopii zapasowych Firebird, skoro dostępne są popularne narzędzia do kopii zapasowych, które obiecują wykonać kopię wszystkiego?

Albo: robię kopię zapasową całego obrazu maszyny wirtualnej, dlaczego miałbym się martwić o kopię zapasową bazy danych Firebird?

Odpowiedź znajduje się tutaj.

Dodatek A. Błędy podczas kopii zapasowej/przywracania

  1. Próba uruchomienia gbak bez parametrów lub z użytkownikiem niebędącym właścicielem bazy danych/niebędącym SYSDBA doprowadzi do następującego błędu:
Code
gbak: ERROR:Unable to perform operation.  You must be either SYSDBA or owner of the database
gbak:Exiting before completion due to errors
  1. Jeśli podasz błędne hasło, pojawi się następujący błąd:
Code
gbak: ERROR:Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
gbak:Exiting before completion due to errors
  1. Błąd występuje, gdy istniejący plik jest określony jako miejsce docelowe logu szczegółowego:
Code
gbak: ERROR:cannot open status and error output file C:\data\backuplog1.txt
gbak: ERROR:    Exiting before completion due to errors
gbak:Exiting before completion due to errors
  1. Błąd występuje, jeśli istniejąca baza danych jest określona w poleceniu przywracania gbak jako miejsce docelowe:
Code
gbak: ERROR:database C:\data\new1.fdb already exists.  To replace it, use the -REP switch
gbak:Exiting before completion due to errors
  1. Błąd występuje, gdy gbak próbuje zapisać kopię zapasową w lokalizacji, do której nie ma wystarczających uprawnień do zapisu.
Code
gbak: ERROR:cannot open file  /db/test1.fbk
gbak:Exiting before completion due to errors
  1. Gdy gbak próbuje uzyskać dostęp do pliku bez uprawnień - na przykład plik ma innego właściciela niż użytkownik „firebird” w systemie Linux:
Code
gbak: ERROR:no permission for read-write access to database /db/test1.fdb
gbak: ERROR:    IProvider::attachDatabase failed when loading mapping cache
gbak:Exiting before completion due to errors
  1. Próba użycia wyjścia szczegółowego:
Code
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -v -st tdrw -user SYSDBA -pass masterkey /db/test1.fdb stdout  >
 c:\data\rembackup2.fbk
gbak: ERROR:standard output is not supported when using split operation or in verbose mode
gbak: ERROR:    Exiting before completion due to errors
gbak:Exiting before completion due to errors
  1. Próba wykonania kopii zapasowej z Service Managerem na zdalnym serwerze z włączonym trybem szczegółowym i zapisem do pliku logu.
Code
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -v -st tdrw -y lg1.txt  -user SYSDBA -pass masterkey /db/test1.f
db stdout  > c:\data\rembackup2.fbk
gbak: ERROR:Invalid clumplet buffer structure: string length doesn't match with clumplet
gbak:Exiting before completion due to errors
  1. Błąd w jednoetapowej kopii zapasowej-przywracaniu, gdy kopia zapasowa nie powiedzie się z jakiegoś powodu:
Code
gbak: ERROR:No request from user for stdin data
gbak:Exiting before completion due to errors
  1. Jeśli próbujesz przekazać do gbak plik niebędący kopią zapasową:
Code
gbak: ERROR:unavailable database
gbak:Exiting before completion due to errors
gbak: ERROR:expected backup description record
gbak:Exiting before completion due to errors
  1. Kopia zapasowa uszkodzonego pliku bazy danych z błędną stroną zgłosi następujący błąd (numer i plik bazy danych będą oczywiście różne):
Code
gbak: ERROR:database file appears corrupt (E:\DATABASE1.FDB)
gbak: ERROR:    wrong page type
gbak: ERROR:    page 9294588 is of wrong type (expected 8, found 0)
gbak: ERROR:gds_$get_segment failed
gbak:Exiting before completion due to errors
gbak: ERROR:Unexpected I/O error while reading from backup file
gbak:Exiting before completion due to errors

Kontakt

Prosimy o kontakt z nami w przypadku jakichkolwiek pytań lub zgłaszania błędów czy literówek: [email protected]