Rychlá konverze databází Firebird 2.5 na Firebird 3.0
Basil Sidorov, 02-04-2019, (c) IBSurgeon
Každá verze Firebirdu má svůj vlastní formát databáze - O(n)D(isk)S(truktura). Až do verze 2.5 může databázový engine pracovat s ODS předchozí verze, ale engine Firebirdu 3 pracuje pouze se svým vlastním ODS (verze 12.0).
Pro upgrade databáze z Firebirdu 2.5 na 3.0 je nutné zálohovat databázový soubor nástrojem gbak ve verzi 2.5 a poté jej obnovit ve verzi 3.0.
Samozřejmě je třeba databázi připravit na konverzi - metadata a dotazy je třeba zkontrolovat na kompatibilitu s Firebirdem 3.0 a po obnovení ve Firebirdu 3 musí být všechny objekty s BLR (triggery, uložené procedury atd.) rekompilovány.
Pokud použijeme standardní přístup, musíme provést zálohu databáze ve verzi 2.5 a poté nainstalovat Firebird 3 a obnovit záložní soubor.
To je v pořádku, pokud máte dostatek času. Ale když je vaše databáze velká, nebo máte desítky databází k migraci a jste časově omezeni, můžete použít streamovou konverzi, která je o 25-30 % rychlejší.
Myšlenka spočívá v použití dopravníku:
gbak -b … db25 stdout | gbak -c … stdin db30
Gbak -b z verze 2.5 zapisuje zálohu sekvenčně a směruje ji do stdout streamu, který je okamžitě čten ze stdin gbakem verze 3.0, který vytváří novou databázi.
Tento dopravník musí používat lokální přístup k databázi (embedded), protože síťové přenosy dat (i přes localhost) by proces výrazně zpomalily.
Níže se podíváme na to, jak provést streamovou zálohu v systému Windows a v systému Linux.
Windows
Pro Windows je lepší vytvořit speciální sadu souborů Firebirdu. Musíme vzít embedded archiv Firebirdu 2.5, přejmenovat fbembed.dll na fbclient.dll a přidat gbak.exe a volitelně isql.exe.
Pro Firebird 3.0 použijeme standardní archiv.
Minimální sada (která nevyžaduje běhové prostředí VS2008/VS2010) obsahuje tyto soubory:
25/gbak.exe
25/fbclient.dll
25/firebird.conf
25/firebird.log
25/firebird.msg
25/ib_util.dll
25/icudt30.dll
25/icuin30.dll
25/icuuc30.dll
25/Microsoft.VC80.CRT.manifest
25/msvcp80.dll
25/msvcr80.dll
30/fbclient.dll
30/firebird.conf
30/firebird.msg
30/gbak.exe
30/ib_util.dll
30/icudt52.dll
30/icudt52l.dat
30/icuin52.dll
30/icuuc52.dll
30/msvcp100.dll
30/msvcr100.dll
30/intl/fbintl.conf
30/intl/fbintl.dll
30/plugins/engine12.dll
Zkušený administrátor/vývojář si může všimnout, že soubory 25/intl/fbintl.dll a 25/intl/fbintl.conf nejsou zahrnuty. To je pravda, protože gbak nepoužívá znakovou sadu pro připojení a nepřevádí data mezi znakovými sadami. Ale na přijímací straně, Firebird 3.0, jsou soubory icu* potřeba, protože znakové sady se používají při vytváření indexů (poslední krok zálohy/obnovy).
Doporučuje se přidat do firebird.conf Firebirdu 3 dva řádky:
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1
Také je dobré nastavit různé názvy pro parametr IpcName pro Firebird 2.5 a Firebird 3.0.
Další parametry, pokud si přejete, mohou být změněny s ohledem na to, že během konverze databáze Firebird 2.5 čte data a Firebird 3 zapisuje data a vytváří indexy.
Pro urychlení vytváření indexů doporučujeme zvýšit parametr TempCacheLimit na ~40 % dostupné paměti RAM (pokud se jedná o vyhrazený počítač nebo server).
Například, pokud máte 16 GB RAM, můžete nastavit
TempCacheLimit=6G
Samozřejmě, tuto hodnotu lze nastavit pouze při použití 64bitového Firebirdu 3, protože žádný 32bitový proces nemůže alokovat více než 2 gigabajty paměti RAM.
Tento parametr nemusíte měnit pro verzi 2.5, protože neovlivňuje rychlost zálohování a Firebird 2.5 sám nemůže pro tento parametr použít více než 2 gigabajty paměti RAM, ani v 64bitové verzi.
Před zahájením také zkontrolujte, že hodnota „page buffers“ je 0 na hlavičkové stránce databáze (gstat -h název_databáze).
Pokud je parametr „page buffers“ nastaven v hlavičce databáze, přepíše nastavení firebird.conf a v případě velké hodnoty může vést k obrovské spotřebě paměti a snížení výkonu konverzního procesu.
Poté zkopírujte připravenou sadu souborů do cílového systému.
Upozorňujeme, že před konverzí musíte zastavit běžnou službu Firebirdu 2.5.
Poté spusťte příkazový řádek se zvýšenými právy (Spustit jako správce):
set ISC_USER=<zadejte_vlastníka_vaší_databáze_nebo_sysdba>
set ISC_PASSWORD=heslo
"25/gbak" -z -b -g -v -st t -y 25.log db25 stdout|^
"30/gbak" -z -c -v -st t -y 30.log stdin db30
Zde je celý příkazový řádek uzavřen v uvozovkách, symbol | se používá pro zřetězení a symbol ^ se používá pro escapování konce řádku (je užitečný v případě dlouhých příkazových řádků).
Volba -st(atus) byla zavedena ve Firebirdu 2.5.8 a umožňuje zapisovat více informací o procesu zálohování do souboru protokolu.
Linux
Firebird 3 závisí na Linuxu na knihovně tommath. Na CentOS (RHEL) se tato knihovna nachází v epel-repozitáři, na Ubuntu (Debian) v systémovém repozitáři.
Na CentOS musíte nejprve povolit EPEL-repozitář a teprve poté spustit « yum install libtommath».
Na Ubuntu nemusíte připojovat další repozitáře, ale Ubuntu 16 a Ubuntu 18 mají různé verze balíčků - libtommath0 a libtommath1.
Firebird 3 hledá tommath.so.0 a pro Ubuntu 18 musíte vytvořit symlink z tommath.so.0 na tommath.so.1. K tomu nejprve musíte najít tommath.so.1. Obvyklá cesta na Ubuntu - /usr/lib/x86.64- linux -gnu/, ale v jiných distribucích založených na Debianu se může lišit.
Dalším problémem je, že až do Firebirdu 3.0.1 včetně neexistoval jednoduchý způsob, jak nainstalovat dvě různé verze serveru. Volba „kompilace ze zdrojových kódů s prefixem“ zde není zvažována.
Firebird 3.0.2 obsahuje opravu CORE‑5204: build s -enable-binreloc, (http://tracker.firebirdsql.org/browse/CORE-5204), a samostatnou volbu instalátoru -path.
Takže pokud je knihovna tommath a případně symlink tommath.so.0 nainstalován, můžete nainstalovat nejnovější distribuci Firebirdu 3.0.4 do /opt/fb3 následujícím příkazem: ./install.sh -path /opt/fb3
Poté můžete zastavit stávající Firebird 2.5 a spustit streamovou konverzi.
Pokud používáte Firebird 2.5 Classic, nezapomeňte, že Classic je obvykle spouštěn přes xinetd - takže musíte zakázat službu firebird pro xinetd nebo úplně zastavit xinetd.
Nemusíte nastavovat parametry MaxUnflushed* v firebird.conf Firebirdu 3 (protože fungují pouze na Windows) ani nic měnit ve Firebirdu 2.5.
Embedded přístup ve Firebirdu 2.5 na Linuxu není jako na Windows - Firebird 2.5 bude pracovat uvnitř procesu gbak (bez síťové části), ale přístupová práva budou kontrolována pomocí uživatelské databáze, takže je nutné zadat nejen uživatelské jméno vlastníka databáze, ale také heslo:
export ISC_USER=uživatelské_jméno ISC_PASSWORD=heslo
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30
Po úspěšné konverzi musíte odstranit „dočasnou instanci“ Firebirdu 3, poté odinstalovat původní verzi 2.5 a teprve poté můžete provést čistou instalaci Firebirdu 3.
Je lepší nainstalovat Firebird 3 z tar.gz, ne z repozitářů, protože tar.gz nainstaluje vše do vhodného umístění /opt/ firebird , a také verze Firebirdu v repozitářích je obvykle starší než v tar.gz.
Po dokončení konverze a instalaci Firebirdu 3 musíte zkontrolovat, že uživatel „firebird“ je vlastníkem databázového souboru.
Pokud ne, musíte to opravit:
chown firebird.firebird název_databáze
Shrnutí
Streamová konverze je rychlejší než standardní přístup (gbak -b, poté gbak -c), protože přeskočí operace „zápisu zálohy“ uprostřed - výsledkem je, že doba streamové konverze je přibližně „doba zálohování plus 10-15 %“ plus „doba vytvoření indexů“.
V naší praxi je streamová konverze nejméně o 25-30 % rychlejší než tradiční „sekvenční“ záloha a obnova.
Kromě úspory času a snížení požadavků na volné místo na disku má streamová konverze ještě jednu výhodu - nevyžaduje odstranění stávajícího Firebirdu 2.5, což vám umožňuje rychle se vrátit k verzi 2.5 v případě chyby během konverze.
Kontakty
Prosím, zasílejte zpětnou vazbu a dotazy na tým podpory IBSurgeon.