[[Vorlage(Getestet, bionic, focal)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis(2)]] [[Bild(./mysql.png, align=left)]] [https://www.mysql.com/de/ MySQL] {de} 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:MySQL#Kritik: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 {{{#!vorlage Paketinstallation mysql-server }}} aus der Paketverwaltung heraus installiert [1] werden. Bei Ubuntu [:Bionic: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 [:Bilder_verwalten#Mit-Datenbank:Bildergalerie]), benötigt noch das Paket: {{{#!vorlage Paketinstallation 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. === 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. {{{#!vorlage Befehl mysqladmin -u BENUTZERNAME -p password WUNSCHPASSWORT }}} Dabei wird jeweils das alte Passwort abgefragt. Sollte dieses vorher leer gewesen sein, so kann einfach per [[Vorlage(Tasten, Enter)]] 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 [:Bionic: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 {{{#!vorlage Befehl mysql -u root }}} in einer root-Shell am MySQL-Server anmelden und die folgenden Kommandos an der MySQL-Eingabeaufforderung `mysql> ` eingeben: {{{#!vorlage Befehl 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 [:MySQL#Problembehebung: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: {{{#!code apparmor /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 [wikipedia: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: {{{#!code mysql # 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 [https://dev.mysql.com/doc/ Referenzhandbuchs] {en} online zur Verfügung. == Datenbank erstellen == Zum Erstellen einer neuen Datenbank meldet man sich zuerst als Datenbank-Administrator an: {{{#!vorlage Befehl 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): {{{#!vorlage Befehl 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): {{{#!vorlage Befehl 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: {{{#!vorlage Befehl grant all privileges on datenbankname.* to 'www-data'@'localhost'; flush privileges; }}} * Abmelden mit: {{{#!vorlage Befehl quit; }}} Alternativ kann `exit;` benutzt werden. == Tabellen-Speicherarten == MySQL kennt verschiedene Tabellen-Speicherarten, die sogenannten [https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html Storage Engines] {en}. 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 [wikipedia:Transaktionssicherheit:] bietet und [wikipedia:Constraint#Constraints_in_Datenbanksystemen:Fremdschlüssel] (sogenannte "Constraints") unterstützt. Ist die [wikipedia:Konsistenz_(Datenspeicherung):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 {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 [https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html MySQL-Dokumentation] {en} nachgeschlagen werden. == Passwort für debian-sys-maint neu setzen == Erscheint beim (Neu-)Start des MySQL-Servers {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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:]. = Links = * [https://www.mysql.de/ Offizielle Homepage] {de} * [https://dev.mysql.com/community/ Offizielle Community-Webseite] {en} # tag: Internet, Netzwerk, Server, Datenbank