Každá verze Firebird má vlastní verzi formátu diskových struktur databáze – O(n)D(isk)S(tructure). Až do verze 2.5 včetně mohl Firebird pracovat s ODS předchozích verzí, což znamená, že databáze z starších verzí byly otevřeny novou verzí a fungovaly v režimu kompatibility. Nicméně Firebird 3.0 pracuje pouze s databázemi v vlastní ODS verzi 12.0.
Abychom přešli na 3.0, je nutné převést databázi z 2.5 do nového formátu prostřednictvím backup/restore. Předpokládáme, že databáze byla předem připravena na konverzi – tj. metadata a dotazy byly zkontrolovány na kompatibilitu s Firebird 3.0.
Pokud se držíme standardního přístupu, to znamená, že je třeba provést zálohu na verzi 2.5, poté nainstalovat 3.0 a provést obnovení. Tento postup je přijatelný, pokud je dostatek času, ale při migraci velkých databází, nebo při současné migraci několika desítek databází, kdy je čas omezen, je možné využít streamovou konverzi, která je o 30–40 % rychlejší. Jak to provést (na Windows a Linuxu), si přečtěte níže.
Hlavní myšlenka spočívá v tom, že pro urychlení využijeme pipeline:
gbak -b … database25 stdout | gbak -c … stdin database30Gbak z 2.5 generuje zálohu ve lineárním formátu a směruje ji do stdout, který hned přes stdin zachytí gbak z 3.0 a vytvoří novou databázi.
Takový pipeline je třeba organizovat nutně prostřednictvím lokální (souborové) metody přístupu, protože síťový přístup (i přes localhost) významně zpomalí proces.
Níže se zabýváme detaily pro Windows a Linux.
Windows
V případě Windows je nejjednodušší udělat zcela autonomní sestavení Firebird. K tomu vezmeme , přejmenujeme fbembed.dll na fbclient.dll, přidáme z archivu "běžného" 2.5 nástroje gbak.exe a (nepovinně) – isql.exe.
Firebird 3.0 používá a nevyžaduje žádné úpravy.
Nejmenší varianta (nevyžadující instalaci runtime knihoven VS2008/VS2010 na cílovém systému) obsahuje následující 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.dllZkušený administrátor si může všimnout, že ve verzi 2.5 nejsou zahrnuty soubory intl/fbintl.dll a intl/fbintl.conf. To je opravdu pravda, protože gbak nepoužívá charset připojení a neprovádí konverzi dat mezi charsets, ale na 'přijímací' straně Firebird 3.0 jsou tyto soubory nezbytné při vytváření indexů.
V souboru firebird.conf se doporučuje přidat následující do Firebird 3.0:
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1Je také žádoucí nastavit různé hodnoty IpcName pro verze 2.5 a 3.0.
Při volbě hodnot dalších parametrů firebird.conf vycházíme z jednoduchého předpokladu: během načítání dat v jednom procesu gbak pracuje na verzi 2.5, a ve druhém – 3.0, poté 2.5 dokončí práci, zatímco 3.0 začne vytvářet indexy.
Abychom urychlili fázi vytváření indexů ve verzi 3.0, doporučuje se zvýšit velikost parametru TempCacheLimit na ~40% RAM (pokud se jedná o dedikovaný server, samozřejmě).
Například, pokud má server 16 GB RAM, lze nastavit
TempCacheLimit=6GSamozřejmě, takovou hodnotu lze použít pouze u 64bitového Firebirdu 3, protože jakýkoli 32bitový proces nemůže alokovat více než 2 GB paměti.
U 2.5 není třeba tento parametr měnit – i tak nemůže být větší než 2 GB, a při zálohování na rychlost nemá vliv.
Před provedením operace je nutné zkontrolovat, že je stránkový cache v hlavičce databáze nastaven na 0 (příkaz gstat -h databasename, podívejte se na řádek Page buffers).
Pokud je cache explicitně nastavena v hlavičce DB, přepisuje hodnoty z firebird.conf (a databases.conf ve verzi 3.0) a v případě neadekvátně vysokých hodnot může vést k nadměrné spotřebě paměti a odeslání do swapu.
Dále zkopírujeme soubory na cílový systém.
Konverze se provádí po zastavení 'systémové' služby Firebird 2.5, v příkazovém řádku s privilegii místního administrátora (příklad):
set ISC_USER=vlastník
"25/gbak" -z -b -g -v -st t -y 25.log databáze25 stdout|^
"30/gbak" -z -c -v -st t -y 30.log stdin databáze30V tomto příkladu se používá 'přímá lomítka' v uvozovkách (povolený 'unix-style'), a 'středník' (symbol '^') escapuje znak nového řádku, což je pohodlné při psaní dlouhých příkazů. Možnost -st(atus) se objevila ve Firebird 2.5.8 a umožňuje zaznamenat do protokolu údaje o časovém výkonu procesu gbak (více informací je v dokumentaci).
Linux
Na Linuxu Firebird 3 závisí na knihovně tommath. V CentOS (RHEL) se tato knihovna nachází v epel repozitáři, v Ubuntu (Debian) v – systémovém.
Pro CentOS je potřeba nejprve připojit repozitář epel a až potom provést
yum install libtommathU Ubuntu není potřeba připojovat další repozitáře, ale v Ubuntu 16 a Ubuntu 18 se instalují různé verze balíčků – libtommath0 a libtommath1, odpovídajícím způsobem.
Firebird 3.0 hledá tommath.so.0 a pro Ubuntu 18 je navíc potřeba vytvořit odkaz (symlink) c tommath.so.0 na tommath.so.1. Nejprve je třeba najít tommath.so.1.
Hledaná cesta v Ubuntu je /usr/lib/x86_64-linux-gnu/, ale v jiných Debian-based distribucích to může být jinak.
Druhý problém souvisí s tím, že do Firebird 3.0.1, včetně, nebyl jednoduchý způsob, jak nainstalovat dvě různé verze serveru. Variantu „kompilace ze zdrojových kódů s potřebným prefixem“ nezvažujeme kvůli její relativní pracnosti.
Pro Firebird 3.0.2 a vyšší je realizováno a samostatná možnost instalátoru (-path cesta).
Předpokládaje, že knihovna tommath a, pokud je to nutné, symlink pro tommath.so.0 jsou přidány do systému, lze doinstalovat aktuální (v době psaní tohoto článku) distribuci Firebird 3.0.4 do, například, \/opt\/fb3:
./install.sh -path \/opt\/fb3Po tom lze zastavit systémovou službu Firebird a spustit kontinuální konverzi.
Při zastavení Firebird je třeba brát v úvahu, že procesy Firebird 2.5 v režimu Classic obvykle spouští xinetd – proto je potřeba buď zakázat službu firebird pro xinetd, nebo zastavit xinetd úplně.
Ve firebird.conf pro 3.0 na Linuxu není potřeba nastavovat parametry MaxUnflushed (ty fungují pouze na Windows) a měnit nastavení Firebird 2.5.
V Linuxu místní (souborový) přístup Firebird 2.5 není ekvivalentní embedded variantě na Windows – server 2.5 bude fungovat v procesu gbak (bez síťové části), ale práva přístupu budou kontrolována podle databáze uživatelů, a tím pádem bude potřeba nejen přihlašovací jméno, ale i heslo:
export ISC_USER=username ISC_PASSWORD=password
\/opt\/firebird\/bin\/gbak -b … databáze25 stdout
|\/opt\/fb3\/bin\/gbak -c … stdin databáze30Po úspěšné konverzi je třeba nejprve odstranit „další“ Firebird 3.0, poté „hlavní“ Firebird 2.5 a až poté provést čistou instalaci Firebird 2.5 – nejlépe z oficiálního instalátoru tar.gz, nikoli prostřednictvím repozitářů, protože verze v repozitářích může být zastaralá.
Také po restauraci DB na Linuxu a přeinstalaci je třeba zkontrolovat, aby měla nová DB vlastníka uživatele firebird.
Pokud tomu tak není, bude potřeba to opravit
chown firebird.firebird databázeVýsledek
Kromě úspory času a místa na disku má také proudová konverze jednu důležitou výhodu – přetváření databáze probíhá bez odstranění stávajícího Firebirdu 2.5, což značně zjednodušuje návrat k předchozí verzi při neúspěšné konverzi (nejčastěji kvůli nedostatku místa nebo neočekávanému restartu během procesu migrace).
Úspora času souvisí s tím, že "klasická" konverze znamená "čas zálohování" plus "čas obnovení". Obnovení se skládá ze dvou částí: čtení dat ze záložního souboru a vytváření indexu.
Při proudové konverzi se celkový čas získá jako "čas zálohování plus pět až deset procent" a "čas vytváření indexů".
Konkrétní výsledky závisí na struktuře databáze, ale průměrná doba obnovení je přibližně dvojnásobkem času zálohování. Proto, pokud vezmeme jako jednotku čas zálohování, má "klasická konverze" čas tři jednotky, zatímco proudová konverze čas dvě jednotky. Další zkrácení času pomáhá zvýšení hodnoty TempCacheLimit.
Celkově, proudová konverze prakticky umožňuje ušetřit 30-40% času v porovnání s postupným zálohováním a obnovováním.
Máte otázky?
Prosím, všechny dotazy pište do komentářů nebo je posílejte autorovi metodiky a spoluautorovi tohoto článku – Vasiliu Sidorovovi, vedoucímu systémovému inženýrovi společnosti "iBase", na adresu bs at ibase ru.
Pouze registrovaní uživatelé se mohou účastnit ankety. , prosím.
Jakou verzi Firebirdu používáte?
Firebird 3.x
Firebird 2.5
Firebird 2.1
Firebird 2.0, 1.5 nebo 1.0
Hlasovalo 16 uživatelů. Zdržel se 1 uživatel.
Zdroj: habr.com
