Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

Stručný průvodce zálohováním a obnovou pomocí Gbak

Co je gbak?

1. Zvládnutí zálohování pomocí Gbak

1.0 Příprava

1.1 Nejjednodušší záloha Firebird pomocí příkazu gbak

1.2. Lokální záloha pomocí gbak, kterou lze provést online na Windows

1.3. Záloha pomocí gbak s TCP/IP připojovacím řetězcem

1.4. Rychlejší záloha pomocí gbak se Service Manager

1.5. Nejrychlejší záloha pomocí gbak se Service Manager a zakázaným garbage collection

1.6. Záloha na síťovou sdílenou složku nebo síťové umístění

1.7. Jednoduchá záloha ze vzdáleného serveru na lokální počítač

1.8. Rychlejší záloha ze vzdáleného serveru na lokální počítač se Service Manager

1.9. Záloha databáze Firebird na vzdáleném serveru na stejný vzdálený server pomocí Service Manager

1.10. Záloha databáze Firebird 6x rychleji s Firebird 5 (nebo HQbird v 2.5/3.0/4.0/5.0)

2. Obnova pomocí nástroje Gbak

2.1. Nejjednodušší příkaz pro obnovu

2.2. Obnova s localhost připojovacím řetězcem

2.3. Obnova s XNET na Windows

2.4. Rychlejší obnova se Service Manager

2.5. Nedoporučovaný přepínač

2.6. Obnova databáze pomocí aliasu

2.7. Obnova lokální zálohy na vzdálený server

2.8. Obnova lokální zálohy na vzdálený server se Service Manager

2.9. Obnova extrémně dlouhých tabulek

3. Ladění a protokolování procesů zálohy a obnovy

3.1. Gbak s verbose výstupem

3.2. Přidání statistik výkonu do verbose výstupu

3.3. Vyloučení tabulek ze zálohy a/nebo z obnovy

3.4. Načtení hesla pro zálohu nebo obnovu ze souboru

4. Jednokroková záloha-obnova

5. Shrnutí výkonu

Velmi časté dotazy o VM a zálohách Firebird

Dodatek A. Chyby během zálohy/obnovy

Kontakty

Co je gbak?

Gbak je standardní nástroj příkazového řádku Firebird (viz jeho oficiální dokumentace zde), navržený k provádění 1) plné zálohy databáze: přečte každý záznam v databázi a uloží je do záložního souboru, 2) obnovy zálohy do nové databáze.

Pro vývojáře a administrátory se zkušenostmi s jinými RDBMS může být termín „záloha“ trochu matoucí, protože gbak nevytváří přesnou kopii databáze, ale soubor v nedatabázovém formátu, pouze s daty (indexy jsou uloženy jako deklarace).

Pro vytvoření databáze ze záložního souboru gbak je nutné provést proces obnovy pomocí gbak.

1. Zvládnutí zálohování pomocí Gbak

1.0. Příprava

Vytvořme složku C:\data a vložme tam nějakou databázi. Použijeme 5GB databázi z Firebird OLTP-EMUL test, ale můžete samozřejmě použít vlastní databázi.

Pro uživatele Linuxu - vytvořme složku /db a změňme jejího vlastníka na „firebird“ a zkopírujme tam databázi (ujistěte se, že jejím vlastníkem je také firebird).

Code
mkdir /db
chown firebird -R /db

1.1 Nejjednodušší záloha Firebird pomocí příkazu 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

V tomto příkladu nástroj gbak přistupuje k souboru databáze pomocí lokálního nebo embedded přístupu.

Firebird 3.0: Embedded přístup ve výchozí konfiguraci pro Firebird 3.0 (s parametrem ServerMode = SuperServer v firebird.conf) se pokusí umístit exkluzivní zámek na databázi, takže ostatní připojení nebudou mít k databázi přístup (nebo se pokus gbak nezdaří kvůli aktivním připojením).

Firebird 2.5: S Firebird 2.5 na Windows bude příkaz fungovat dobře přes protokol XNET (pokud máte samozřejmě spuštěnou pouze jedinou instanci Firebird). Na Linuxu se Firebird pokusí použít embedded přístup; pokud není dostupný, automaticky (a implicitně) se pokusí připojit přes TCP/IP. (Pokud nevíte, co znamená XNET, INET atd., podívejte se prosím na Firebird Connection Strings Cheat Sheet).

Poznámka 1: Tento příkaz běží pod účtem OS uživatele (tj. vaším) a používá jeho oprávnění pro přístup k záložním a databázovým souborům.

Obvykle služba Firebird na Windows běží pod účtem LocalSystem a na Linuxu pod uživatelem „firebird“, ale konzole se obvykle spouští pod vaším vlastním uživatelským účtem.

Pokud tento uživatelský účet nemá přístup k cestě databáze nebo cestě zálohy, gbak selže s chybou „Cannot open backup file“ (viz příklad v Dodatku A. Chyby, #5).

Poznámka 2: gbak -b tiše přepíše záložní soubor. Takže pokud již máte backup1.fbk, bude přepsán.

Poznámka 3: Na Linuxu tento příkaz gbak vytvoří záložní soubor s vlastníkem rovným uživateli konzole.

Čas zálohy pro tento příkaz: 120 sekund

1.2. Lokální záloha pomocí gbak, kterou lze provést online na Windows

Tato část je pouze pro uživatele Windows! Obvykle potřebujeme provést zálohu, zatímco máme aktivní připojení k databázi, takže místo embedded připojení je lepší explicitně zadat lokální protokol, aby se zabránilo umístění exkluzivního zámku na soubor databáze samotným gbak ve Firebird 3, tj. XNET.

Pro Firebird 3.0:

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

Pro Firebird 2.5 můžeme použít lokální připojovací řetězec a bude také používat XNET:

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

Na Linuxu Firebird nepodporuje specifický lokální protokol jako XNET na Windows, takže je nutné použít TCP/IP připojovací řetězec (viz část 1.3).

Také XNET funguje pouze pro jedinou instanci Firebird, takže pokud spouštíte několik instancí Firebird na Windows, může být jednodušší použít připojovací řetězec typu INET k určení cílové instance serveru.

Čas zálohy: 139 sekund

1.3. Záloha pomocí gbak s TCP/IP připojovacím řetězcem

Toto je nejuniverzálnější příkaz gbak pro provedení online zálohy.

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

V tomto případě zadáním localhost: na začátku cesty k databázi se připojení provádí přes síťový subsystém Firebird.

Je to mírně pomalejší než lokální přístup, ale funguje ve všech případech, kdy máme spuštěný server, který přijímá připojení.

Nestandardní port pro Firebird

Pokud máte Firebird spuštěný na nestandardním portu (např. 3051 místo 3050), můžete provést zálohu tímto způsobem:

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

Čas zálohy: 182 sekund

1.4. Rychlejší záloha pomocí gbak se Service Manager

Jak můžeme dosáhnout univerzálnosti TCP/IP připojení s podporou nestandardního portu a rychlé lokální zálohy? Použijme Service Manager! Service Manager, zjednodušeně řečeno, je způsob, jak spouštět standardní nástroje prostřednictvím enginu Firebird. Vezměte prosím na vědomí, že v případě Service Manager není nutné zadávat název serveru v cestě k databázi, pouze v parametru -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

Tento příkaz používá přepínač -service k určení, že chceme použít Service Manager instance Firebird na portu 3050 k provedení zálohy.

V tomto případě bude záloha provedena přímo uvnitř procesu Firebird (má kopii kódu gbak), a protože komunikace v rámci procesu je mnohem rychlejší, záloha bude v tomto případě výrazně rychlejší.

Pokud Firebird běží na nestandardním portu (např. 3051), příkaz může vypadat takto:

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

Poznámka: Existuje významné omezení ve Firebird 2.5 a Firebird 3.0.0-3.0.5 (odstraněno až ve 3.0.6): příkazový řádek (všechny parametry a cesty pro databázi a zálohu) musí být kratší než 256 znaků.

Pokud narazíte na tento limit, například kvůli dlouhým cestám databáze a zálohy, můžete deklarovat alias pro databázi v databases.conf (3.0 a vyšší) nebo aliases.conf (2.5):

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

nebo

Code
mydb1=/db/test1.fdb  #linux

a poté jej použít v našem příkazu:

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

Čas zálohy: 115 sekund

1.5. Nejrychlejší záloha pomocí gbak se zakázaným garbage collection

Aby byla záloha ještě rychlejší, přidejme přepínač -g

Code
 -G(ARBAGE_COLLECT)    zakázat garbage collection

Takže příkaz zálohy bude následující

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

Přepínač -g nutí engine Firebird zakázat garbage collection pro proces zálohy v souboru databáze.

To neznamená, že verze záznamů s garbage budou uloženy v záložním souboru; znamená to, že server se nebude snažit čistit existující garbage v databázi během zálohy, a záloha bude rychlejší.

Důrazně doporučujeme používat tento přepínač, protože věříme, že garbage collection a související čištění by mělo být prováděno pomocí sweep (gfix -sweep nebo autosweep), takže je lepší nepovažovat gbak za jakoukoli alternativu sweep.

Čas zálohy: 105 sekund

1.6. Záloha na síťovou sdílenou složku nebo síťové umístění

Co když potřebujeme umístit záložní soubor do síťové sdílené složky?

Na Windows

Častý zmatek nových uživatelů Firebird: ruční záloha (když spustíte příkaz z příkazového řádku) s jednoduchým gbak -b do síťové sdílené složky funguje dobře, ale rychlá verze gbak s -se localhost:service_mgr nefunguje.

Důvodem je, že Firebird na Windows běží pod účtem LocalSystem, který nemá přístup k síťovým umístěním (pokud tyto síťové sdílené složky nemají nakonfigurovaný přístup pro skupinu „Everyone“, ale to je v naší éře ransomwaru velmi, velmi nebezpečné).

Řešením je spustit službu Firebird na Windows pod účtem s dostatečnými právy pro přístup k síťové sdílené složce a zároveň s dostatečnými právy pro přístup k lokálním souborům databáze a systémovým souborům v C:\ProgramData\Firebird. Také je dobrý nápad nakonfigurovat parametr RestrictAccess v firebird.conf.

Na Linuxu

Protože Firebird na Linuxu běží pod účtem „firebird“, připojte síťovou sdílenou složku s mapováním na uživatele „firebird“, takže služba Firebird bude mít přístup k síťovému umístění stejným způsobem jako k lokálnímu disku.

1.7. Jednoduchá záloha ze vzdáleného serveru na lokální počítač

Je možné zálohovat databázi ze vzdáleného serveru na lokální počítač.

Příklad příkazu níže začíná na počítači s Windows, přistupuje k databázi na Linux serveru (s IP adresou 192.168.0.108, ale samozřejmě lze použít i hostname serveru) a záložní soubor je uložen do složky C:\Data na Windows):

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

Čas zálohy: 568 sekund

Tento příkaz bude obvykle mnohem pomalejší než lokální záloha, protože gbak čte data ze vzdáleného serveru a přenáší záznamy přes síť.

1.8. Rychlejší záloha ze vzdáleného serveru na lokální pomocí Service Manager

Následující příkaz je rychlejší než tradiční záloha ze vzdáleného serveru na lokální počítač, popsaná v #1.7

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

Používá Service Manager k provedení zálohy na vzdáleném serveru, ale výstup je odesílán do stdout pipe a poté přesměrován do lokálního souboru.

Tento příkaz je obvykle o 15%-20% rychlejší než v #1.7 (Jednoduchá záloha ze vzdáleného serveru na lokální), a to z následujících důvodů:

  1. provádí zálohu prostřednictvím Service Manager na vzdáleném serveru, takže všechny operace čtení a komprese jsou prováděny nejrychlejším způsobem,
  2. přes síť přenáší pouze výsledný záložní soubor, jehož velikost je menší než data v databázi

Nicméně u tohoto příkazu není možné povolit verbose režim a ukládat podrobný výstup do logovacího souboru.

Čas zálohy: 473 sekund

1.9. Záloha Firebird databáze na vzdáleném serveru na stejný vzdálený server pomocí Service Manager

Se Service Manager je možné vyvolat gbak zálohu databáze na vzdáleném serveru a uložit ji také na stejný vzdálený server.

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

Tento příkaz prostřednictvím Service Manager vyvolá zálohu na vzdáleném serveru s instrukcí uložit záložní soubor také na stejný síťový server.

Samozřejmě, umístění zálohy musí být přístupné službě Firebird (na Linuxu běží jako uživatel „firebird", na Windows jako účet LocalSystem).

1.10. Záloha Firebird databáze 6x rychleji s vícevláknovou zálohou ve Firebird 5 (nebo HQbird 2.5/3.0/4.0/5.0)

Pokud stále nejste spokojeni s výkonem zálohování Firebird gbak, zvažte migraci na Firebird 5 (nebo použijte enterprise distribuci Firebird: HQbird pro jiné verze).

Podporuje vícevláknovou zálohu, která umožňuje až 6x rychlejší operace zálohování s gbak.

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

Jak vidíte, existuje nový parametr -par 8, který způsobí, že gbak použije 8 vláken pro vytvoření zálohy.

HQbird provádí údržbové úlohy (sweep, záloha, obnova) mnohem rychleji (výsledky na obrázku níže jsou samozřejmě z jiné databáze):

2. Obnova pomocí nástroje Gbak

Máme záložní soubor backup1.fbk, vytvořený jedním z příkazů výše, a potřebujeme jej obnovit rychlým a efektivním způsobem.

Předpokládejme, že soubor je v C:\Data\backup1.fbk v případě Windows, nebo /db/backup1.fbk v případě Linux.

2.1. Nejjednodušší příkaz pro obnovu

Na Windows

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

Na Linuxu

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

Především si prosím všimněte, že gbak -c nepřepisuje soubor databáze, a pokud existuje soubor C:\data\new1.fdb nebo /db/new1.fdb, gbak vrátí chybu, že databáze již existuje.

Dále tento příkaz funguje velmi odlišně na 2.5/3.0+ a Windows/Linux.

Na Linuxu tento příkaz použije embedded přístup k vytvořené databázi (pokud jste samozřejmě nezměnili pořadí poskytovatelů Firebird v firebird.conf) pro 3.0 i 2.5.

Na Windows, na Firebird 3.0 s výchozím pořadím poskytovatelů, to bude embedded přístup, na 2.5 - XNET.

Tento příkaz vytvoří soubor s právy uživatele, který spustil gbak - to je důležité zejména na Linuxu - pokud spustíte takový gbak pod root, vlastníkem souboru databáze bude root a proces Firebird, který běží pod uživatelem „firebird", nebude schopen přistupovat k obnovenému souboru.

Poznámka pro uživatele Linuxu

Mnoho lidí, aby „opravili" vlastnictví, aplikuje oprávnění pro všechny, aby měli přístup k obnovené databázi, tj. něco jako „chmod 777 database", ale to je velmi nezabezpečené. Správný způsob je změnit vlastníka databáze na firebird následujícím příkazem:

Code
chown firebird /db/new1.fdb

Obecně je tento příkaz dostatečně dobrý pro jednoduchou obnovu neprodukčních databází (používaných pro testování nebo vývoj).

Čas obnovy: 275 sekund

2.2. Obnova s localhost připojovacím řetězcem

Nejuniverzálnější, ale ne nejrychlejší možnost obnovy je následující:

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

Nestandardní port

Pokud Firebird běží na nestandardním portu, například 3051, lze jej zadat v příkazu obnovy:

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

Čas obnovy: 1225 sekund

2.3. Obnova s XNET na Windows

Pro mírně rychlejší obnovu můžeme na Windows použít XNET (pro Firebird 3.0 a vyšší):

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

Na Firebird 2.5 na Windows bude XNET přístup použit s jednoduchým příkazovým řádkem (pokud běží pouze jedna instance Firebird):

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

Čas obnovy: 585 sekund

2.4. Rychlejší obnova se Service Manager

A nejrychlejší způsob obnovy je použít 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

S přepínačem -se vyvoláme Service Manager na adrese localhost a instruujeme jej, aby provedl obnovovací kód uvnitř enginu Firebird.

Když je obnova provedena Service Manager, vytvořený soubor databáze bude vlastněn účtem běžící instance Firebird (procesu) - na Linuxu je to „firebird" a na Windows LocalSystem.

Čas obnovy: 244 sekund

2.5. Nedoporučovaný přepínač

V určitém okamžiku byste mohli mít pokušení použít následující přepínač:

Code
   -R(ECREATE_DATABASE) [O(VERWRITE)] create (or replace if OVERWRITE used)                               database from backup file (restore)
Code
aby se vynutilo nahrazení existující databáze novou.

Podle našich zkušeností tento přepínač výrazně zvyšuje šance na náhodné přepsání produkční databáze.

Důrazně doporučujeme obnovovat databázi pokaždé s novým názvem a přejmenovat ji, stejně jako explicitně smazat starou databázi.

Dokonce neposkytneme ani příklad příkazu s tímto přepínačem.

2.6. Obnova databáze pomocí aliasu

Je možné obnovit databázi pomocí aliasu, deklarovaného v databases.conf (nebo aliases.conf ve Firebird 2.5)

Například máme následující deklaraci:

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

restdb=/db/newrest1.fdb  #Linux

Můžeme tedy spustit následující příkaz pro obnovu zálohy do cesty určené aliasem:

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. Obnova lokální zálohy na vzdálený server

Je možné obnovit lokální záložní soubor na vzdálený Firebird server.

V tomto příkladu obnovujeme záložní soubor uložený na Windows na Linux server (jeho IP adresa 102.168.0.108):

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

Čas obnovy: 7009 sekund

Jak si můžete všimnout, proces vzdálené obnovy funguje velmi pomalu. Můžeme jej urychlit pomocí Service Manager?

2.8. Obnova lokální zálohy na vzdálený server se Service Manager

Pro obnovu lokální zálohy na vzdáleném serveru se Service Manager je nutné provést trik se vstupním proudem stdin:

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

Tento příkaz vyvolá obnovu na vzdáleném serveru se standardním vstupem stdin jako zdrojem zálohy - a dodává vstup pomocí části příkazu < C:\Data\backup1.fbk.

Vypadá to trochu záludně? Ale je to snadný způsob, jak 10x zvýšit výkon gbak pro obnovu na vzdálený server!

Čas obnovy: 450 sekund

2.9. Obnova extrémně dlouhých tabulek

Pokud máte opravdu velkou databázi s celkovým počtem řádků více než 2 miliardy, je nutné zadat přepínač -o[ne_at_a_time], aby se každá tabulka obnovila v samostatné transakci a předešlo se vnitřnímu přetečení.

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

3. Ladění a logování procesů zálohy a obnovy

3.1. Gbak s verbose výstupem

Ve výchozím nastavení je gbak velmi tichý nástroj, při úspěšném provedení nevrací nic. Pro povolení verbose režimu můžeme přidat přepínač -v[erify]

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

Výsledkem bude více podrobností. Menší, ale nepříjemný problém je, že tisk výstupu do konzole může způsobit, že verbose záloha bude výrazně pomalejší než tichá varianta, takže dobrý nápad je uložit log do souboru s přepínačem - 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

Poznámka: gbak nepřepíše existující logovací soubor! Pokud již máte C:\data\backuplog1.txt v tomto příkladu, záloha vyvolá chybu (viz #3 v Příloze A).

Poznámka 2: existuje možnost -verbint pro řízení intervalu hlášení počtu zpracovaných záznamů během zálohy nebo obnovy.

3.2. Přidání statistik výkonu do verbose výstupu

Ve verbose výstupu gbak pro zálohu a obnovu můžeme vidět zprávy jako tyto:

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

pro každou tabulku a další databázové objekty.

Je zajímavé zjistit, které tabulky/objekty zabírají nejvíce času, že?

Pro to je nutné použít přepínač -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 aplikování přidá do logu následující sloupce:

Code
gbak: time   delta  reads  writes

takže budeme moci vidět čas a IO strávené na každém řádku.

3.3. Vyloučení tabulek ze zálohy a/nebo z obnovy

Pokud si myslíte, že některé tabulky mohou být vyloučeny ze zálohy (dobrým příkladem je velmi dlouhá logovací tabulka), můžete je zadat v parametru SK[IP_DATA] s regulárním výrazem jako parametrem.

V níže uvedeném příkladu vyloučíme zálohování dat z tabulek COUNTRY a JOB:

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 v níže uvedeném příkladu vyloučíme tabulku CLIENT z obnovy:

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

Upozorňujeme, že parametr pro SKIP_DATA musí být předán jako jediný parametr, proto musí být v uvozovkách!

Na Linuxu by uvozovky měly být jednoduché, na Windows - dvojité.


Opatření při vyloučení tabulek ze zálohy a/nebo obnovy

Důrazně doporučujeme před použitím zkontrolovat podmínku regulárního výrazu pomocí následujícího dotazu - vrátí seznam tabulek, které odpovídají podmínce filtru (v dotazu jsou uvozovky vždy jednoduché):

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

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

Upozorňujeme, že tabulky ze zálohy nebo obnovy budou vyloučeny bez ohledu na existující omezení (cizí klíče), takže pokud toto vyloučení pečlivě neplánujete, je velmi snadné získat během procesu obnovy chybu „Cannot commit foreign key index“.

3.4. Získání hesla pro zálohu nebo obnovu ze souboru

Pokud nejste velkým fanouškem myšlenky vystavit heslo všem, kdo vidí vaše příkazy, bude se vám líbit následující přepínač: -fetch passwordfile

Vytvořme soubor s heslem v C:\Data\passfile.txt a použijme jej (zde používáme velmi jednoduchou vestavěnou variantu, samozřejmě přepínač bude fungovat i se Service Managerem):

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

Existují 2 praktické výhody:

  1. Pokud ukládáme heslo do jediného souboru, můžeme zajistit, že všechny naše příkazové soubory budou vždy používat aktuální heslo.
  2. Nevystavujeme heslo v každém příkazovém souboru.

4. Jednokroková záloha-obnova

Často je cílem zálohy provést okamžitou obnovu, abychom získali novou čerstvou databázi, například pro aplikaci nové velikosti stránky pro databázi, nebo pro migraci stávající databáze z 2.5 na 3.0.

V tomto případě je možné provést zálohu-obnovu jediným příkazem, pomocí standardního vstupu a výstupu jako zdrojů pro příslušné příkazy, abychom se vyhnuli vytváření mezilehlého záložního souboru, snížili požadavky na volné místo a urychlili proces.

Příkaz je následující:

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

V podstatě zde provádíme 2 příkazy, spojené symbolem |,

první pro zálohu na stdout:

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

a druhý pro obnovu ze stdin:

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

Tento příkaz je nejrychlejší způsob, jak provést zálohu-obnovu na stejné instanci Firebirdu.

Upozorňujeme: pro konverzi databází pomocí jednokrokové zálohy-obnovy z 2.5 na 3.0 je nutné použít 2 instance Firebirdu, podrobnosti naleznete zde.

5. Souhrn výkonu

Následující obrázek obsahuje informace o rychlosti různých příkazů zálohy lokální zálohy testovací databáze:

Jak vidíte, nejrychlejší způsob, jak provést lokální zálohu, je použít Service Manager (přepínač -se[rvice]) a potlačit garbage collection (přepínač -ig).

Pro zálohu ze vzdáleného serveru na lokální počítač je Service Manager také nejlepší volbou:

Situace s výkonem obnovy je podobná: Service Manager je nejrychlejší způsob obnovy.

Pokud jde o poměrně vzácný případ, kdy se obnova provádí z lokální zálohy na vzdálený server, použití Service Manageru s trikem stdin je jedinou životaschopnou volbou:

Velmi častý dotaz o VM a zálohách Firebirdu

Proč bych měl používat nástroje pro zálohování Firebirdu, když jsou k dispozici populární záložní nástroje, které slibují zálohu všeho?

Nebo: Zálohuji kompletní obraz virtuálního stroje, proč bych se měl starat o zálohu databáze Firebirdu?

Odpověď je zde.

Dodatek A. Chyby během zálohy/obnovy

  1. Pokus o spuštění gbak bez parametrů nebo s uživatelem, který není vlastníkem databáze/SYSDBA, povede k následující chybě:
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. Pokud zadáte nesprávné heslo, dojde k následující chybě:
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. Chyba nastane, když je jako cíl podrobného protokolu zadán existující soubor:
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. Chyba nastane, pokud je existující databáze zadána v příkazu obnovy gbak jako cíl:
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. Chyba nastane, když se gbak pokusí zapsat zálohu do umístění, kde nemá dostatečná práva pro zápis.
Code
gbak: ERROR:cannot open file  /db/test1.fbk
gbak:Exiting before completion due to errors
  1. Když se gbak pokusí o přístup k souboru bez oprávnění - například soubor má jiného vlastníka než uživatele „firebird“ na Linuxu:
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. Pokus o použití podrobného výstupu:
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. Pokus o zálohu pomocí Service Manageru na vzdáleném serveru s povoleným podrobným výstupem a ukládáním do souboru protokolu.
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. Chyba v jednokrokové záloze-obnově, když záloha z nějakého důvodu selže:
Code
gbak: ERROR:No request from user for stdin data
gbak:Exiting before completion due to errors
  1. Pokud se pokoušíte předat gbak něco, co není záloha:
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. Záloha poškozeného souboru databáze s nesprávnou stránkou nahlásí následující chybu (číslo a soubor databáze se samozřejmě budou lišit):
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

Kontakty

Neváhejte nás kontaktovat s jakýmikoli dotazy nebo nahlásit jakékoli chyby či překlepy: [email protected]