ubuntuusers.de

MySQL

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

./mysql.png 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

Paketliste zum Kopieren:

sudo apt-get install mysql-server 

Oder mit apturl installieren, Link: apt://mysql-server

aus der Paketverwaltung heraus installiert [1] werden. Bei Ubuntu 16.04 und 18.04 wird dabei die Datenbank in der Version 5.7 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

Paketliste zum Kopieren:

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. 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.

Für Ubuntu 16.04 gilt: Bei der Installation des MySQL-Servers wird automatisch nach einem Passwort für den Datenbank-Administrator root gefragt.

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 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 unauthorisiertes 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 dieses aus welchen Gründen auch immer nicht geschehen (wie es z.B. für Ubuntu 18.04 der Fall ist) oder aber bei der Abfrage 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. 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 unabhängiges Passwort gesetzt werden soll, muss man sich mittels

mysql -u root 

in einer root-Shell am MySQL-Server anmelden und die folgenden Kommandos an der MySQL-Eingabeaufforderung mysql> eingeben:

ALTER USER 'root'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'NeuesPasswort';
FLUSH privileges;
QUIT; 

Alternativ kann für das Ausführen der MySQL-Befehle auch eine MySQL-Eingabeaufforderung unter Verwendung des debian-sys-maint-Benutzers benutzt werden.

Durch die Angabe von IDENTIFIED WITH mysql_native_password wird wieder das MySQL - eigene Passwort verwendet und der Zugang kann auch von anderen 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. 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

erreichen. 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 Benutzer und Gruppen 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

Zum Erstellen einer neuen Datenbank meldet man sich zuerst als Datenbank-Administrator an:

mysql -u root -p 

An der MySQL-Eingabeaufforderung 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 Kennwort geheim 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.

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 WITH mysql_native_password BY 'NeuesPasswort';
FLUSH privileges;
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;
flush privileges;
quit; 

Datensicherung

Es gibt verschiedene Strategien, wie man (regelmäßige) Datensicherungen durchführen kann. Näheres hierzu findet man im Unterartikel MySQL/Backup.

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.

Diese Revision wurde am 19. Juni 2020 14:31 von mubuntuHH erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Datenbank, Internet, Server, Netzwerk