MySQL
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
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.
Die MySQL-Datenbank gibt es in einer freien Community-Variante (welche über die Ubuntu-Quellen verfügbar ist) und einer kostenpflichtigen Enterprise-Variante, welche als erstes Fehlerkorrekturen und neue Funktionen enthält. Seitdem MySQL zu Orcale gehört, sind die Unterschiede zwischen der freien und der kostenpflichtigen Variante größer geworden, zum Unmut der Community. 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.
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.
PHP¶
Wer eine datenbankbasierte Webanwendung mit PHP 5 und MySQL aufsetzen möchte (z.B. ein CMS oder eine Bildergalerie), benötigt noch das Paket:
php5-mysql
Befehl zum Installieren der Pakete:
sudo apt-get install php5-mysql
Oder mit apturl installieren, Link: apt://php5-mysql
Ab Ubuntu 16.04 lautet der Paketname:
php-mysql
Befehl zum Installieren der Pakete:
sudo apt-get install php-mysql
Oder mit apturl installieren, Link: apt://php-mysql
Konfiguration¶
MySQL wird über die Datei /etc/mysql/my.cnf (bis einschließlich 14.10) bzw /etc/mysql/mysql.conf.d/mysqld.cnf (ab 15.04) konfiguriert. Es müssen üblicherweise aber keine Änderungen vorgenommen werden. Mittels eines Editors [3] kann man Funktionen aktivieren bzw. Einstellungen vornehmen. Die wichtigsten Optionen sollen hier kurz vorgestellt werden.
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 = /var/lib/mysql
eintragen. Dabei ist zu beachten, dass das Verzeichnis dem Benutzer bzw. der Gruppe mysql
gehören sollten, damit der MySQL-Server dort auch schreiben darf. Mehr zum Thema Benutzer und Gruppen 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. Es wird dann z.B. folgender Fehler gemeldet:
sudo mysqlshow -u root -p
mysqlshow: Cannot list databases: Can't read dir of '.' (errno: 13)
Oder wenn man auf der MySQL-Kommandozeile angemeldet ist:
show databases;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 13)
Dieser Fehler wirkt sich auch auf PHPmyAdmin aus. Dort wird im linken sowie im rechten Fenster immer nur "Keine Datenbanken" angezeigt. Die genauen Fehlermeldungen stehen im Kernel-Log, also in /var/log/syslog, und werden auch durch dmesg | tail angezeigt.
Eine Möglichkeit der Abhilfe ist die Anpassung des Ordners in der Datei /etc/apparmor.d/usr.sbin.mysqld:
1 2 3 4 | ... /var/lib/mysql/ r, /var/lib/mysql/** rwk, ... |
Besser ist es aber, die für lokale Anpassungen vorgesehene Datei /etc/apparmor.d/local/usr.sbin.mysqld zu benutzen:
1 2 | /other_disk/mysql/ r, /other_disk/mysql/** rwk, |
In jedem Fall sollte danach zunächst AppArmor neu gestartet werden, danach dann MySQL.
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.
Benutzer¶
root¶
Bei der Installation des Servers wird automatisch ein root
-Account angelegt. Dabei ist zu beachten, dass die Benutzerverwaltung von MySQL nichts mit den lokalen Benutzern des Linux-Systems zu tun hat - MySQL verwaltet seine Benutzer selber. Bei der Installation des MySQL-Servers wird automatisch nach einem Passwort für den Datenbank-Administrator root
gefragt.
Mit dem Befehl
mysqladmin -u root -p password "WUNSCHPASSWORT"
kann das Passwort nachträglich geändert werden. Dabei wird nach dem bisherigen Passwort gefragt. Wenn noch keines hinterlegt ist, kann man hier einfach mit der Taste ⏎ bestätigen.
debian-sys-maint¶
Ubuntu legt noch einen weiteren Benutzer an: debian-sys-maint
. Mit Hilfe dieses MySQL-Benutzers startet und stoppt Ubuntu den SQL-Server und führt weitere Wartungs-Aufgaben durch. Der Zugang ist Passwort-geschützt. Ubuntu vergibt ein voreingestelltes Passwort, das in der Datei /etc/mysql/debian.cnf im Klartext abgelegt wird. Für administrative Aufgaben kann man daher auch den Benutzer debian-sys-maint
verwenden mit:
mysql -u debian-sys-maint -p
In /etc/mysql/debian.cnf befinden sich zwei identische Einträge für das Passwort: z. B. password = n4aSHUP04s1J32X5
.
Passwort zurücksetzen/neu vergeben¶
Hat man das Passwort für den Benutzer root
vergessen, kann man mit Hilfe des Benutzers debian-sys-maint
das Passwort zurücksetzen und neu vergeben. Einfach wie oben beschrieben als Benutzer debian-sys-maint
am MySQL-Server anmelden und die folgende Befehlssequenz am MySQL-Prompt mysql>
eingeben:
update mysql.user set Password=password('MyNewPass') where User='root'; flush privileges; quit;
Ab 16.04 (mit MySQL 5.7 auf den Paketquellen) heißt die Spalte nicht mehr Password
, sondern authentication_string
und der Befehl lautet dann
update mysql.user set authentication_string=password('MyNewPass') where User='root'; flush privileges; quit;
UNIX_SOCKET Authentication Plugin¶
Bei neueren Installationen kann es vorkommen, dass während der Installation kein Passwort für die Datenbankkennung root mehr erfragt wird. Stattdessen wird für die Kennung 'root'@'localhost' das UNIX_SOCKET Authentication Plugin gesetzt. Mit einer root-Shell kann mysql dann ohne Passwort gestartet werden, weil die Berechtigung über den aufrufenden User gesteuert wird.
Wenn für die Datenbankkennung root wieder ein unabhängiges Passwort gesetzt werden soll, muss man sich in einer root-Shell am SQL-Server anmelden und die folgenden Kommandos am MySQL-Prompt mysql>
eingeben.
UPDATE mysql.user SET authentication_string=PASSWORD('NeuesPasswort'), plugin='mysql_native_password' WHERE User='root' AND Host='localhost'; FLUSH privileges; QUIT;
Danach den Service mysql restarten.
Durch die Angabe von plugin='mysql_native_password' wird wieder das MySQL - eigene Passwort verwendet und der Zugang kann auch von anderen Kennungen aus mit mysql -u root -p
erfolgen.
Datenbank erstellen¶
Zum Erstellen einer neuen Datenbank meldet man sich zuerst als Datenbank-Administrator an:
mysql -u root -p
Am MySQL-Prompt mysql>
werden folgende SQL-Befehle benötigt. 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):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.
Tabellenarten¶
MySQL kennt verschiedene Tabellenarten, 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 Tabellen gemischt werden.
MyISAM-Tabellen¶
MyISAM ist die Standardtabellenart von MySQL und - sofern nicht explizit anders angegeben - per Voreinstellung genutzt. MyISAM-Tabellen haben grundsätzlich keine Größenbeschränkung und gelten besonders bei häufigen SELECT
- und INSERT
-Operationen als sehr effizient und schnell. Allerdings sind MyISAM-Tabellen nicht transaktionssicher und unterstützen keine Fremdschlüssel (sogenannte "Constraints").
InnoDB¶
Im Gegensatz zu den MyISAM-Tabellen sind InnoDB-Tabellen transaktionssicher und unterstützen Fremdschlüssel. Ist die Datenkonsistenz sehr wichtig, so wird in der Regel InnoDB als Engine eingesetzt.
Weitere Tabellenarten¶
Wie oben bereits erwähnt, unterstützt MySQL noch eine Anzahl weitere Tabellenarten, wobei MyISAM und InnoDB sicherlich die am häufigsten eingesetzten sind. Erwähnenswert sind noch Tabellen auf Basis der "Memory-Engine". Diese werden ausschließlich im 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.
MySQL-Server steuern¶
ab Ubuntu 14.10¶
Bei Systemen mit systemd wird MySQL - wie allen anderen Dienste auch über systemctl gesteuert. So würde z.B.
sudo systemctl restart mysql.service
den Datenbank-Server neu starten.
bis Ubuntu 14.04¶
Wie alle anderen Dienste bringt MySQL-Start/Stop-Skripte mit. Diese Skripte lassen sich natürlich auch zum Steuern des Servers gebrauchen. Aus einem Terminal [2] heraus kann man mit
sudo service mysql {start|stop|restart|reload|force-reload|status}
Beispiel:
sudo service mysql reload
den Server steuern. Die einzelnen Optionen dabei bedeuten:
start
- Startet den MySQL-Serverstop
- Stoppt den Serverrestart
- Startet den Server neu, bestehende Verbindungen auf den Server werden gekapptreload
- Lädt die Konfigurationsdateien neu, ohne dass Verbindungen getrennt werdenforce-reload
- Lädt die Konfigurationsdateien neu, auch wenn dabei Verbindungen verlorengehenstatus
- Zeigt Status-Informationen und den Zustand des MySQL-Servers an
Mehr dazu im Wiki unter Dienste.
Achtung!
Für die einwandfreie Funktion von MySQL ist es entscheidend, dass der Daemon stets korrekt heruntergefahren und nicht bspw. bei einem Neustart des Systems abgeschossen wird. Wenn man ihn nur gelegentlich zu Entwicklerzwecken braucht, sollte man deshalb am besten nicht - wie in Dienste beschrieben - mit dem Kommando update-rc.d
alle Start- und Stop-Links aus den "run levels" entfernen, sondern nur den Startlink aus dem "run level 2":
sudo rm /etc/rc2.d/S20mysql
Dadurch wird der Dienst beim Herunterfahren des Rechners immer korrekt beendet, auch wenn man vergessen hat, dass er noch läuft. Eine Raute #
vor dem Eintrag start on
in /etc/init/mysql.conf verhindert den automatischen Start:
1 | #start on ...
|
Problembehebung¶
Kein Login als root¶
Sollte es nach der Einrichtung Probleme mit der Anmeldung von root an der Datenbank geben oder sollten Programme, welche nur für die Einrichtung einer Tabelle einen einmaligen Zugang zur Datenbank benötigen, keinen Zugang mit root erlangen können, so liegt dies an einem fehlendem sudo-Login auf die Datenbank. Ein Beispiel ist hier die Einrichtung von Next- oder Owncloud im Installations-Wizard.
Testen kann man das, wenn man mittels
mysql -u root -p
nach Eingabe keines Passworts nur die Ausgabe
Enter password: ERROR 1698 (28000): Access denied for user 'root'@'localhost'
erhält.
Funktioniert hingegen der Log-In als root mittels sudo:
sudo mysql -u root -p
dann liegt es daran, dass der mysqladmin nur mit root-Rechten ohne eine Passworteingabe funktioniert. Dies ist u.a. für das Steuern des Servers notwendig.
Abhilfe schafft das Anlegen eines zweiten root-Accounts, um damit Anmeldungen ohne sudo zu ermöglichen.
Login als root:
sudo mysql -u root -p
Anlegen eines neuen Benutzers, z.B. "root2" mit dem Passwort "geheim":
1 | create user 'root2'@'localhost' identified by 'geheim'; |
alle Datenbanken für den Benutzer frei geben
1 | grant all on *.* to 'root2'@'localhost' identified by 'geheim' with grant option; |
und zum Schluß noch die Datenbank aktualisieren:
1 | flush privileges; |
und ausloggen
1 | quit; |
Ab jetzt können zum Einrichten von Datenbanken der Nutzer root2 mit dem Passwort "geheim" verwendet werden. Ursprüngliche Beschreibung des Problems bei Michael Kofler 🇩🇪 im Blog.
Passwort für debian-sys-maint neu setzen¶
Erscheint beim (Neu-)Start des MySQL-Servers folgende Fehlermeldung:
sudo service mysql restart #bis Ubuntu 14.04 sudo systemctl restart mysql.service #ab Ubuntu 14.10
* 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 als Benutzer root
am SQL-Server anmelden und nachfolgende Befehlssequenz am MYSQL-Prompt 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; flush privileges; quit;
Datensicherung¶
Hat man kritische, oder sensible, Daten in der Datenbank, ist es - wie üblich - ratsam, diese regelmäßig zu sichern. Dazu gibt es unterschiedliche Möglichkeiten wie etwa die direkte Kopie der Daten, das Auslesen der Datenbanken und Speichern des Inhalts, aber auch den Aufbau von Redundanzen (Replikation). Details zum Thema sind im Artikel MySQL/Backup näher beschrieben.
Graphische 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¶
MySQL Workbench - Modellierung, Planung und Wartung von (MySQL) Datenbanken
vergessenes Root-Passwort - zurücksetzen. 🇩🇪
ctaas.de/linux-install.htm 🇩🇪 - MySQL Server mit PHP5 bzw. PHP7 & Anbindung an Apache (LAMP) einrichten