Pár let zpátky byla MySQL synonymem pro open-source SQL databázi, zejména v kombinaci s PHP a aplikacnim serverem Apache. Časy se mění a místo PHP tu máme Python nebo Golang, místo Apache Nginx a oblíbené cool databáze pro nové projekty jsou často z řady NoSQL, například MongoDB, CouchDB, Cassandra or ElasticSearch. V SQL světě je stále více populární PostgreSQL (který bych z open-source SQL variant preferoval i já osobně), nicméně MySQL a její odnože jsou i nadále atraktivní a často používané.
MySQL a jeho klony
Originální MySQL od Oracle není zdaleka jedinou alternativou. Je tu například Percona, která přináší pár věcí nad rámec MySQL, ale obecně se s ní drží velmi kompatibilní. A samozřejmě je tu MariaDB, která se stala [výchozím MySQL klonem ve Fedoře](https://fedoraproject.org/wiki/Features/ReplaceMySQLwithMariaDB) pár let zpět.
MariaDB zůstávala kompatibilní do verze 5.5, nicméně přeskočení k verzi 10.0 místo 5.6 byl důležitý signál, že kompatibilita již nadále není udržována v každém detailu. Například Global Transaction ID (GTID) je implementováno jinak v MySQL a jinak v MariaDB. I tak stále pro většinu reálných nasazení zůstává kompatibilita zachována a to platí jak u poslední vydané verze [10.1](https://mariadb.com/kb/en/mariadb/what-is-mariadb-101/), tak u chystané verzi [10.2](https://mariadb.com/kb/en/mariadb/what-is-mariadb-102/).
Ve Fedoře 24 můžeme nainstalovat jak MariaDB, tak MySQL, obě samozřejmě v aktuální upstream verzi -- 5.7 v případě community-mysql-server balíku a 10.1 v případě mariadb-server balíku. Bohužel nelze oba balíky nainstalovat zároveň, protože soubory z obou variant mezi sebou navzájem konfliktí. Pro instalaci dvou verzí zároveň můžeme využít technologii [Software Collections](http://softwarecollections.org), ale to už je jiná pohádka.
Pro použití textového klienta nebo dalších nástrojů pro práci s databázovým serverem budeme potřebovat mariadb, resp. community-mysql balík, ty jsou ale instalovány spolu se serverem automaticky. Především pro různé drivery a konektory v různých jazycích může být potřeba klientská knihovna, která je v obou variantách k dispozici v
Práce se vzdáleným serverem z konzole
Dost ale už o balíčcích, pojďme se podívat, jak se databáze instalují a používají. Od této chvíle budu mluvit pouze o MariaDB, nicméně pokud nebude řečeno jinak, bude stejná věc fungovat i pro MySQL. Začneme připojením k MySQL nebo MariaDB serveru běžícím někde mimo. Samozřejmě nemusíme instalovat podbalík mariadb-server, bude nám stačit klient a to bez ohledu na konkrétní verzi serveru, neboť protkol pro komunikaci se serverem zůstává kompatibilní napříč verzemi i forky:
$ sudo dnf install mariadb
Pro připojení k serveru potřebujeme znát adresu a přístupové údaje (uživatele a heslo). Zároveň můžeme rovnou specifikovat, se kterou databází chceme pracovat (appdb v našem případě):
$ mysql -h mysqldb.example.com -u franta -p appdb
Parametr -p znamená, že chceme heslo zadat ručně, přičemž není dobrý zvyk zadávat ho přímo jako hodnotu parametru, neboť by se plain-text heslo uložilo do bash_history souboru. Komunikace se serverem je ve výchozím stavu nezašifrovaná, takže heslo i data mohou být odposlechnuta útočníkem. Pro zabezpečení komunikace lze na straně serveru i klienta nastavit SSL šifrování, ale o tom snad někdy jindy.
Práce s MySQL a MariaDB databází v Pythonu
Řekněme, že vytváříte aplikaci v Pythonu a chcete se připojit k databázi. Pokud nepotřebujete nějakou nadstavbu, jako například Django, budete k tomu potřebovat jakýkoliv MySQL modul. Zrovna v Pythonu existuje více možností, takže se pojďme podívat na rozdíly.
Balík ve Fedoře dříve dostupný pod názvem MySQL-python se nyní jmenuje [python3-mysql](https://github.com/PyMySQL/mysqlclient-python) a jedná se v podstatě jen o vrstvu mezi binární klientskou knihovnou dostupnou v systému (libmysqlclient.so), který umožňuje volání patřičných funkcí v Pythonu.
Další balík, [mysql-connector-python3](http://dev.mysql.com/doc/connector-python/en/index.html), je od Oracle a další [python3-PyMySQL](https://pypi.python.org/pypi/PyMySQL) má nezávislý upstream. Oba tyto moduly jsou nativní implementací MySQL protokolu v Pythonu, takže ke své funkci nepotřebují binární klientskou knihovnou. Benchmark dostupný na http://charlesnagy.info/it/python/python-mysqldb-vs-mysql-connector-query-performance ukazuje modul PyMySQL jako ten rychlejší.
Jelikož každá z alternativ má lehce rozdílné API, není výběr podmíněn pouze osobní preferencí, ale je potřeba také zvážit, s jakým modulem dokáže ta která aplikace pracovat. Pro praktickou ukázku jsem zvolil PyMySQL:
$ sudo dnf install python3-PyMySQL $ python3 import pymysql conn = pymysql.connect(host='mysqldb.example.com', port=3306, user='franta', passwd='secretpass', db='appdb') cur = conn.cursor() cur.execute("SELECT name FROM staff") for row in cur: print(row) cur.close() conn.close()
17. 10. 2016 at 10:57
Jak si vůbec vede vývoj MariaDB v porovnání s MySQL? Někde jsem četl, že začal Oracle v MySQL dělat docela dobré a koncepční změny a posouvá se to dopředu, zatímco MariaDB tak trochu přešlapuje na místě.
Osobně to nesleduji a jsem prostý konzument databází, takže zatím používám to výchozí ve Fedoře – MariaDB.