- 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 -