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ň