MySQL
Distributionen
Es gibt u. a. folgende Distributionen
Community MySQL ... von Oracle
bildet die Grundlage fĂźr die anderen Distributionen
MariaDB
hat häufig ein paar dedizierte Performance-Optimierungen
erstellt vom MySQL GrĂźnder
Percona Server
hat häufig ein paar dedizierte Performance-Optimierungen
SlowQuery Log ist viel informativer
WebScaleSQL
Fork von Facebook, Google, ...
Diese Distributionenn sind zueinander kompatibel, so daĂ man eine andere Distribution installieren kann, die auf den Dateien der anderen arbeitet.
Installation
Unter Linux gibt es zwei Paketquellen:
RECOMMENDED: offizielle MySQL Pakete ... die Installation läuft ßber das MySQL APT Repository (siehe unten)
Pakete des Distributionsanbieters
MySQL APT Repository
http://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/
http://dev.mysql.com/downloads/repo/apt/
Enthält:
verschiedene MySQL Server Versionen
MySQL Workbench
MySQL Utilities
MySQL Suite
MySQL Router
Schritt fĂźr Schritt:
download des MySQL APT Repository von hier: http://dev.mysql.com/downloads/repo/apt/
hierzu muss man NICHT sich bei Oracle registrieren ... einfach No thanks, just start my download auswählen, dann gehts auch ohne Registrierung
MySQL APT Repository installieren:
sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb
ACHTUNG: damit wird das System (die Repo-Konfiguration des Linux-Systems) nur so konfiguriert, daĂ man die offiziellen MySQL Pakete installieren kann
sudo apt-get update
, um die MySQL Repository Informationen upzudatendanach kann man dann weitere Pakete wie z. B. den MySQL Server oder die MySQL Workbench per
apt-get install mysql-workbench-community
installieren
Nach meinemm Upgrade von Ubuntu 16.04 LTS auf 18.04 LTS war dann plĂśtzlich meine MySQL Workbench weg. Nach sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb
wollte ich es per sudo apt-get update && sudo apt-get install mysql-workbench-community
installieren, doch das schlug hiermit fehl:
User einrichten
Bei der Einrichtung eines Users gibt man den Usernamen und den Host an, mit dem man zugreifen mĂśchte. Verwendet man
dann kann man sich nur vom Rechner anmelden, auf dem der Server läuft. Verwendet man stattdessen
dann kann man sich von jedem Rechner anmelden.
Das hat aber scheinbar nichts mir der Bindung des Kommunikationsports an das Netzwerkinterface zu tun. Ich finde das sehr strange.
Konfiguration und Administration
Erfolgt Ăźber /etc/mysql/my.cnf
, die aber wiederum weitere *.cnf
Dateien in /etc/mysql/conf.d/
berĂźcksichtigt und miteinander abmischt ... die Dateien in /etc/mysql/conf.d/
Ăźberschreiben die Werte in /etc/mysql/my.cnf
.
User und Datenbanken anlegen
Ich bin ein groĂer Fan von CLI's, weil ich dann meine Befehle immer wieder Ăźber die Command-History wiederfinden kann und auĂerdem mit Kollegen austauschen kann. Das ist dann oftmals schon der erste Schritt zur Automatisierung von Aufgaben. Hierzu benĂśtigt man das mysql
-CLI-Tool. Am einfachsten man startet einen Docker-Container (z. B. docker run -it mysql:5.7 sh
) - alternativ kann man natĂźrlich einen MySQL-Client installieren.
Beachte, daà an einer Stelle Backticks benutzt werden mßssen, wenn der Datenbankname Bindestriche enthält!!!
AnschlieĂend sollten die Grants show grants 'pierre';
so aussehen:
und ich sollte mich mit dem User pierre/1234
(Passwort ist 1234
) anmelden kĂśnnen und per
die Tabelle pierre.haus
anlegen kĂśnnen.
In dem Beispiel fĂźhre ich das Anlegen der Datenbank in dem
mysql
Terminal aus - das ist also von der Bash-History nicht abgedeckt. In diesem Fall ist das beabsichtigt, da hier auch PasswĂśrter erforderlich sind, die ich NICHT in der History haben mĂśchte.
Ich hatte mal Probleme mit der REVOKE
Syntax ... das shwo grants for pierre
Kommando hat mir dann geholfen, den richtigen Befehl mit den richtigen Hochkomma und Backticks zu finden. Einfach in
das GRANT
durch REVOKE
und TO
durch FROM
austauschen:
Voila ;-)
MySQL Workbench
https://www.youtube.com/watch?v=X_umYKqKaF0
MySQL stellt mit der Workbench auch Tooling fĂźr Developer bereit, um
die Datenbank zu administrieren
Datenbankabfragen auszufĂźhren
Performanceanalysen durchzufĂźhren
Installation
http://dev.mysql.com/doc/workbench/en/wb-installing-linux.html
Man sollte nach MĂśglichkeit die Pakete von MySQL selbst verwenden (aka mysql-workbench-community
) anstatt die - teilweise veralteten - Pakete des Distributionsanbieters (aka mysql-workbench
).
DESHALB:
das MySQL APT Repository installieren, um die offiziellen Pakete zu bekommen (siehe oben)
sudo apt-get install mysql-workbench-community
MySQL Workbench starten:
mysql-workbench
Performance Analyse
siehe eigene Seite
dbeaver
... ich mag ihn auch
Storage Engine
MySQL bietet mehrere Storage Engines an, die teilweise hoistorisch gewachsen sind - teilweise aber auch unterschiedliche Einsatzbereiche haben:
InnoDB: transaktional
MyISAM: nicht transaktional
InnoDB
jede Tabelle landet in einer eigenen Datei, die einen Tablespace repräsentiert (zumindest bei der Einstellung
innodb_file_per_table=1
) - ein Aufteilen auf verschiedene Festplatten (schnell/langsam) mit jeweils eigenen Festplattencontrollern (Zugriffsparallelisiserung) ist dadurch mĂśglichRow-Locks
ACID Support
MyISAM
kennt nur Table-Locks keine Row-Locks ... schlechte Performance in Multi-Session-Szenarien
Information Schema
MySQL hält neben dem Performance Schema (siehe unten) auch das sog. Information Schema. In diesem findet man beispielsweise die GrĂśĂe der Datenbank und die Anzahl der Zeilen.
ACHTUNG: es handelt sich hier nur um ungefähre Angaben ... insbes. bei der Zeilenanzahl wird man das schnell feststellen. Diese Daten verändern sich auch, wenn man ein
ANALYZE TABLE
durchfßhrt (und das sollte man auch tatsächlich tun bevor man verlässliche Angaben haben will!!!).
ACHTUNG:
man sollte vor der Nutzung des Information Schema ein Analyze Tables machen, ansonsten sind die Werte nicht aktuell
table_rows
kann man nicht gebrauchen ... es handelt sich um einen hochgerechneten Wert (aus derdata_length
und einem durchschnittlichen Datensatz
MySQL Enterprise Manager
https://www.mysql.com/products/enterprise/monitor.html
Youtube Video: https://www.youtube.com/watch?v=e5HhC0XiioY
Da MySQL mittlerweile zu Oracle gehĂśrt, sieht der MySQL Enterprise Manager fast genauso aus wie der Oracle Enterprise Manager. Vom Oracle Enterprise Manager war ich sehr begeistert ... wir haben damit viele Bottlenecks entdeckt und konnte diese oft schon mit kleinen Ănderungen (z. B. Index anlegen) beheben.
Mit diesem Tool sind gezielte Realtime-Analysen mĂśglich, um die Hotspots auf der Datenbank zu finden (Explain-Plans, Index-Nutzung, IO auf Filesystem und Netzwerk).
MySQL Workbench
https://www.mysql.de/products/workbench/performance/
Optimierung
http://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html
Die SQL-Engine benĂśtigt Informationen Ăźber die Datenbelegung der Tabellen, um den besten Execution Plan berechnen zu kĂśnnen. Das liegt daran, daĂ je nach Belegung unterschiedliche Indexzugriffe optimal sind.
Bei Oracle verwendet man den sog. Gather Stats Job ... bei MySQL verwendet man mysqlcheck
mit --analyze
und --optimize
Option:
MySQL-Server im Docker Container
Vermutlich wird man die Datenbank-Dateien auf den Docker-Host legen wollen, um den MySQL-Container wegwerfen und neu deployen zu kĂśnnen, ohne die Daten zu verlieren.
Hier läuft man allerdings schnell in Permission-Probleme, weil die User-Ids auf dem Docker-Host nicht mit den User-Ids im Docker-Container ßbereinstimmen und man somit auf dem Docker-Host nur als root
volle Rechte auf die Dateien hat (um beispielsweise die Datenbank-Dateien zu lĂśschen).
Backup und Restore
http://depressiverobot.com/2015/02/19/mysql-dump-docker.html
MySQL-Tooling im Docker Container
Nicht jeder hat die MySQL Tools auf seinem Rechner installiert. Was liegt da näher als einen MySQL-Container zu starten und die Tools daraus zu nutzen.
Zugriff Ăźber MySQL Client aus Docker Container
Das Tool mysql
ist ein CLI zum Zugrifdf auf MySQL Datenbanken:
Das funktioniert grundsätzlich ganz prima. Läuft die Datenbank allerdings auf dem Docker-Host in einem Docker-Container, dann darf man nicht localhost
oder 127.0.0.1
als host
verwenden, sondern die IP-Adresse des Docker-Hosts. Ansonsten bekommt man einen kryptischen Fehler dieser Art:
siehe auch http://dev.mysql.com/doc/refman/5.7/en/problems-connecting.html
FAQ
https://dev.mysql.com/doc/refman/5.6/en/problems-connecting.html
Frage 1: Ich habe einen MySQL Server im Docker-Container laufen - gestartet per docker run --name piedb -e MYSQL_ROOT_PASSWORD=Test1234 -d -P mysql:5.7
. Der Server startet auch korrekt
und der Port 3306 ist auch weitergeleitet:
aber wenn ich mich mit einem Datenbank-Client darauf connecten will (localhost:32768), dann bekomme ich die Fehlermeldung
Antwort 1: Das liegt daran, daĂ die MySQL-Server im Container liegt und das Unix-Socket-File /var/run/mysqld/mysqld.sock
auf dem Docker-Host gar nicht existiert. Es muĂ eine Network-Socket Kommunikation initiiert werden. Hierzu muĂ statt localhost:32768
ein 127.0.0.1:32768
verwendet werden. Alternativ kann man die Verbindungsart auch per --protocol=TCP
explizit angeben (http://serverfault.com/questions/337818/how-to-force-mysql-to-connect-by-tcp-instead-of-a-unix-socket).
Siehe auch http://dev.mysql.com/doc/refman/5.7/en/problems-connecting.html
Last updated
Was this helpful?