MySQL Mysql je relační databázový systém, který je napsaný v C++. Vytvořila jej firma TcX původně pro své potřeby. Výhody: • K dispozici pro mnoho platforem • Vyšší výkon oproti konkurenčním produktům • Možnost pojmout velké množství dat bez přílišné ztráty výkonu • Pro nekomerční využití zdarma • Při zakoupení licence možnost zásahu do zdrojových kódů • Nízká pořizovací cena oproti konkurenčním produktům (v současné době -> cena) Nevýhody: • Absence správy transakcí Využití: V současné době se nejčastěji setkáme s použitím MySQL při softwarové výbavě webového serveru. Tam je použití logické. Každá webová aplikace totiž potřebuje úložiště dat, které bude rychlé, spolehlivé a zejména dokáže pojmout velké množství dat.Proto si zde vybudovala celkem slušnou pozici. Působnost se však nesoustřeďuje pouze na oblast webu. Toto vše platí i o využití v Intranetu či v podnikových sítích. Zde vykonává prakticky stejnou úlohu jako na webu, tj. pracuje jako úložiště dat.
Instalace v Linuxu: Tím asi nejsnazším je instalace formou RPM balíčků. Tato instalace MySQL sice není nejběžnější, ale i tak se vyskytuje poměrně často. RPM verze se instaluje jako každý jiný program pomocí RPM Manageru. K dispozici jsou následující balíčky: •
mysql-version.i386.rpm - obsahuje MySQL server. Tato část vám postačí v případě, když se budete chtít připojovat k MySQL pouze ze vzdáleného počítače
•
mysql-client-version.i386.rpm - klientská verze MySQL.
•
mysql-bench-version.i386.rpm - výkonnostní testy
•
mysql-devel-version.i386.rpm - knihovny a vložené soubory, které jsou potřeba ke kompilaci jiných MySQL klientů
•
mysql-version.src.rpm - balíček zdrojových kódů
Nejběžnější kombinací je instalace klientské a serverové části. Tu provedeme takto: rpm -i mysql-version.i386.rpm mysql-client-version.i386.rpm
(Poznámka: Abyste předešli problémům, doporučuje se instalací odinstalovat starší verze MySQL.) Tento způsob instalace RPM balíčků se vztahuje na všechny výše zmíněné kromě mysqlversion.src.rpm. Tento balíček je potřeba před instalací rekompilovat: rpm --rebuild mysql-version.src.rpm
Touto kompilací vytvoříme klasický RPM balíček, který dále instalujeme běžným způsobem. Další z možných způsobů instalace je instalace z binárních souborů. Pro instalaci budete mít k dispozici balíček mysql-3.23.xx.tar.gz (kde xx je číslo verze, které se může lišit). Tento balíček zkopírujete do adresáře, kam chcete MySQL nainstalovat. Následovně rozbalíte archiv a přesunete se do nově vytvořeného adresáře. Prakticky to vypadá následovně: tar xfz mysql-3.23.xx.tar.gz cd mysql-3.23.xx
Po těchto příkazech by měl být archiv rozbalen a vy byste se měli nacházet uvnitř nově vzniklého adresáře. Následně proveďte konfiguraci (uvedená cesta /usr/local/mysql je pouze pro ilustraci - ve vašem případě může být jiná): ./configure --prefix=/usr/local/mysql
Poslední krok, který vás čeká, je instalace vzorových databází. Tu provede jednoduše: scripts/mysql_install_db
Tím je instalace z binárních souborů hotova. Poslední ze způsobů je instalace přímo z balíčku zdrojových kódů. Tato instalace je potencionálně nejproblémovější. Opět máte k dispozici balíček mysql-3.23.xx.tar.gz (kde xx je číslo verze, které se může lišit). Začátek vypadá stejně jako v předchozím případě: tar xfz mysql-3.23.xx.tar.gz cd mysql-3.23.xx ./configure --prefix=/usr/local/mysql
Po úspěšné konfiguraci můžete začít s kompilací (upozornění: na starších PC bude časově náročnější): make
Po proběhnutí kompilace je vše připraveno pro instalaci: make install
Na závěr ještě zbývá doinstalovat vzorové databáze: scripts/mysql_install_db
Tímto posledním příkazem je instalace úspěšně hotova. Konfigurační soubor Do /etc/my.cnf specifikujte výchozí adresář distribuce, umístění souborového soketu, uživatele, pod kterým server poběží a další údaje: [mysqld] datadir=/var/lib/mysql/data socket=/var/lib/mysql/mysql.sock [mysql.server] user=mysql basedir=/var/lib/mysql [safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid my.cnf "pasuje" na všechny výše uvedené příklady instalace. Pokud jste cokoli udělali jinak, nezapomeňte příslušné údaje změnit. MySQL je dnes většinou již součástí linuxové distribuce a její instalaci můžete provést při instalaci systém, v okamžiku kdy instalujete balíčky.
Spouštíme MySQL pod Linuxem Pro samotné spouštění MySQL pod Linuxem je dobré vytvořit speciálního uživatele, který sice nebude mít žádná práva, ale bude moci „pouze“ spouštět MySQL server. Před vytvořením tohoto uživatele se budete muset přihlásit jako administrátor (tj. root). Následovně vytvořte daného uživatele: /usr/sbin/groupadd mysqlgrp /usr/sbin/useradd -g mysqlgrp mysqlusr
V tuto chvíli jste vytvořili uživatele mysqlusr. Nyní potřebujete zajistit, aby do podadresáře var (v místě, kam jste nainstalovali MySQL) měl přístup pouze vámi nově vytvořený uživatel. To zajistíte následujícím způsobem (za předpokladu, že jste instalovali do /usr/local/mysql): cd /usr/local/mysql chown -R mysqlusr.mysqlgrp var chmod -R go-rwx var
Teď je vše nastaveno a vy můžete spustit SQL server:
bin/safe_mysqld --user=mysqlusr &
Řádkový klient Kompletní syntaxe příkazu je: mysql -h název_počítače -u jméno_uživatele -p heslo_uživatele název_databáze Samozřejmě ne všechny parametry musíte uvést. Výchozí název počítače je localhost, výchozí uživatelské jméno je to, pod kterým jste přihlášeni do operačního systému. Výchozí heslo, tj. když neuvedete část "-p heslo_uživatele", je prázdné heslo (přihlašování bez udání hesla). Pro spuštění na místním počítači a pod uživatelem "root", který se přihlašuje k databázi bez hesla a pro zvolení "mysql" jako aktivní databáze, pište: mysql -u root mysql V řádkovém klientu můžete přímo zadávat příkazy nebo SQL dotazy. Příkazy odešlete ke zpracování odklepnutím řádku. SQL dotazy mohou být samozřejmě delší, než na jeden řádek. Celý napsaný řetězec na více řádcích se ukládá do bufferu. Buffer pošlete ke zpracování sekvencí "\g" nebo poslední řádek prostě ukončete středníkem: Příkazem "show tables" zobrazíte všechny tabulky v aktivní databázi. Vždy je aktivní právě jedna. Seznam všech databází, ke kterým má daný uživatel přístup, získáte "show databases". Pokud se při psaní spletete, použijte "\c" pro smazání ještě neodeslaného bufferu ke zpracování. Ke změně aktivní databáze je příkaz "\u". Uživatel musí mít pochopitelně privilegia k přístupu. \u polus ... změna databáze na "pokus" \. c:\sql\pokus.sql ... provedení skriptu "pokus.sql" Druhý řádek, příkaz "\.", spouští SQL skript. Soubor zadávejte nejlépe s úplnou cestou. Obsahem jsou většinou SQL dotazy oddělené středníkem. Máte ale možnost uvést i příkazy klienta ("\u", "\#", ...), které tentokrát také oddělujte středníkem. Tyto SQL skripty bych přirovnal k dávkám (batch) známým z příkazových řádků UNIXu i MS-DOSu. Skript "pokus.sql" přepne pro jistotu ještě jednou na databázi "pokus", vytvoří tabulku "tabulka" a vypíše stavové informace SQL serveru ("\s"): \u pokus; create table tabulka (sloupec int); # tady je poznámka v SQL skriptu
\s Standardně, při ukončení příkazu pomocí "\g" nebo ";", se výpis tabulky výsledků formátuje ve formě tabulky. Někdy je takový výpis nečitelný, především při větším počtu sloupců nebo při delších záznamech ve sloupcích. Pokud chcete na výstupu každý sloupec na novém řádku, ukončete příkaz pomocí "\G". Nad databází "mysql" byl spuštěn dotaz "select * from user", ukončený "\G". Existuje ještě několik dalších příkazů. Výpis všech je k dispozici v helpu "\h". Tam se také dočtete, že pro příkaz "\." existuje ekvivalent "source", pro "\u" je to "use" atd. Ze řádkového klienta se odhlašte "\q" nebo "exit" nebo "quit".
Řádkový administrátor Jeho syntaxe je následující: mysqladmin -h název_počítače -u jméno_uživatele -p heslo_uživatele seznam_příkazů Příkazy uskutečňované přes mysqladmin nesouvisí s žádnou konkrétní databází. Mají působnost na celý SQL server. Práva k jejich vykonání jsou zaznamenána v tabulce "user" databáze "mysql" ve sloupcích "Reload_priv", "Shutdown_priv" a "Process_priv". Seznam příkazů může obsahovat jeden nebo více z následujících: ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
create jméno_databáze vytvoření nové databáze drop jméno_databáze smazání existující databáze flush-hosts flush všech hostů v cache flush-logs flush všech logů flush-status vyčištění stavových proměnných flush-tables flush všech tabulek flush-threads flush všech vláken v cache flush-privileges znovunačtení tabulek privilegií kill id, id,... ukončení vláken s čísly id, id,... password nové_heslo změna hesla processlist seznam všech běžících vláken na serveru i s jejich id reload znovunačtení tabulek privilegií refresh provedou se flush-tables a flush-logs shutdown ukončení běhu serveru status krátká zpráva o stavu serveru variables výpis serverových proměnných
Běžným úkolem na SQL serveru je ukončení vlákna, kde běží nějaký "neposlušný" zatěžující dotaz. Nejprve vypište seznam vláken a pak příslušná z nich ukončete: mysqladmin -u root -p heslo_roota processlist ... výpis seznamu vláken mysqladmin -u root -p heslo_roota kill id_vlákna
... násilné ukončení vlákna
MySQL monitor Pro obsluhu MySQL se využívá tzv. MySQL monitor. Jedná se o okno s příkazovým řádkem (konzolí), pomocí něhož manipulujeme s databázovým systémem. Pro řadu uživatelů bývá toto uživatelské rozhraní pro začátek trochu nezvyklé, ale vždy brzy pochopí jeho nesporné výhody (rychlost, vzdálená správa pomocí Telnetu apod.). Spuštění Mysql se provede napsaním příkazu mysql. Pokud se vše zdařilo, měl by se spustit MySQL monitor. Výpis bude vypadat přibližně takto: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 15 to server version: 3.23.37-debug Type `help;` or `\h` for help. Type `\c` to clear the buffer mysql>
(Poznámka: Tento text se může lišit podle verze či systému, ve kterém MySQL běží.) Nyní můžete pomocí příkazové řádky zadávat jednotlivé SQL příkazy. Při instalaci se automaticky vytvoří dvě databáze – test a mysql. Databáze test, jak již název napovídá, je určena k testování a je standardně prázdná. Druhá databáze, mysql, slouží k uchovávání práv. Tato databáze je životně důležitá a měl by k ní mít přístup pouze správce systému. Výpis všech dostupných databází realizujeme takto: mysql> show databases; +-----------+ | Database | +-----------+ | mysql | | test | +-----------+
Tyto databáze jsou standardně uloženy ve podsložce Data (Windows) respektive / usr/local/mysql/data (Linux). Vzhledem k tomu, že nad MySQL teď nemáte úplnou kontrolu, je čas prohlásit se za roota (správce). Nastavte se proto na databázi mysql, která obsahuje nastavení práv. mysql> use mysql;
V této databázi se nachází tabulka user. Tato tabulka obsahuje seznam uživatelů a jejich práva. V této tabulce vymažeme veškeré anonymní uživatele: mysql> delete from user where Host=`localhost` and User=``;
Následně ukončíme MySQL Monitor. mysql> quit
Ve stejné složce jako MySQL monitor se nachází též soubor mysqladmin Pomocí mysqladmin provádíme administraci celého systému a nyní jej využijeme k aktualizaci práv: mysqladmin reload
Námi změněná práva jsou nyní aktualizována. Teď se nastavíme jako root (správce): mysqladmin -u root password nove_heslo
Pokud se vše podařilo, měl byste být od této chvíle jediný, kdo může měnit nastavení práv (tj. upravovat databázi mysql). Nyní se opětovně přihlaste. Tentokráte ovšem již jako root: mysql -u root -p
Parametr -u znamená, že se k systému přihlašuje uživatel, který nemá běžná práva. Parametrem -p dáme MySQL pokyn, že od nás má požadovat heslo. Enter password: *******
Jestliže zadáme heslo chybně, pak nás MySQL nepustí dále a vypíše chybové hlášení: ERROR 1045: Access denied for user: `root@localhost` (Using password: YES)
V případě, že se vám vše zdařilo, měl byste mít plný přístup do databáze mysql. Ostatním uživatelům, kteří nemají patřičná práva, se při použití příkazu use mysql vypíše pouze chybové hlášení: ERROR 1044: Access denied for user: `@localhost` to database `mysql`
Tvorba databáze v MySQL Nyní se podíváme na vytvoření databáze z praktické stránky. Máte v zásadě dvě možnosti, jak toho dosáhnout. Ta první je pomocí MySQL monitoru. Spusťte tedy MySQL monitor: mysql -u root -p
Následovně vytvořte novou databázi pomocí příkazu create: create database pokus
(Poznámka: Při zadávání příkazu si nemusíte lámat hlavu s tím, zda zadáváte příkaz velkými či malými písmeny – je to zkrátka jedno.)
Pomocí tohoto příkazu vytvoříte databázi pokus, která bude pro začátek prázdná. K této nově vytvořené databázi má po vytvoření přístup pouze správce MySQL. Pokud tuto databázi budete chtít odstranit, využijte příkazu drop: drop database pokus
(Upozornění: Tímto příkazem odstraníte databázi včetně všech tabulek, které obsahuje, a to nenávratně! Dobře si tedy vše rozmyslete, než příkaz použijete.) Jak jsem již řekl dříve, v MySQL existuje ještě jeden způsob vytvoření databáze. Lze tak učinit pomocí nástroje mysqladmin. Vytvoření (resp. zrušení) databáze zde provedeme těmito způsoby: mysqladmin -u root -p create pokus mysqladmin -u root -p drop pokus
Tento způsob má výhodu zejména při odstraňování databáze, protože se vás systém naposledy zeptá, zda jste si jisti, že chcete databázi odstranit. Ani zde ale nefunguje pomyslné tlačítko zpět, a proto po odeslání příkazu bude celá databáze nenávratně odstraněna.
Zabezpečení MySQL Databáze mysql (neplést s názvem produktu) obsahuje několik tabulek, v nichž je uvedeno aktuální nastavení uživatelských „kont“. Konkrétně se jedná o tabulky user, db, host, func, tables_priv a columns_priv. Tabulka user. Obsahuje privilegia (oprávnění) na globální úrovni. Pokud tedy má uživatel nastavena některé oprávnění v této tabulce, pak se vztahují na celý SQL server - tudíž na každou databázi, která se na něm nachází. Tato tabulka obsahuje několik polí. Jejich výčet a popis naleznete v následující tabulce: Název pole Host
Popis Název hostitelského počítače. Tímto způsobem můžete omezit přístup pouze na určitou doménu (název či IP). User Uživatelské jméno. Pod tímto jménem se následně přihlašujete do MySQL. Password Uživatelské heslo. Toto heslo je z bezpečnostních důvodů ukládáno zašifrované. Select_priv Dovoluje uživateli vykonávat výběrové dotazy (příkaz SELECT). Insert_priv Dovoluje uživateli vkládat nové záznamy do databáze (příkaz INSERT). Update_priv Dovoluje uživateli aktualizovat data v databázích (příkaz UPDATE). Delete_priv Dovoluje uživateli odstraňovat záznamy (příkaz DELETE). Create_priv Dovoluje uživateli vytvářet nové tabulky a databáze (příkaz CREATE). Drop_priv Dovoluje uživateli rušit tabulky a databáze (příkaz DROP). Reload_priv Dovoluje uživateli aktualizovat tabulku uživatelských účtů (příkaz FLUSH PRIVILEGES). Shutdown_priv Dovoluje uživateli ukončit SQL server.
Process_priv
Dovoluje uživateli sledovat jednotlivé požadavky na SQL serveru. Při tomto oprávnění smí odstraňovat i jednotlivé procesy. File_priv Dovoluje uživateli číst a zapisovat do souborů na SQL serveru. Grant_priv Dovoluje uživateli přidělovat práva dalším uživatelům. References_priv Není mi známa funkce. Index_priv Dovoluje uživateli vytvářet či odstraňovat indexy. Alter_priv Dovoluje uživateli měnit strukturu tabulky. Kromě polí Host, User a Password obsahují ostatní pole hodnotu Y nebo N tj. jestli je dané právo uděleno (Y) či nikoliv (N). Veškeré přidávání, modifikace a mazání uživatelských „kont“ se pak děje za použití standardních příkazů SQL, protože se jedná o „normální“ tabulku. Příklad: INSERT INTO user (Host, User, Password, Select_priv) VALUES (“localhost“,“novak“,PASSWORD(“heslo“),“Y“); Předcházející příklad umožní uživateli novak provádět výběrové dotazy v kterékoliv databázi, která je umístěna na SQL serveru. Jistě jste si všimli, že jsem použil funkci PASSWORD(). Tato funkce slouží k zašifrování hesla. Ale pozor! MySQL bere ohled na velikost písmen. Většinou mají v této tabulce přidělena významnější práva pouze uživatelé, kteří mají co do činění se správou MySQL. Práva ke konkrétní databázi se přidělují v tabulce db. Tato tabulka obsahuje většinu polí, která jsou v tabulce user (všechna kromě Reload_priv, Shutdown_priv, Process_priv a File_priv, která zde pozbývají smyslu), a přidává pole Db, které obsahuje název databáze, na niž se práva vztahují. Postup je obdobný jako v předchozím případě, jen s tím rozdílem, že uživatel musí být již zaveden v tabulce user. Jak tomu rozumět? Dříve, než budeme moci uživateli přidělit práva pro přístup k dané databázi, mu totiž musíme zřídit „konto“, aby se mohl přihlásit k SQL serveru. A to právě uděláme v tabulce user. Následně mu přidáte příslušná práva v tabulce db, znovu načtete práva, a vše je hotovo. Celé to vypadá následovně: INSERT INTO user (Host, User, Password) VALUES (“localhost“,“novak“,PASSWORD (“heslo“)); INSERT INTO db (Host, User, Db, Select_priv) VALUES (“localhost,“novak“,“uzivatele“,“Y“); FLUSH PRIVILEGES; Nejdříve je na globální úrovni přidán uživatel (na této úrovni mu nejsou přiřazena žádná práva). Následně je uživateli novak přiděleno právo prohlížet záznamy v tabulce uzivatele. Na úplný závěr je znovu načtena tabulka uživatelských účtů. Další tabulkou je tabulka host. Tato tabulka obsahuje stejná pole jako tabulka db a má více méně podobnou funkci jako tabulka db. Proto ji příliš nepoužijete. Poslední dvě tabulky jsou
tables_priv a columns_priv. Ty slouží k nastavování práv k jednotlivým tabulkám resp. k jednotlivým polím v tabulce. Obě tyto tabulky obsahují následující pole: Název pole Host Db User Table_name
Popis Název hostitelského počítače. Jméno databáze, která obsahuje danou tabulku. Jméno uživatele, kterému přidělujeme práva. Jméno tabulky, ke které přidělujeme práva. Zde pozor na rozlišování velkých a malých písmen. Timestamp Informace o poslední změně. Column_priv Toto pole obsahuje přidělená práva (množina SET). Může obsahovat hodnoty SELECT, INSERT, UPDATE a REFERENCES, případně jejich kombinaci. Vždy však musíte jednotlivé hodnoty oddělovat čárkou. Tabulka tables_priv navíc obsahuje pole Grantor (obsahuje jméno člověka, který práva přidělil) a Table_priv, které obsahuje přidělená práva. Jedná se opět o množinu SET, která může nabývat různých kombinací hodnot: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, REFERENCES, INDEX či ALTER (opět oddělených čárkou). Tabulka columns_priv obsahuje navíc pole Column_name, které udává název pole, na než se vztahují práva udělená v poli Column_priv.
Ukončení MySQL serveru mysqladmin -u root -p shutdown
(Upozornění: SQL server ukončujte vždy korektním způsobem. Náhlá vypnutí totiž mohou poničit data, jejichž následná obnova bývá při špatném zálohování problematická.)
Odkazy www.mysql.org www.mysql.sk