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 erfreut sich in der (Linux-)Community einer sehr großen Beliebtheit und wird sehr häufig für Webanwendungen zusammen mit dem Webserver Apache und PHP eingesetzt. Viele Projekte und Software wie z.B. OpenStreetMap oder TYPO3 verwenden MySQL als Datenbank. Auch Inyoka, die Software von ubuntuusers.de, auf der auch dieses Wiki läuft, setzt eine MySQL-Datenbank zur Speicherung der Daten ein.
Die MySQL-Datenbank gibt es in einer freien Community-Variante (welche über die Ubuntu-Quellen verfügbar ist) und einer kostenpflichtigen Enterprise-Variante. Von der Leistungsfähigkeit unterscheiden sich die beiden Varianten nur marginal, der Hauptunterschied liegt in der Geschwindigkeit und Häufigkeit, mit der Updates und Service-Packs angeboten werden, sowie in der Verfügbarkeit von kommerziellem Support. MySQL ist neben Linux auch für Windows, MacOS, FreeBSD, Solaris und weitere Betriebssysteme verfügbar
.
MySQL kann direkt aus den Paketquellen von Ubuntu installiert werden. Dazu muss nur das Paket
mysql-server
aus der Paketverwaltung heraus installiert [1] werden. Bis einschließlich Ubuntu 8.10 wird dabei der Version 5.0 installiert, danach Version 5.1.
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
MySQL wird über die Datei /etc/mysql/my.cnf konfiguriert, es müssen hier aber üblicherweise keine Änderungen vorgenommen werden. Mittels eines Editors [4] kann man die Datei editieren und ein paar interessante Funktionen aktivieren bzw. Einstellungen vornehmen. Die wichtigsten Optionen sollen hier kurz vorgestellt werden.
MySQL speichert die Datenbanken im Verzeichnis /var/lib/mysql ab. Möchte man einen anderen Pfad definieren, so kann man dies in der Option
datadir = /var/lib/mysql
eintragen. Dabei ist zu beachten, dass die Daten dem Benutzer bzw. der Gruppe "mysql" gehören sollten, damit der MySQl-Server dort auch schreiben darf. Mehr zum Thema Benutzer und Gruppen im Wiki.
Lässt sich der MySQL-Server danach nicht starten, liegt es wahrscheinlich an den Profil-Einstellungen von AppArmor. In der Datei /etc/apparmor.d/usr.sbin.mysqld sollte das entsprechende Verzeichnis angepasst werden.
... /var/lib/mysql/ r, /var/lib/mysql/** rwk, ...
Nach der Installation ist der MySQL-Server so konfiguriert, dass er nur vom localhost - also vom lokalen Rechner aus - erreichbar ist. Soll der Server über das Netzwerk ansprechbar sein, so kann man hier
# 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
die interne IP-Adresse des Servers eintragen. 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 mit "bind-address = " oder mit "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. Weitere Hinweise hierzu findet man im MySQL Handbuch
.
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.
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 ab Ubuntu 8.04 wird nach dem Passwort für "Root" gefragt, bei älteren Ubuntu-Versionen bleibt das Passwort leer.
Eventuell ist es daher sinnvoll, für den "root"-Benutzer ein Passwort zu setzen. Dies sollte auf jeden Fall gemacht werden, wenn z.B. phpMyAdmin installiert wird und so der MySQL-Server aus dem Netz bedienbar gemacht wird.
mysqladmin -u root -p password "WUNSCHPASSWORT"
Dann wird nach einem Passwort gefragt. Da noch keines hinterlegt ist, kann man hier einfach ohne Eingabe mit ⏎ bestätigen. Auf diesem Weg kann man auch ein bestehendes Passwort ändern.
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.
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 User "debian-sys-maint" am MySQL-Server anmelden und die folgende Befehlssequenz eingeben:
mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> quit; Erscheint beim (Neu-)Start des MySQL-Servers folgende Fehlermeldung:
sudo /etc/init.d/mysql restart # bis Karmic sudo service mysql restart # ab Lucid
* 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 eingeben. Dabei newpassword durch den Passwort-Eintrag in der Datei /etc/mysql/debian.cnf ersetzen.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'newpassword' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql> \q
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 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").
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.
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 komplett 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.
Wie alle anderen Dienste bringt MySQL-Start/Stop-Skripte mit. Diese Skripte lassen sich natürlich auch zum Kontrollieren des Servers gebrauchen. Aus einem Terminal [3] heraus kann man mit
# Allgemein
sudo /etc/init.d/mysql {start|stop|restart|reload|force-reload|status} # bis Karmic
sudo service mysql {start|stop|restart|reload|force-reload|status} # ab Lucid
# Beispiel
sudo /etc/init.d/mysql reload # bis Karmic
sudo service mysql reload # ab Lucid den Server steuern. Die einzelnen Optionen dabei bedeuten:
start - Startet den MySQL-Server
stop - Stoppt den Server
restart - Startet den Server neu, bestehende Verbindungen auf den Server werden gekappt
reload - Lädt die Konfigurationsdateien neu, ohne dass Verbindungen getrennt werden
force-reload - Lädt die Konfigurationsdateien neu, auch wenn dabei Verbindungen verloren gehen
status - Zeigt Status-Informationen und den Zustand des MySQL-Servers an
Mehr dazu im Wiki unter Dienste.
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 Runleveln entfernen, sondern nur den Startlink aus dem Runlevel 2:
sudo rm /etc/rc2.d/S20mysql
Dadurch wird der Dienst beim Shutdown immer korrekt heruntergefahren, auch wenn man vergessen hat, dass er noch läuft. Ab Ubuntu 10.04 Lucid Lynx verhindert ein # vor dem Eintrag start on in etc/init/mysql.conf den automatischen Start:
#start on ...
Hat man kritische, und/oder sensible, Daten in der Datenbank, ist es - wie üblich - ratsam, regelmäßig ein Backup der Daten zu machen. Dazu gibt es mehrere Möglichkeiten.
Für den Vorgang der Datensicherung ist es extrem wichtig, dass während dieser Zeit keine Daten geschrieben werden. D.h. es gilt, entweder alle Tabellen gegen Schreibzugriffe zu sperren, oder - besser - den MySQL-Server für die Zeit der Datensicherung herunterzufahren. Dabei ist auch zu beachten, dass der Server fehlerfrei herunter fährt.
Ist einer dieser Punkte nicht erfüllt, riskiert man Inkonsistenz in den Daten.
Eine recht simple Methode ist, die Dateien zu kopieren, in denen MySQL die Daten speichert. Wie weiter oben bereits erwähnt, liegen die Daten standardmäßig im Verzeichnis /var/lib/mysql. Dort gibt es dann für jede Datenbank ein Unterverzeichnis. Die Dateien tragen normalerweise den Namen der entsprechenden Tabelle in der Datenbank.
Die Unterverzeichnisse für die Datenbanken sind nur für "root" lesbar, alle anderen Benutzer haben keine Leserechte.
Verwendet man MyISAM-Tabellen, sichert man alle Dateien mit den Endungen myd, frm und myi.
Verwendet man InnoDB-Tabellen, kopiert man alle frm-Dateien sowie alle Dateien der Typen ib_logfileX, ibdataX und idb. X muss durch die entsprechende Zahl ersetzt werden, wobei Dateien auch mehrfach vorkommen können.
Unabhängig vom Tabellentyp sollte auch immer zusätzlich die Datei /etc/mysql/my.cnf mit gesichert werden.
Grundsätzlich hat diese Art der Datensicherung den Nachteil, dass man nie 100% sicher stellen kann, dass die kopierten (Binär-)Dateien fehlerfrei sind, also es keine Probleme beim Kopieren gab.
Möchte man gesicherte Dateien auf ein anderes System einspielen, so kann man wie folgt vorgehen:
MySQL auf dem neuen System ganz normal wie in diesem Artikel beschrieben installieren.
Vom Ordner /var/lib/mysql auf dem neuen System zunächst ein Backup machen und dann löschen.
Den wiederherzustellenden Ordner mysql aus dem alten System nach /var/lib/ auf dem neuen System kopieren.
Die Datei mit der Endung .pid aus dem Ordner /var/lib/mysql mit der .pid-Datei aus dem unter Punkt 2 gesicherten Ordner ersetzen.
Rechte anpassen:
sudo chown -R mysql:mysql /var/lib/mysql/
Ggf. phpmyadmin neuinstallieren
Nur so wird sichergestellet, dass auch InnoDB-wiederhergestellt werden! Ein einfaches kopieren der Datenbank-Ordner reicht zum Wiederherstellen von Datenbanken mit InnoDB-Tabellen nicht aus, da auch die Datei /var/lib/mysql/ibdata1 und weitere Dateien im Stammordner für InnoDB-Tabellen benötigt werden!
Ein logisches Backup dauert zwar länger, ist aber dafür etwas eleganter. Weiterhin haben logische Backups den Vorteil, dass diese sich grundsätzlich auf andere SQL-Datenbanken (z.B. PostgreSQL, Oracle, SQL Server) zurück sichern lassen. Ein logisches Backup besteht außerdem aus einer Textdatei, welche - wenn nötig - mit einem konventionellen Editor einsehbar ist.
Ein logisches Backup erfolgt unter MySQL mit Hilfe des Programms mysqldump, welches standardmäßig mit installiert wird.
Um einen konsistenten "dump" zu erzeugen, sperrt mysqldump die Datenbank. Je nach Größe und Aufwand ist der Server für normale Zugriffe somit eine gewisse Zeit nicht erreichbar.
Der Befehl
mysqldump --opt -u root -p --all-databases > sicherung.sql
sichert mit den Rechten des (SQL-Benutzers) "root" alle Datenbanken in die Datei sicherung.sql. Die Sicherung kann natürlich auch mit einem anderen Benutzer durchgeführt werden, sofern dieser die notwendigen Rechte in den zu sichernden Datenbanken hat. Sehr wichtig ist die angegebene Option --opt, da diese alle notwendigen Sperren für die Dauer der Sicherung setzt.
Anstatt allen Datenbanken kann man auch einzelen Datenbanken sichern. Möchte man z.B. nur die Datenbank "foobar" sichern, so lautet der Befehl
mysqldump --opt -u root -p foobar > sicherung.sql
Möchte man den Dump zurücksichern, so geschieht dies mit dem Befehl
mysql -u root -p < sicherung.sql
Ab Ubuntu 9.10 Karmic Koala ist AutoMySQLBackup in den offiziellen Paketquellen enthalten. Es handelt sich um ein mysqldump-Skript in Kombination mit Cron-Einträgen, um automatisch tägliche, wöchentliche und monatliche Sicherungen anzulegen.
Folgenden Code muss man als Shellskript speichern und die Variable BACKUPDIR anpassen. Das Skript schreibt dann ein Skript, welches von cron aufgerufen wird und jede Nacht eine SQL-Datei pro Datenbank in das BACKUPDIR schreibt. Das Skript nutzt ebenfalls mysqldump.
#!/bin/bash # Create Backupscript for MySQL on a standard Ubuntu machine BACKUPDIR=/var/backup/ BACKUPFILE=/usr/sbin/mysqlbackup.sh CRONFILE=/etc/cron.d/mysql_backup cat > $BACKUPFILE << EOF #!/bin/bash # Autogenerated Backupfile for MySQL DB # Set var depending on system EOF sed -e "s/\s//g" < /etc/mysql/debian.cnf | grep -E "^password|^user" >> $BACKUPFILE echo '# Create for each DB a sql-file for db in `mysqlshow -u $user -p$password | sed -n -e "s/^| \([^ ]*\)[ ]*|$/\1/p"` do mysqldump --opt -u $user -p$password $db > $BACKUPDIR/$db.sql done' >> $BACKUPFILE chown root:root $BACKUPFILE chmod 700 $BACKUPFILE cat > $CRONFILE << EOF 20 02 * * * root /usr/sbin/mysqlbackup.sh EOF
Der MySQL-Server unterstützt auch Datenreplikation, bei der quasi "live" die Daten eines Master SQL-Servers auf einen oder mehrere Slave-Server kopiert werden. Das Grundsetup hierfür ist nicht weiter schwierig und im MySQL-Benutzerhandbuch beschrieben
.
Es gibt eine Reihe von graphischen Benutzeroberflächen, die den Umgang mit MySQL erleichtern. Mehr Informationen findet man im Artikel MySQL/Werkzeuge.
MySQL Workbench - Modellierung, Planung und Wartung von (MySQL) Datenbanken
MySQL - Wikipedia
vergessenes Root-Passwort zurücksetzen 
Pro-Linux-Buchvorstellung: »High Performance MySQL« Optimierung, Backups, Replikation und Lastverteilung (06/2009) 
Diese Revision wurde am 11. April 2012 20:13 von ubot erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen:
Netzwerk, Server, Internet, Datenbank
2004 – 2012 ubuntuusers.de • Einige Rechte vorbehalten