MySQL
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 24.04 Noble Numbat
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
MySQL 🇩🇪 ist eine leistungsfähige Datenbank-Serveranwendung. Die Firma MySQL AB, welche hinter der Entwicklung der Datenbank steht, wurde im Jahr 2008 von Sun übernommen und ist seit der Übernahme von Sun durch Oracle nun dieser Firma zugehörig. MySQL ist neben Linux auch für Windows, MacOS, FreeBSD, Solaris und weitere Betriebssysteme verfügbar.
MySQL wird sehr häufig für Webanwendungen zusammen mit dem Webserver Apache und PHP eingesetzt.
Den MySQL-Datenbankserver gibt es in einer freien Community-Variante (welche über die Ubuntu-Quellen verfügbar ist) und einer kostenpflichtigen Enterprise-Variante, welche Fehlerkorrekturen und neue Funktionen zuerst enthält. Seitdem MySQL zu Orcale gehört, sind die Unterschiede zwischen der freien und der kostenpflichtigen Variante zum Unmut der Community größer geworden. Details hierzu sind im Wikipedia-Artikel zu MySQL zu finden.
Als Alternative zu MySQL gibt es das API-kompatible MariaDB, welches andere Linux-Distributionen bereits als Ersatz verwenden. Bei Ubuntu wird - im Gegensatz zu vielen anderen Linux-Distributionen - immer noch MySQL über das Paket mysql-server
installiert und nicht der MariaDB Server.
Installation¶
MySQL-Server¶
MySQL kann direkt aus den Paketquellen von Ubuntu installiert werden. Dazu muss nur das Paket
mysql-server
Befehl zum Installieren der Pakete:
sudo apt-get install mysql-server
Oder mit apturl installieren, Link: apt://mysql-server
aus der Paketverwaltung heraus installiert [1] werden. Bei Ubuntu 24.04 wird dabei das Datenbanksystem in der Version 8.0 installiert.
PHP¶
Wer eine datenbankbasierte Webanwendung mit PHP und MySQL aufsetzen möchte (z.B. ein CMS oder eine Bildergalerie), benötigt noch das Paket:
php-mysql
Befehl zum Installieren der Pakete:
sudo apt-get install php-mysql
Oder mit apturl installieren, Link: apt://php-mysql
Benutzer und Passwörter¶
MySQL-Benutzer¶
Es ist zu beachten, dass die Benutzerverwaltung von MySQL nichts mit den lokalen Betriebssystem-Benutzern des Linux-Systems zu tun hat (bei dem Authentifizierungs-Plugin auth_socket
allerdings wird das Zulassen der Verbindung davon abhängig gemacht, ob auch wirklich der selbe Linux-Nutzer, der den MySQL-Nutzer erstellt hat, sich anzumelden versucht) MySQL verwaltet seine Benutzer selber. Sollte es dabei Namensüberschneidungen geben (was vor allem beim root
-Benutzer vorkommt) so ist darauf zu achten von welchem Benutzer gerade die Rede ist.
root¶
Bei der Installation des Servers wird automatisch ein root
-Account angelegt. Dieser wird für die Verwaltung des Servers verwendet und ist somit von der Bedeutung her ähnlich zum Linux root-Benutzer.
debian-sys-maint¶
Ubuntu legt noch einen weiteren Benutzer an: debian-sys-maint
. Mit Hilfe dieses MySQL-Benutzers startet und stoppt Ubuntu den Server und führt weitere Wartungs-Aufgaben z.B. während Updates durch. Für administrative Aufgaben kann man daher auch den Benutzer debian-sys-maint
verwenden.
Der Zugang ist Passwort-geschützt. Ubuntu vergibt ein voreingestelltes Passwort, das in der Datei /etc/mysql/debian.cnf im Klartext abgelegt wird. Dort finden sich zwei identische Abschnitte, in denen jeweils das Passwort abgelesen werden kann.
weitere Benutzer¶
Aus Sicherheitsgründen ist es, genau wie bei Betriebssystem-Benutzern, oft ratsam nicht die vorhandenen System-Konten für die regelmäßige Arbeit zu verwenden, sondern für unterschiedliche Anwendungszwecke des Datenbankdienstes auch unterschiedliche MySQL-Benutzerkonten zu benutzen. Wenn zum Beispiel durch eine Sicherheitslücke eine Konfigurationsdatei einer PHP-Anwendung ausgelesen werden kann, so befinden sich dort dann nur die Zugangsdaten des eingeschränkten MySQL-Benutzers, der dann im Bestfall nur Zugriff auf eine einzige Datenbank hat. Damit sind dann die Systemtabellen und alle anderen Datenbanken weiterhin vor Zugriffen geschützt.
Passwörter¶
Jedes MySQL-Benutzer-Konto sollte mit einem Passwort geschützt werden um unautorisiertes Anmelden zu verhindern.
Passwörter setzen / ändern¶
Wenn für einen Benutzer-Account noch kein Passwort vergeben wurde oder ein vorhandenes Passwort geändert werden soll, so kann dies mit dem Kommandozeilen-Tool mysqladmin nachträglich gemacht werden.
mysqladmin -u BENUTZERNAME -p password WUNSCHPASSWORT
Dabei wird jeweils das alte Passwort abgefragt. Sollte dieses vorher leer gewesen sein, so kann einfach per ⏎ bestätigt werden.
Besonderheiten beim root-Passwort¶
Wie bereits erwähnt wird normalerweise bei der Installation des MySQL-Servers das Passwort für den MySQL-root-Benutzer abgefragt. Sollte dabei kein Passwort angegeben worden sein, so wird für den Benutzer 'root'@'localhost' das auth_socket
Authentifizierungs-Plugin benutzt. Mit einer root-Shell kann MySQL dann ohne Passwort verwendet werden, weil die Berechtigung über den aufrufenden Linux-Benutzer gesteuert wird. Siehe auch dessen Dokumentation 🇬🇧. Damit ist dann allerdings das Anmelden als MySQL-root außerhalb einer root-Shell nicht mehr möglich. D.h. jeder Aufruf von MySQL-Kommandozeilen-Programmen oder sonstige Verbindungen zum Server von außerhalb als MySQL-root müssen im Linux-root-Kontext stattfinden.
Wenn für den MySQL-Benutzer root wieder ein eigenes Passwort gesetzt werden soll, muss man sich mittels
mysql -u root
in einer root-Shell am MySQL-Server anmelden und die folgenden Befehle an der MySQL-Eingabeaufforderung mysql>
eingeben:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY RANDOM PASSWORD; # ausgegebenes Passwort sichern QUIT;
Dieser Vorgang benutzt den Authtentifzierungs-Plugin caching_sha2_password
🇬🇧, der ein zufälliges Passwort generiert (es ließe sich aber auch eines im Klartext angeben), das im Anschluß ausgegeben wird, und mittels des SHA-2-Algorithums verschlüsselt. Früher wurde dazu der Plugin mysql_native_password
🇬🇧 verwendet, der jedoch mittlerweile als unsicher gilt und in Zukunft entfernt werden soll.
Alternativ kann für das Ausführen der MySQL-Befehle auch eine MySQL-Eingabeaufforderung unter Verwendung des debian-sys-maint
-Benutzers benutzt werden.
Der Zugang kann nun wider von allen Linux-Benutzern aus mit mysql -u root -p
erfolgen.
Weitere Möglichkeiten zum Zurücksetzen eines vergessenen Passworts sind am Ende des Artikels unter Problembehebung zu finden.
Konfiguration¶
MySQL wird über die Datei /etc/mysql/mysql.conf.d/mysqld.cnf konfiguriert. Es müssen üblicherweise aber keine Änderungen vorgenommen werden. Mittels eines Editors [3] kann man Funktionen aktivieren bzw. Einstellungen vornehmen. Der folgende Befehl liefert eine Übersicht aller möglichen Einstellungen, samt ihren derzeitigen Werten:
mysqld --verbose --help
Eine gut Übersicht bietet außerdem selbstredend die offizielle Dokumentation 🇬🇧.
Datenpfad¶
MySQL speichert die Datenbanken im Verzeichnis /var/lib/mysql ab. Möchte man einen anderen Pfad definieren, so kann man dies über die Option datadir
vornehmen. Dabei ist zu beachten, dass das Verzeichnis dem Benutzer bzw. der Gruppe mysql
gehören sollte, damit der MySQL-Server dort auch schreiben darf. Mehr zum Thema findet man im Artikel Benutzer und Gruppen.
Lässt sich der MySQL-Server danach nicht mehr starten, liegt es wahrscheinlich an den Profil-Einstellungen von AppArmor. Wird das Datenbankverzeichnis in der Konfigurationsdatei geändert, aber nicht im AppArmor-Profil angepasst, kann MySQL nicht mehr auf alle Datenbanken bzw. auf Teile von bestehenden Datenbanken zugreifen.
Abhilfe schafft eine Anpassung der Datei /etc/apparmor.d/local/usr.sbin.mysqld. An das Ende der Datei sind folgende Zeilen hinzuzufügen:
1 2 | /other_disk/mysql/ r, /other_disk/mysql/** rwk, |
Danach muss dann zunächst AppArmor und danach dann MySQL neu gestartet werden.
MySQL über das Netzwerk¶
Nach der Installation ist der MySQL-Server so konfiguriert, dass er nur via localhost - also vom lokalen Rechner aus - erreichbar ist. Soll der Server über das Netzwerk ansprechbar sein, so kann man in der Konfigurationsdatei die interne IP-Adresse des Servers eintragen:
1 2 3 | # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 192.168.0.10 |
So ist der MySQL-Server z.B. auch von anderen Rechnern aus dem LAN ansprechbar. Per Voreinstellung ist MySQL über den Port 3306 erreichbar. Dieser kann auch in der Konfigurationsdatei geändert werden.
Wenn von allen Netzwerk-Interfaces zugegriffen werden soll, so muss bind-address bind-address = 0.0.0.0
konfiguriert werden. Alternativ kann der bind-address
Eintrag auch auskommentiert werden.
Weiterhin muss in den Benutzerrechten pro Benutzer hinterlegt werden, ob dieser sich über das Netzwerk anmelden darf.
Bedienung¶
Hier wird nur ein kurzer Einblick in die Bedienung von MySQL gegeben. Eine sehr umfangreiche Dokumentation steht in Form des Referenzhandbuchs 🇬🇧 online zur Verfügung.
Datenbank erstellen¶
Zunächst meldet man sich als Datenbank-Administrator an, um einen neuen Benutzer erstellen zu können:
mysql -u root -p
An der MySQL-Eingabeaufforderung mysql>
werden folgende SQL-Befehle beispielhaft ausgeführt; die Schreibweise in Großbuchstaben ist dabei zwecks besserer Lesbarkeit empfohlen, aber nicht zwingend notwendig. Bei erfolgreicher Ausführung erhält man eine Rückmeldung in der Form:
Query OK, ... rows affected (... sec)
Datenbank erstellen (in der Praxis entspricht der Datenbankname häufig dem der gewünschten Anwendung):
CREATE DATABASE IF NOT EXISTS <datenbankname>;
Neuen Datenbank-Benutzer
www-data
mit dem Kennwortgeheim
erstellen (wenn die Datenbank im Rahmen eines LAMP-Servers eingesetzt werden soll). Hierbei wird automatisch dercaching_sha2_password
Authentifizierungs-Plugin genutzt:CREATE USER 'www-data'@'localhost' IDENTIFIED BY 'geheim'; GRANT USAGE ON *.* TO 'www-data'@'localhost' IDENTIFIED BY 'geheim';
Zugriffe auf die neue Datenbank für den Benutzer
www-data
erlauben:GRANT ALL PRIVILEGES ON <datenbankname>.* TO 'www-data'@'localhost'; FLUSH PRIVILEGES;
Abmelden mit:
QUIT;
Alternativ kann
EXIT;
benutzt werden.
Tabellen-Speicherarten¶
MySQL kennt verschiedene Tabellen-Speicherarten, die sogenannten Storage Engines 🇬🇧. Diese haben jeweils spezifische Vor- und Nachteile. Die Art der Tabelle kann beim Anlegen über die Option ENGINE=
festgelegt werden. Innerhalb einer Datenbank können verschiedene Speicherarten gemischt werden.
InnoDB¶
InnoDB ist die Standard-Speicherart von MySQL und wird - sofern nicht explizit anders angegeben - per Voreinstellung genutzt. Es ist eine fast universell nutzbare Speicherart, welche Transaktionssicherheit bietet und Fremdschlüssel (sogenannte "Constraints") unterstützt. Ist die Datenkonsistenz sehr wichtig, so wird in der Regel InnoDB als Engine eingesetzt.
MyISAM¶
MyISAM war bis Version 5.5 die Standardtabellenart von MySQL. MyISAM-Tabellen gelten besonders bei großen Datenmengen mit vielen SELECT
-Operationen ohne häufige Änderungen an den Daten als sehr effizient und schnell. Allerdings sind MyISAM-Tabellen nicht transaktionssicher und unterstützen keine Fremdschlüssel. Ein weiterer alter Vorteil gegenüber InnoDB, die Möglichkeit Volltext-Indizes zu verwenden, ist seit Version 5.6 von Seiten InnoDBs ausgeglichen worden.
Weitere Tabellenarten¶
Wie oben bereits erwähnt, unterstützt MySQL noch eine Anzahl weiterer Tabellenarten, wobei InnoDB und MyISAM sicherlich die am häufigsten eingesetzten sind. Erwähnenswert sind noch Tabellen auf Basis der "Memory"-Speicherart. Diese werden ausschließlich im Arbeitsspeicher (RAM) des Servers gehalten und sind dadurch natürlich entsprechend schnell. Memory-Tabellen werden bevorzugt für temporäre Tabellen eingesetzt oder für Tabellenkopien mit häufigen Zugriffen, auf die nur lesend zugegriffen wird.
Problembehebung¶
root-Passwort vergessen¶
Wenn man das Passwort für den MySQL-root-Benutzer vergessen hat, so gibt es mehrere Möglichkeiten, dieses neu zu setzen. Folgende Variante steht hierbei unter Ubuntu zur Verfügung und sollte benutzt werden.
Per
mysql -u debian-sys-maint -p
am MySQL-Server als debian-sys-maint
-Benutzer anmelden und dann die folgenden Kommandos an der MySQL-Eingabeaufforderung mysql>
eingeben:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NeuesPasswort'; QUIT;
Es gibt weitere Wege, das root-Passwort neu zu setzen, allerdings sollten diese unter Ubuntu nicht notwendig sein. Wenn doch, dann können diese in der MySQL-Dokumentation 🇬🇧 nachgeschlagen werden.
Passwort für debian-sys-maint neu setzen¶
Erscheint beim (Neu-)Start des MySQL-Servers
sudo systemctl restart mysql.service
folgende Fehlermeldung:
* Stopping MySQL database server mysqld [fail] * Starting MySQL database server mysqld [ OK ] /usr/bin/mysql-admin: connect to server at 'localhost' failed error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
muss man das Passwort für den Benutzer debian-sys-maint neu setzen. Dies kann der Fall sein, wenn Ubuntu während eines Upgrades des Pakets mysql-server das Passwort für debian-sys-maint
überschreibt. In diesem Fall muss man sich als Benutzer root
am MySQL-Server anmelden und nachfolgende Befehlssequenz an der MySQL-Eingabeaufforderung mysql>
eingeben. Dabei newpassword
durch den Passwort-Eintrag in der Datei /etc/mysql/debian.cnf ersetzen.
GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'newpassword' WITH GRANT OPTION; QUIT;
Datensicherung¶
Es gibt verschiedene Strategien, wie man (regelmäßige) Datensicherungen durchführen kann. Näheres hierzu findet man im Unterartikel MySQL/Backup.
Grafische Oberflächen¶
Es gibt eine Reihe von graphischen Benutzeroberflächen, die den Umgang mit MySQL erleichtern. Mehr Informationen findet man im Artikel MySQL/Werkzeuge.
Links¶