Prúdová konverzia databáz Firebird 2.5 do formátu ODS12 (Firebird 3.0)

Každá verzia Firebird má svoju vlastnú verziu formátu diskových štruktúr databázy – O(n)D(isk)S(tructure). Do verzie 2.5 vrátane mohol motor Firebird pracovať s ODS predchádzajúcich verzií, teda databázy zo starších verzií sa otvorili novou verziou a pracovali v režime kompatibility, ale motor Firebird 3.0 funguje iba s DB vo vlastnej ODS verzii 12.0.

Aby ste prešli na 3.0, databázu z 2.5 je potrebné previesť do nového formátu cez backup/restore. Predpokladáme, že DB bola predtým pripravená na konverziu — t.j. metadata a dopyty boli overené na kompatibilitu s Firebird 3.0.

Ak sa riadite štandardným prístupom, znamená to, že musíte vykonať zálohu na verzii 2.5, potom nainštalovať 3.0 a vykonať restore. Takýto proces je prijateľný, ak máte dostatok času, ale pri migrácii veľkých databáz, alebo pri súčasnej migrácii niekoľkých desiatok DB, keď čas tlačí, môžete využiť prúdovú konverziu, ktorá je o 30-40% rýchlejšia. Ako to presne spraviť (pod Windows a pod Linux), čítajte nižšie.

Celkovo ide o to, že na urýchlenie využijeme potrubie:

gbak -b … databáza25 stdout | gbak -c … stdin databáza30

Gbak z 2.5 generuje zálohu v lineárnom formáte a smeruje ju do stdout, ktorú okamžite cez stdin zachytáva gbak z 3.0 a vytvára novú DB.

Takéto potrubie je potrebné organizovať výlučne lokálnym (súborovým) prístupom, pretože sieťový prístup (aj cez localhost) značně spomaľuje proces.

Nižšie sa zaoberáme podrobnosťami pre Windows a Linux.

Windows

V prípade Windows je najjednoduchšie vytvoriť úplne samostatnú zostavu Firebird. Na to berieme embed-archív Firebird 2.5, premenováme fbemded.dll na fbclient.dll, pridáme z archívu "obyčajného" 2.5 utilitu gbak.exe a (nepovinne) – isql.exe.

Firebird 3.0 používa jednotnú zostavu a nevyžaduje žiadne úpravy.

Najjednoduchšia verzia (nevyžadujúca inštaláciu runtime knižníc VS2008/VS2010 na cieľovom systéme) obsahuje nasledujúce súbory:

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

Skúsený administrátor si môže všimnúť, že v 2.5 nie sú zahrnuté súbory intl/fbintl.dll a intl/fbintl.conf. Je to naozaj tak, pretože gbak nepoužíva charset pripojenia a nekonvertuje dáta medzi charsetmi, ale na "prijímacej" strane Firebird 3.0 sú tieto súbory nevyhnutné pri vytváraní indexov.

V súbore firebird.conf sa odporúča pridať Firebird 3.0:

MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1

Taktiež je žiaduce nastaviť rôzne hodnoty IpcName pre 2.5 a 3.0.

Pri výbere hodnôt iných parametrov firebird.conf vychádzame z jednoduchého predpokladu: v jednom procese gbak pracuje 2.5 počas prenosu dát, v inom – 3.0, potom 2.5 končí, a 3.0 začína budovanie indexov.

Aby sa urýchlil proces budovania indexov v 3.0, odporúča sa zvýšiť veľkosť parametra TempCacheLimit na ~40% RAM (ak je to dedikovaný server, samozrejme).

Napríklad, ak server má 16 GB RAM, môžete nastaviť

TempCacheLimit=6G

Samozrejme, túto hodnotu je možné nastaviť iba pre 64-bitový Firebird 3, pretože akýkoľvek 32-bitový proces nemôže alokovať viac ako 2 gigabajty pamäte.

Pre 2.5 nie je potrebné meniť tento parameter – aj tak nemôže prekročiť 2 gigabajty, a ani pri zálohovaní to neovplyvňuje rýchlosť.

Pred vykonaním operácie je potrebné skontrolovať, či je stránkový cache v hlavičke databázy nastavený na 0 (príkaz gstat -h databasename, pozrite riadok Page buffers).

Ak je cache zadaná priamo v hlavičke DB, prepisuje hodnoty z firebird.conf (a databases.conf v 3.0), a pri neprimerných veľkých hodnotách môže viesť k nadmernému vyťaženiu pamäte a swapovaniu.

Ďalej skopírujeme súbory na cieľový systém.

Konverzia sa vykonáva po zastavení "systémovej" služby Firebird 2.5, príkazovým riadkom s povolením lokálneho administrátora (príklad):

set ISC_USER=majiteľ
"25/gbak" -z -b -g -v -st t -y 25.log databáza25 stdout|^
"30/gbak" -z -c -v -st t -y 30.log stdin databáza30

V tomto príklade sa používa "priama lomka" v úvodzovkách (platný "unix-style"), a "hatsymbol" (symbol "^") escapeuje znak nového riadku, čo je pohodlné pri písaní dlhých príkazov. Možnosť -st(atus) sa objavila vo Firebird 2.5.8 a umožňuje zaznamenať do protokolu údaje o čase trvania procesu gbak (podrobnosti – v dokumentácii).

Linux

Na Linuxe Firebird 3 závisí od knižnice tommath. V CentOS (RHEL) sa táto knižnica nachádza v repozitári epel, v Ubuntu (Debian) v – systémovom.

Pre systém CentOS je najprv potrebné pripojiť repo epel a až potom pokračovať s

yum install libtommath

Na Ubuntu nie je potrebné pripojiť ďalšie repozitáre, avšak v Ubuntu 16 a Ubuntu 18 sa inštalujú rôzne verzie balíkov – libtommath0 a libtommath1, príslušne.

Firebird 3.0 hľadá tommath.so.0 a pre Ubuntu 18 je navyše potrebné vytvoriť odkaz (symlink) z tommath.so.0 na tommath.so.1. Najprv treba nájsť tommath.so.1.

Hľadaná cesta v Ubuntu je – /usr/lib/x86_64-linux-gnu/, ale v iných distribúciách založených na Debiane to môže byť inak.

Druhý problém súvisí s tým, že pred Firebird 3.0.1, vrátane, neexistoval jednoduchý spôsob, ako nainštalovať dve rôzne verzie servera. Možnosť „kompilovať z zdrojového kódu s požadovaným prefixom“ nezvažujeme z dôvodu jeho relatívnej pracnosti.

Pre Firebird 3.0.2 a vyššie je implementovaná kompilácia s –enable-binreloc a samostatná možnosť inštalátora (-path cesta).

Predpokladajúc, že knižnica tommath a, v prípade potreby, symlink pre tommath.so.0 sú pridané do systému, môžete nainštalovať aktuálny (v čase písania tohto článku) distribučný balík Firebird 3.0.4 do, povedzme, /opt/fb3:

./install.sh -path /opt/fb3

Po tom môžete zastaviť systémovú službu Firebird a spustiť prúdovú konverziu.

Pri zastavení Firebird je potrebné zohľadniť, že procesy Firebird 2.5 v režime Classic zvyčajne spúšťa xinetd – preto je potrebné buď zakázať službu firebird pre xinetd, alebo úplne zastaviť xinetd.

V súbore firebird.conf pre 3.0 na Linuxe netreba nastavovať parametre MaxUnflushed (fungujú len na Windows) a meniť nastavenia Firebird 2.5.

Na Linuxe lokálny (súborový) prístup Firebird 2.5 nie je ekvivalentný variantu embeded pod Windows – server 2.5 bude fungovať v procese gbak (bez sieťovej časti), ale prístupové práva sa budú kontrolovať na základe databázy používateľov, teda budete potrebovať nielen prihlasovacie meno, ale aj heslo:

export ISC_USER=užívateľ ISC_PASSWORD=heslo
/opt/firebird/bin/gbak -b … databáza25 stdout
|/opt/fb3/bin/gbak -c … stdin databáza30

Po úspešnej konverzii je potrebné najprv odstrániť „dodatočný“ Firebird 3.0, potom „hlavný“ Firebird 2.5 a až potom vykonať čistú inštaláciu Firebird 2.5 — pričom je najlepšie to urobiť z oficiálneho inštalátora tar.gz, a nie cez repozitáre, keďže verzia v repozitároch môže zaostávať.

Taktiež, po obnove DB na Linuxe a reinstalácii je potrebné skontrolovať, či nová DB má vlastníka používateľa firebird.

Ak nie, bude potrebné to opraviť

chown firebird.firebird databáza

Záver

Okrem úspory času a miesta na disku má postupná konverzia ešte jednu dôležitú výhodu – transformácia databázy sa vykonáva bez odstránenia existujúceho Firebirdu 2.5, čo značne zjednodušuje návrat pri neúspešnej konverzii (najčastejšie z dôvodu nedostatku miesta alebo neočakávaného reštartu počas procesu migrácie).

Úspora času je spojená s tým, že „klasická“ konverzia znamená „čas zálohovania“ plus „čas obnovy“. Obnova sa skladá z dvoch častí: čítania údajov zo zálohovacieho súboru a budovania indexu.

Pri postupnej konverzii sa celkový čas vypočítava ako „čas zálohovania plus päť až desať percent“ a „čas budovania indexov“.

Konkrétne výsledky závisia od štruktúry databázy, ale v priemere je čas obnovy približne dvojnásobkom času zálohovania. Preto ak vezmeme ako jednotku čas zálohovania, tak „klasická konverzia“ – tri jednotky času, postupná – dve jednotky času. Ďalšie skrátenie času pomáha zvýšenie TempCacheLimit.

Celkovo, postupná konverzia v praxi umožňuje ušetriť 30-40% času sekvenčnej zálohy a obnovy.

Máte otázky?

Prosím, všetky otázky píšte do komentárov, alebo posielajte autorovi metodiky a spoluautorovi tohto článku — Vasilijovi Sidorovovi, vedúcemu systémovému inžinierovi spoločnosti „iBase“, na adresu bs at ibase ru.

Len registrovaní používatelia sa môžu zúčastniť prieskumu. Prihláste sa, prosím.

Akú verziu Firebirdu používate?

  • Firebird 3.x

  • Firebird 2.5

  • Firebird 2.1

  • Firebird 2.0, 1.5 alebo 1.0

Hlasovalo 16 používateľov. Zdržal sa 1 používateľ.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster