SQL server pod Linuxem?! A kde jinde!? -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= "Data is a lot like humans: It is born. Matures. Gets married to other data, divorced. Gets old. One thing that it doesn't do is die. It has to be killed." -- Arthur Miller Dan Ohnesorg, 10. dubna 1998 Před časem jste jistě zaznamenali, že jsem v linuxové konferenci hledal spoluautory pro článek o databázích pod Linuxem. Nakonec jsme se sešli tři a předáváme naše zkušenosti s databázemi, které používáme. Nebudeme se zde zmiňovat o databázi ADABAS, která byla podrobně popsána v prosincovém čísle Linuxových novin a databázi ORACLE, kterou lze sice na Linuxu úspěšně provozovat, ale nepodařilo se mi sehnat někoho, kdo by o ní něco napsal a navíc se jedná o databázi, která přece jen trochu vybočuje ze záběru většiny linuxových uživatelů. Nicméně toto zcela jistě není poslední číslo Linuxových novin a tak se k tomuto jistě zajímavému tématu ještě vrátíme. PostgreSQL Nathan L. Cutler Pro ty z nás, kteří hledají databázový software, který je opravdu free, tj. nejen pro samotné uživání, ale i pro případnou distribuci za úplatu, se nabízí PostgreSQL http://www.postgresql.org. Tato robustní implementace standardu SQL-92 umí zpracovat dotazy obsahující relace mezi jednotlivými tabulkami. Je pod aktivním vývojem a každá nová verze má blíž k úplné implementaci standardu. Již nyní je implementace standardu téměř kompletní, a navíc PostgreSQL obsahuje některá rozšíření, se kterými standard nepočítá, např. uživatelem definované datové typy, funkce a inheritance. PostgreSQL je postaven na principu klient-server, nebo front-end/back-end. Back-end v případě PostgreSQL je program, který beží jako daemon a zpracovává SQL-dotazy, které mohou přicházet i po síti TCP/IP. Back-end PostgreSQL je schopen obsloužit jak více databází, tak více uživatelů najednou. Distribuce PostgreSQL obsahuje i jednoduchý front-end psql, což je takový příkazový řádek, přes který lze zadávat holé SQL dotazy a prohlížet si jejich výstup. Velmi důležitou součástí distribuce PostgreSQL je libpq, což je knihovna funkcí umožňující psaní front-endů k databázím. Pomocí této knihovny lze vyvíjet programy v jazyce C, které komunikují přímo s PostgreSQL back-endem. Pro ty, kteří umí programovat v jazyce C představuje tato knihovna spolu s PostgreSQL back-endem mocný nástroj pro vývoj všech druhů databázových aplikací. Pro ty, kteří v céčku neprogramují, existuje řada jiných rozhraní, např. knihovna jazyka Perl, nástroje pro integraci s WWW a jiné. Pro ty, kteří neumí nebo nechtějí získat PostgreSQL kompilací zdrojového kódu, existují PostgreSQL balíky s binárkami pro populární distribuce Linuxu. miniSQL 1.0.11 Michal Polák MiniSQL (dále jen mSQL) vytvořil David J. Hughes (bambi@Hughes.edu.au) z Austrálie. Tato verze je již poněkud staršího data -- leden 1996. Volně používat jej mohou pouze studenti, vzdělávací nekomerční instituce, nevýdělečné a charitativní organizace a nekomerční výzkumná střediska. Ostatní musí zaplatit registrační poplatek (pro zajímavost: pro privátní použití 65 austr. dolarů, pro komerční 225 austr. dolarů). Další šíření produktu (např. jako součást nově vytvořeného programu) je povoleno pouze s výslovným písemným povolením Hughes Technologies. Distribuční balík se "rozzipuje" a "roztaruje" do adresáře /usr/local/Minerva (implicitně nastaveno). Nachází se zde adresář doc s dokumentací v PostScriptu, a adresáře include a lib pro zakomponování balíku do naší aplikace. Časem zde ještě přibude adresář msqldb, kde budou uloženy všechny databáze, které tímto balíkem budeme spravovat. Podrobněji se budeme zabývat adresářem bin ve kterém se nachází několik spustitelných programů: msql, msqld, msqladmin, msqldump, relshow. Chování balíku lze samozřejmě konfigurovat. Pokud by někomu nevyhovoval adresář /usr/local/Minerva, může si balík nainstalovat do přijatelnějšího adresáře, pak je ale zapotřebí nastavit proměnnou MSQL_HOME. Kdyby byly problémy se sítí, lze ještě nastavit buď /etc/services, nebo proměnné prostředí MSQL_TCP_PORT, MSQL_UNIX_PORT a MSQL_HOST. Monitorovat činnost "mSQL Engine" lze nastavením proměnné MINERVA_DEBUG: api -- vypisuje interní informace (jako jsou např. detaily připojení) cache -- vypisuje využití cache tabulek query -- vypisuje všechny dotazy zasílané databázovému serveru malloc -- vypisuje pozice a velikosti alokovaných částí paměti error -- vypisuje chyby (stejné jako zasílané klientovi) key -- vypisuje detaily při práci s klíči trace -- vypisuje volání funkcí, které se spouštějí mmap -- vypisuje detaily o obsazeném regionu paměti general -- vypisuje ostatní informace Tyto režimy lze kombinovat, pak se ale musí mezi jednotlivými slovy napsat dvojtečka. Např: setenv MINERVA_DEBUG api:query Pojďme si nyní popsat slíbené programy: msqld -- démon msqladmin -- tvorba/rušení databáze, shutdown/reload databázového serveru msql -- klient (zadáváním SQL dotazů pracujeme s databází) msqldump -- převede všechna data z určené databáze do SQL dotazů na výstup (vhodné k archivaci) relshow -- zobrazuje názvy existujících tabulek nebo struktury tabulek Všechny tyto programy (kromě démona) lze spouštět s parametrem -h Host, kterým se připojíte k databázovému serveru na jiném počítači. U programů msql a msqldump se vždy musí zadat jméno databáze, se kterou chceme pracovat. Jelikož je práce s msql celkem neohrabaná, je lepší (zvláště pokud potřebujete zadat více dotazů najednou) si tyto napsat do textového souboru a tento potom přesměrovat programu msql na vstup. Zde je nutno podotknout, že jednotlivé SQL dotazy je nutno oddělit znaky : (příkaz v programu pro provedení -- go -- dotazu). Existuje nadstavba programu msql pro prostředí X-Window, která se překvapivě jmenuje xmsql. Jazyk SQL (v dokumentaci deklarován jako ANSI SQL) je podle mého názoru na dnešní dobu celkem chudý. Datové typy použitelné v klauzuli CREATE TABLE: char(len) -- text maximálně délky len int -- celé číslo se znaménkem (4 byty) real -- reálné číslo Za jednotlivými typy lze ještě uvést not null nebo primary key. Lze pracovat s konstrukcemi CREATE TABLE, DROP TABLE, INSERT INTO, DELETE FROM, UPDATE. Konstrukci SELECT si popišme podrobněji, nejdříve uvedeme syntaxi: SELECT [DISTINCT] [table.]column \ [, [table.]column]* FROM table [= alias] [, table [= alias]]* [ WHERE [table.]column OPERATOR VALUE \ [ AND | OR [table].column \ OPERATOR VALUE]* ] [ ORDER BY [table.]column [DESC] \ [, [table.]column [DESC]]* ] Výraz v hranatých závorkách je nepovinný. [ ... ]* -- výraz v hranatých závorkách se může libovolněkrát opakovat. OPERATOR -- =, <, >, <=, >=, <>, like VALUE -- hodnota nebo název sloupce. Nelze použít nested functions (vložené funkce -- sum(), count()), join (spojení tabulek), views (pohledy) a nested queries (vložené dotazy). Kontrola přístupu se nastavuje v textovém souboru msql.acl, který se nachází v /usr/local/Minerva (nebo v MSQL_HOME). Zde se pro jednotlivé databáze nastavují práva pro čtení, zápis apod. Před drahnou dobou jsem četl v linuxové konferenci, že tuto kontrolu lze velice snadno obejít. Protože ale nemám patřičné crackerské (nebo hackerské ?) znalosti, tak nemohu posoudit. V dokumentaci je celkem podrobně probráno napojení na server z jazyka C. Informace o napojení z ESL, Perl 5, Python, Tcl jsou strohé, jsou zde pouze uvedeny adresy výrobců a názvy jednotlivých podpůrných modulů. Tabulka, kde je kolem 14830 záznamů a 5 sloupců typu int, zabírá na disku něco přes 385 kB (14830 * 20 = 296600). Řekl bych, že náklady na režii jsou celkem vysoké, zvlášť když v tabulce neexistuje primární klíč. V konferenci někdo porovnával rychlosti mSQL a MySQL. Balík mSQL byl pomalejší. Z výše uvedených skutečností a absence triggerů, procedur, zamykání záznamů apod. vyplývá, že balík mSQL se hodí pouze do soukromého použití, kde budou relativně malé tabulky v databázi a tabulky na sobě nebudou hodně závislé. Jako klady bych vyzvedl snadnou instalaci a relativně málo zabraného místa na disku. Já osobně používám mSQL jako back-end v programu na vyhodnocení odpovědí studentů v anketě o studiu. Jako front-end mi slouží aplikace napsaná v C. Za celou dobu provozu (zhruba rok a půl) nebyl s mSQL žádný problém (Pozn. redakce: s tímto tvrzením bych si dovolil nesouhlasit. Můžu doložit výstupem příkazu grep mpolak /Mail/Archive/Received* :--). V tabulkách jsou řádově stovky záznamů, vyjímkou jsou tabulky odpovědí, kde je v každé kolem 15000 záznamů. Jediné, co bych chtěl reklamovat u výrobce, je skutečnost, že se mi nepovedla vytvořit tabulka s názvem delším než asi 20 znaků. Možná je to součást nějakého standardu, nevím. MySQL Dan Ohnesorg Příliš restriktivní licence mSQL a špatná srozumitelnost jeho kódu byla trnem v oku skupině programátorů pod vedením Michaela "Montyho" Wideniuse, Davida Axmarka a Kima Aldala. Proto se rozhodli vytvořit nové mSQL se stejným rozhraním, ale mnohem dokonalejším front-endem a back-endem. MySQL má tedy mnoho společného s mSQL a existují nástroje pro upgrade z mSQL na MySQL, jak na úrovni přenosu dat tak na úrovni ekvivalentních knihoven, jejichž použití předpokládá v běžných případech pouze použití jiného hlavičkového souboru a jiného linkovacího parametru. MySQL přesto není pod GNU licencí, jak by možná někdo po přečtení předchozího odstavce očekával. Licence je poněkud složitější. Program se pro její účely dělí na klientskou část, která je pod GPL licencí a server samotný, který je volně šiřitelný, ale nesmí být prodáván a nesmí být použit jako integrální součást komerčně prodávaných produktů. Pokud má někdo takovéto ambice (a mnoho takových se najde) musí si zakoupit komerční verzi serveru. Ta má výhodu v tom, že obsahuje některé funkce, které ve volně šiřitelné verzi nejsou. V současné době se ale jedná pouze o možnost pracovat s komprimovanými databázemi. V případě zájmu si uživatelé mohou zakoupit placenou technickou podporu. Ta obsahuje mnoho stupňů, od zodpovídání e-mailových dotazů, až po vzdálenou administraci systému a návštěvy vývojářů u zákazníků. Nechci nikoho zrazovat od finanční podpory autorů, ale musím konstatovat, že když jsem upgradoval na RedHat Linux 4.9 a MySQL přestalo fungovat, Monty problém vyřešil asi po pěti dopisech za 4 hodiny a to žádnou podporu zaplacenou nemám. (Jednalo se jak možná mnozí tuší o první verzi RedHatu s glibc2, tehdy se MySQL rozběhlo po zakomentování několika funkcí v hlavičkových souborech. Dnes si s glibc2 rozumí, ale požaduje nejnovější verzi z RedHat/upgrade.) Pro srovnání náklady jsou takovéto: server pro komerční využití a jednoho uživatele 200\, server pro komerční využití a deset uživatelů 1500\, placená podpora -- základní verze 200\ na rok, placená podpora nejkomfortnější 5000\ na rok (obsahuje vyhotovení speciálních dotazů typu {\tt SELECT můj\_vzoreček(první sloupec, druhý sloupec) FROM databáze;} v jednotkách hodin, právo požadovat speciální úpravy serveru, instalace u zákazníka a mnohé další). Závěrem snad jen tolik, že autoři slibují, že po dokončení dostatečně dokonalé verze (podle jejich subjektivního názoru) budou všechny předchozí uvolněny pod názvem GNU MySQL pod GNU GPL licencí. Pro tu dokonalou verzi zůstane v platnosti omezení prodeje a integrace do vlastních produktů, do té doby než bude ještě dokonalejší verze. Kolik databáze může stát už tedy víme a teď se podíváme co umí. Je toho opravdu hodně. Nebudu zde zmiňovat ani zdaleka všechny možnosti, jistě si je prohlédnete na adrese http://www.tcx.se. Za základní považuji podporu následujících operačních systémů Solaris 2.5, 2.6 with native threads. SunOS 4.x with the included MIT threads package. BSDI 2.x with the included MIT threads package. BSDI 3.0 and 3.1 native threads. SGI IRIX 6.x with native threads. AIX 4.x whith native threads. DEC UNIX 4.x with native threads. Linux 2.0+ with LinuxThreads 0.5, 0.6 and 0.7. FreeBSD 2.x with the included MIT threads package. FreeBSD 3.x with native threads. SCO OpenServer with a recent port of the FSU-threads package. NetBSD OpenBSD 2.1 HPUX 10.20 with the included MIT threads package. Win95 and NT. Tato verze je k dispozici jen pro platící zákazníky. MySQL je multithreadovou aplikací, proto dokáže vynikajícím způsobem rozkládat zátěž na více procesorů. Podpora kompletní normy ANSI SQL 92 s vyjímkou vložených procedur, triggerů, cizích klíčů, pohledů (views) a transakcí. (Vysvětlení toho proč MySQL neumí transakce zabírá několik odstavců v dokumentaci, zhruba takto: databáze bez transakcí je 3x rychlejší a většinu věcí lze řešit alternativní cestou přes zamykání tabulek.) Nicméně mi transakce scházejí a jsou zřejmě nejpádnějším důvodem, proč se MySQL prosazuje především v oblasti prohlížení dat statičtějšího charakteru. Mnozí jistě namítnou, že transakce jsou potřeba především tam, kde operační systém, na kterém databázový server běží, neposkytuje dostatečnou stabilitu, ale přesto je databázové programování s transakcemi snažší, srovnal bych to s vyjímkami v C. MySQL má určité omezení v konstrukcích používajících OUTER JOINs, např. nemá vůbec implemetován FULL OUTER JOIN. Bežné dotazy ale takové speciality stejně nepoužívají. Naopak navíc oproti normě SQL 92 má mnoho matematických funkcí, nastavování parametrů, aliasy pro mnoho funkcí, tak aby syntaxe byla kompatibilní s co největším počtem databází, automatické generování ID a porovnávání pomocí regulárních výrazů. Dá se předpokládat, že pokud umíte psát SQL dotazy pro ORACLE, INFORMIX či INTERBASE, MySQL jim porozumí. Protože máte k dispozici bohatě komentované zdrojové texty není problém si dopsat další speciální funkce. Pro funkce matematického typu existuje unifikované rozhraní. Jak praví manuál: MySQL sice nemá vložené funkce, tak jak jste zvyklí z jiných databází, kde se vytvářejí v SQL jazyce. MySQL má vnořené funkce psané v jazyce C, každý si může napsat co potřebuje. Při běhu volitelně vytváří isamlog, ze kterého je možné rekonstruovat poškozenou databázi, případně provést příkazy od poslední zálohy znovu. Kromě BLOBu neomezené velikosti (tedy omezené velikostí dostupné paměti) má typ TEXT se stejnými vlastnostmi, ale při porovnávání v poli typu TEXT se ignoruje velikost písmen. A v neposlední řadě, MySQL má dotaženou podporu češtiny. Nejen, že vypisuje (samozřejmě jen pokud si přejete) hlášení o provedených akcích česky, ale umí porovnávat české výrazy u výběrových kritérií bez ohledu na velikost písmen a třídí maximálně algoritmizovatelně věrně podle platné ČSN s respektováním specifik písmenka ch. Jediné co musíte udělat je při překladu přidat parametr ./configure -with-charset=czech Ale to stále není všechno, MySQL interně pracuje v ISO-8859-2, ale klient může používat jiné kódování. Žádný problém -- stačí zadat set character set cp1250_latin2 (v jiné verzi může být i cp1250_il2) a klient se serverem komunikuje v cp1250. Tato možnost zatím není podchycena jako parametr na příkazové řádce při konfiguraci a tak je nutné v .../src/sql/convert.cc zrušit komentář, který blokuje #define DEFINE_ALL_CHARACTER_SETS. Ve verzi 3.21.26-gamma je ještě chybička, zřejmě vypadlo několik řádek z patche, a tak přepínaní charsetů úplně nefunguje. Předpokládám, že v době kdy budete článek číst, bude vše opravené. V blízké době bude uvolněna verze 3.21.30, která bude mít ve standardní distribuci jak plně funkční překódovávání znakových sad na straně serveru, tak drobné opravy v konstrukci SELECT LIKE při použití češtiny. Monty říká: Do MySQL je možné implementovat všechno, pokud chcete vidět opravdu složitý algoritmus podívejte se do ctype-czech na české třídění. (Třídění Monty nedělal, je to dílo zlatých českých ručiček. Nebudu jmenovat, nerad bych na někoho zapomněl). Pro MySQL existuje podpora ODBC, tedy ODBC ovladače pro Windows (pouze 95 a NT), JDBC a samozřejmě sdílená knihovna libmysqlclient, kterou může použít libovolný program napsaný v jazyce C. Dále jsou dostupné knihovny pro Perl a Python. Server komunikuje s klientskou částí dvěma způsoby, buď před socket, nebo po síti. Druhou variantu lze potlačit parametrem při startu démona. Databáze jsou před neoprávněnou manipulací zajištěny soustavou přístupových práv. Práva se přidělují ve třech stupních: na stroj, ze kterého se uživatel přihlašuje, databázi a tabulku v databázi. Jedná se o běžná práva jako čtení, zápis, přidání, vytvoření tabulky, restart serveru, výpis běžících úloh a podobně. Stejně jako u mSQL není tato ochrana neprůstřelná, neprovádí se žádné šifrování dat, takže při získání fyzického přístupu, mohou být data odnesena. Není také problém podvrhnout serveru jinou databázi uživatelských práv. Opět to ale vyžaduje fyzický přístup k disku a právo na restart serveru, ten totiž práva čte jen jednou při startu nebo restartu. Hesla samotná jsou v databázi uložena v šifrované podobě a stejně tak každý klient obsahuje šifrovací engine, takže hesla se po sítí nepřenášejí, nebo alespoň ne v otevřené podobě. Démon se má startovat dávkou safe_mysqld, která se snaží odhalit běžnejší podvody se symlinky a provádí několik dalších kontrol. Pro import a export souborů existuje několik nástrojů. Základní je možnost exportovat data ve formátu SQL příkazů do souboru. Ale existuje i konverzní program z a do DBF souborů, nebo možnost číst a zapisovat data do souborů typu comma delimited. XMySQL Pro administraci a prohlížení dat existují Xové nástroje. Sice umožňují komfortní nastavování práv klikáním myší, ale nevynikají právě rychlostí (to ale bude zajímat jen majitele 486). Stejný komfort na příkazové řádce poskytuje mysqladmin, který kromě zakládání a rušení databází zobrazuje stav serveru, obsazení paměti a počet vyřízených požadavků. Struktura databází se dá zobrazit přes mysqlshow. Když se stane, že server nedokáže databázi po výpadku otevřít, lze ji opravit programem isamchk, naštěstí jsem jej ale nikdy nepotřeboval. Velikost databází je omezena jen velikostí disku. Autoři uvádí, že největší implementace běží nad 50 000 000 záznamy bez nejmenšího zaváhání. Závěrem zmíním několik produktů, které s MySQL úzce souvisí. Na prvním místě musí jistě být scriptovací jazyk pro tvorbu dynamických WWW stránek PHP/FI, který naleznete na adrese http://www.php.net. Tento program existuje ve dvou verzích, 2.x a 3.x, které se liší syntaxí a především použitým jazykem. Řada 3.x byla přepsána do C++. Funkčně jsou zatím stejné, ale 2.x nemá asi budoucnost, proto se pro nové implementace doporučuje 3.x. Trojková řada však zavádí komfort v generování dynamických stran nevídaný. Existují v ní dokonce objekty a dědičnost. Obsahuje moduly pro zobrazení zdrojového kódu stránek s obarvováním a mnoho, mnoho dalšího zajímavého. Zcela jistě se k PHP/FI vrátíme v příštích číslech. O něco méně dokonalý (podle mne) je WWW-SQL na adrese http://www.daa.com.au/james/www-sql/, pro někoho však může být příjemné, že se syntaxí přibližuje ASP z Windows NT. O totální zpřístupnění databáze na Internetu se snaží WDB z adresy http://www.lava.net/beowulf/programming/wdb/, produkt se mi moc líbí, bohužel v balíku omylem chybí jedna část a autor nestihl dodat opravu. Jedná se v zásadě o formuláře přístupné přes WWW rozhraní s běžnou funkčností, tedy zobrazení, úpravy, vkládání nových, definice filtrů a podobně. Možná se k WDB vrátíme v příštích číslech. Velmi zajímavý je internetový obchodní dům použivající MySQL a PHP/FI na adrese http://www.minivend.com/minivend/. Pro úplnost je nutné dodat, že výše zmíněné produkty lze připojit i na PostgreSQL. MySQL má ale o něco menší paměťové nároky. Dále existují podpory pro BIND, kdy BIND v rozsáhlých sítích používá extrémně rychlé vyhledávací stromy implementované v MySQL, podpora pro autentizaci uživatelů a logování přístupů na server APACHE, fulltextové vyhledávací nástroje (bohužel dostupné jen v angličtině a dánštině, vzhledem k tomu, že obsahují databáze synonym a podobné vymyšlenosti je jejich portování na češtinu extrémně obtížné). A mnohé další. Možná jsem vás přesvědčil, že MySQL si trochu pozornosti zaslouží. Při rychlosti jakou nabírá nové možnosti a funkce aspiruje na nejrozšířenější databázi vůbec. Problém free software je samozřejmě v tom, že není znám počet jeho uživatelů, takže až tento okamžik nastane, tak to nikdo nepozná. Pokud plánujete zveřejňování dat na internetu, rozhodně si na MySQL ve spojení s PHP najděte chvilku času. Pro ty, kteří si nedovedou život představit bez FrontPage: PHP 3.0 s ní dokáže pracovat, resp. používá takové značky, které FrontPage nezničí. Sice zatím nejsou české binárky, ale překlad netrvá na pentiích déle než hodinu. Závěrem Která je tedy vlastně nejlepší? Těžko říci, stejně jako ve velkých databázích typu ORACLE, INFORMIX či DB2, každý má svého favorita, na kterého nedá dopustit. Vývojáři spolu soutěží jak ve spolehlivosti, tak rozsahu poskytovaných funkcí a tak jakékoliv dnes provedené srovnání nemusí za měsíc s příchodem další verze souhlasit. Mým osobních favoritem je, jak jste si jistě všimli, MySQL. Přestože není až tak úplně free vítězí především podporou češtiny. výheň