- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 07/98

Jak jsme přesouvali Interbase z NT na Linux

Daniel Prynych, 8. července 1998

Nedávno firma Interbase konečně uvolnila svůj hlavní produkt - SQL databázi Interbase (dále jen IB) - pro Linux. Jde o verzi 4.0 pro Red Hat Linux 4.2 a byla dána volně k dispozici ve variantě pro neomezený počet uživatelů. Protože jsme IB již asi rok provozovali (ve verzi pro Microsoft Windows NT Server 4.0), bylo rozhodnuto přejít na verzi pro Linux, který jsme již používali jako souborový (Samba) a tiskový server a to také proto, že s Windows NT jsme nebyli zcela spokojeni.

IB jsme používali pro tvorbu kusovníku. Kusovník je zjednodušeně řečeno seznam všech dílů pro výrobu stroje. Pro každý stroj existuje tabulka variant a každá součást může existovat v několika variantách. Všechny varianty dané součásti mají společnou hlavičku, která obsahuje základní informace jako je číslo dílu, jeho název atd. Každá varianta obsahuje údaje specifické pro danou součást a její variantu jako je číslo výkresu, ČSN, rozměry, váha atd. Jinak je možno používat kusovník i strukturovaně, to znamená, že pod každou součásti leží další součásti, něco jako stromová struktura adresáře. Jak je vidět, bylo nutno vytvořit několik tabulek, které jsou spolu navzájem svázány. Zápis se provádí jak do jedné tabulky, tak i do několika najednou a v tomto případě se musí provést buď do všech najednou nebo ani do jedné. To bylo jen malé odbočení a teď zpátky k IB.

Použili jsme technologii klient/server, přičemž klientské programy máme napsány v Delphi 2@. Proto měla vzniknout tato sestava: jako server bude pracovat IB na Linuxu a klientské programy poběží pod Windows 95 a Windows NT a s IB budou komunikovat za pomoci SQL-Links protokolem TCP/IP.

Přechod z IB na Windows NT na IB na Linuxu nebyl úplně jednoduchý, a to hlavně proto, že s touto konfigurací nebyly u nás ještě zkušenosti. Přecházelo se za plného provozu, ale nakonec byly všechny problémy vyřešeny.

Nejprve byly prováděny testy IB na RedHatu 4.2 (dále jen RH), pro který je IB certifikována, a RH 5.0 na různých počítačích. Samotná IB na obou systémech pracovala bez problémů, byly použity tyto konfigurace: AMD486/100 48MB, což je pod doporučenou hranicí, Pentium 130 64 MB a 2x Pentium Pro 180 128MB. Zkoušky byly prováděny s dodávaným front-end programem isql a to jak ze systému, na kterém běžela IB, tak i z vedlejších počítačů programem isql. Poté byla za pomoci gbak databáze na NT zazálohována, přesunuta na Linux a rekonstruována.

Tento postup je nutno dodržet, výhodou je i to, že se z databáze odstraní nepoužívaná data a položky se srovnají za sebe, což se projeví i na rychlosti. Při používání programu isql je zajímavé, že pokud se přihlásím jako ROOT, mám automaticky přístupová práva uživatele SYSDBA, (jedná se o uživatele definované v IB, s uživateli v Linuxu nemají nic společného), mohu tedy s databází provádět všechny operace jako bych byl její vlastník. Tento přístup se mně osobně moc nelíbí, neumožňuje totiž důsledně oddělit funkce správce systému a správce databáze. Jako další test byl sestaven v Delphi jednoduchý program, který v cyklu prohlížel jednu z tabulek databáze. Jednalo se o ceník obsahující asi 40 000 řádek a 15 sloupců zahrnujících jak řetězce znaků, tak celočíselné položky a reálná čísla. SQL příkaz byl postaven tak, že se vliv indexů prakticky neprojevil. Tento program byl spuštěn na třech počítačích - dva Win95 a jeden WinNT 4.0 - a to na každém třikrát. IB tentokrát běžela pod RH 4.2 na AMD 486/100, přesto zvládla zpracovávat neustále devět dotazů najednou. Rychlost sice nebyla velká, ale to se v této konfiguraci ani nedalo očekávat.

Dále jsem pokračoval napsáním programu v C, který bral data z textového souboru a na jejich základě opravoval a doplňoval výše zmíněný ceník. SQL příkazy jsem psal přímo do zdrojového textu a k jejich převodu na API IB funkce jsem použil dodávaný preprocesor gpre. Při tvorbě těchto programů je nutno příkaz SET DATABASE umístit na začátek programu, gpre je patrně jednoprůchodový preprocesor a jako první musí znát jméno databáze, aby mohl prohlédnout definice tabulek, nemůžeme ho tedy použít pro překlad programu, který pracuje s databází, ke které momentálně nemáme přístup. Pro tento případ musíme použít přímo příkazy API IB. Každý(é) příkaz(y) je nutno umístit do transakce např.

SET TRANSACTION
   SELECT COUNT (JK) INTO :pocet WHERE JK = :jk
COMMIT

Pro bližší vysvětlení doporučuji nahlédnout do dodávané dokumentace, a nedejte se odradit tím, že je zde probíráno IB API pro Windows. Překlad na RH 5.0 je trošku odlišný od RH 4.2 - nemůžeme použít

  gcc něco.c -lgdslib -ldl -lcrypt

překladač začne mít námitky

ld:warning: libdl.so.1, needed by\
   /usr/lib/libgdslib.so,\
   may conflict with libdl.so.2

Musíme přeložit za pomocí knihovny pipe.

  gcc něco.c -lgds -ldl

Rozdíl je v tom, že v druhém případě je navíc spuštěn proces gds_pipe, který pracuje jako prostředník mezi programem a IB.

Na straně klienta bylo nutno provést upgrade BDE na verzi 4.51 a bylo nutno upravit část programu v Delphi 2, protože při použití většího počtu query - v našem případě asi 15 - a znovuobnovení dat prováděné příkazy query.close; query.open; došlo ke ztrátě spojení s databází. Nahrazením query.close příkazem database.closedataset v kritických částech byly problémy odstraněny. Zajímavé je, že při použití protokolu NetBEUI k tomuto problému nedocházelo.

Nyní už mohla být IB definitivně nainstalována na RH 4.2 běžící na 2x Pentium Pro 180 s 128MB paměti. Samotná data sídlí na dvou SCSI 2MB discích. Nepoužíváme zrcadlení disků, ale využíváme možnosti IB, která umí zrcadlit data. Jedenkrát za den je pomocí gbak provedeno zálohovaní dat s týdenní rotací a je spouštěn program, který doplňuje a opravuje údaje v ceníku. Zajímavé je, že tento program původně napsaný v Delphi a běžící na WinNT a komunikující s IB pomocí DBE zpracovával data asi 1 hodinu. Prakticky stejný program psaný v C a používající API IB pracuje asi 5 minut. Vzhledem k tomu že v současné době přistupují k datům čtyři klientské počítače po celou pracovní dobu a tři další jen občas, je server zatížen jen velmi málo. Pokud porovnáme rychlost IB na NT a na Linuxu, tím myslím rychlost odezev pro klientské programy, zdá se prakticky stejná. IB zároveň běží na druhém počítači, kde slouží jako testovací databáze při opravách programů. Celkově mohu říci, že nasazení koncepce klient/server se nám osvědčilo, klientské počítače nezatěžují server zobrazováním dat a běžnými operacemi, obsluha je velmi snadná, naproti tomu server dodává svůj výkon pro operace s databází všem klientům a velmi snadno zajišťuje konzistenci dat.

Firma Interbase dodává pro Linux také modul pro komunikaci s Perlem. Na RH 5.0 ho bez úprav nepřeložíme. Musíme postupovat takto:

  1. rozbalíme ibperl-0_5_tar.gz
  2. v souboru Makefile.PL a Makefile.a změníme -lpgslib na -lpgs
  3. perl Makefile.PL
  4. make
  5. doporučeno: nahradit na řádcích INSTALL... /var/tmp/perl-root$(PREFIX)/lib/perl... za /usr/lib/perl...
  6. make install, pokud nahlásí při instalaci chybu, je nutno provést předchozí bod
  7. otestovat - perl test.pl nebo ./test.pl

Soubor IBPerl.pm by se měl nacházet v adresáři /usr/lib/perl5 a soubor IBPerl.so v adresáři perl5/site_perl/i386-linux/auto/IBPerl.

Co říci závěrem? IB je to, co Linuxu zatím chybělo - a to velmi výkonná SQL databáze s triggery a transakcemi, což je dnes pro bezpečné aplikace nutnost, zvlášť pokud se často mění a přidávají data. Na druhé straně front-end isql nevyniká právě přívětivou obsluhou, psql od konkurenčního postgresql se mi zdá vyřešeno lépe. Co mi ještě chybí, je podpora IB v PHP. IB umožňuje Linux nyní nasadit i v oblasti SQL serverů, zvláště ve spojení s Delphi. Jistě, je tu MySQL, ale to nemá transakce, Postgresql atd., ale IB je prostě o něčem jiném, aspoň v současné době určitě. IB také umožňuje menším programátorským skupinám a jednotlivcům snáze vyvíjet aplikace klient/server, protože nyní je možno si velmi snadno a relativně lacino k vývojovému systému pořídit legálně SQL server s běžící IB, vlastně jen za cenu "železa", a většinu chyb a problémů, ke kterým dochází při nasazení u uživatele, odstranit už při testech. *


- předchozí článek - následující článek - obsah - úvodní stránka -