MySQL-Befehle für jede Gelegenheit
Sofern nicht anders angegeben beziehen sich die Angaben auf ein UNIX-System
- Angabe des Kennworts in der Kommandozeile unsicher
Regelmäßig ist die Verwendung des mysql-Clients in Shellscripten nützlich um z.B. Backups zu erstellen oder Datenbankinhalte innerhalb des Scripts weiter zu verarbeiten.
Problematisch ist dabei, dass man für den Zugriff auf die Datenbank Benutzername und Kennwort verwenden muss.
Es ist zwar grundsätzlich möglich, dass man Benutzername und Kennwort als Parameter zum mysql-Befehl angeben kann. Unschön/Unsicher ist dabei, dass dies im Script gespeichert werden muss. Wer also den Quellcode zum Script lesen kann hat auch das Kennwort. Der mysql-Client gibt dazu auch eine Warnmeldung aus:
mysql -u BENUTZERNAME DATENBANKNAME -p KENNWORT
mysql: [Warning] Using a password on the command line interface can be insecure.
Eine mögliche Alternative ist die Verwendung einer separaten Konfigutaionsdatei, welche dann die erforderlichen Informationen enthält:
mysql --defaults-extra-file=/root/.mysql.cnf
Der Inhalt der Datei .mysql.cnf ist wie folgt:
[mysql]
user=BENUTZERNAME
password=DASKENNWORT
Der Dateiname .mysql.cnf beginnt mit einem . wodurch sie bei einem einfachen ls-Befehl nicht angezeigt wird.
Zusätzlich soll die Datei nur für den Benutzer lesbar sein, welcher das o.g. Script ausführt. Dies kann man über die Befehle chmod und chown einstellen:
chown BENUTZER:GRUPPE .mysql.cnf
chmod 600 .mysql.cnf
Wie immer gilt: Das Ganze muss getestet werden.
2. Alle Datenbanken sichern und komprimiert ablegen
Es passiert immer wieder: es wird ein Script erstellt welches die vorhandenen Datenbanken sichert und dann kommt eine neue DB hinzu – und das Sicherungsscript wird nicht ergänzt.
Mit dem folgenden Script wird zunächst eine Liste der vorhandenen Datenbanken erstellt und diese dann „gedumpt“ – alle Daten und die Tabellenstruktur werden in eine Datei gespeichert. Danach erfolgt die Komprimierung.
Alle Backup-Dateien erhalten im Dateinamen den Zeitstempel.
#!/bin/bash
NOW=`date "+%Y%m%d_%H%M"`
BACKUPPATH=/pfad/zu/den/backups
#Wenn der Backup-Pfad nicht existiert wird diese angelegt.
[ ! -d ${BACKUPPATH} ] && mkdir -p ${BACKUPPATH}
#Datenbankliste erstellen und in der Variable DBLIST speichern
DBLIST=`mysql --defaults-extra-file=/root/.mysql.cnf 2>/dev/null <<!
show databases;
!`
#Für jeden Eintrag in der Datenbankliste mit Ausnahme der Datenbanken "information_schema" und "performance_schema"
for ii in `echo $DBLIST|cut -d' ' -f2-|sed -e 's/information_schema//g'|sed -e 's/performance_schema//g'`
do
[ -d /var/lib/mysql/$ii ] && mysqldump --defaults-extra-file=/root/.mysqldump.cnf ${ii} >${BACKUPPATH}/${ii}_${NOW}.dump
[ ! -d /var/lib/mysql/$ii ] && echo "Datenbank $ii existiert nicht"
done
#Alle dump-Dateien im Backupverzeichnis finden und komprimieren.
find ${BACKUPPATH} -name \*.dump -exec gzip {} \;
3. Datenbanken anlegen, löschen und Benutzer berechtigen
Beim Anlegen einer Datenbank kann man den Zeichensatz und die Collation angeben.
Hierdurch wird angegeben welche Zeichen gespeichert werden und das Verhalten beim Vergleichen und sortieren von Zeichenketten. Wird beim Anlegen der Datenbank nichts festgelegt gilt der Systemstandard.
Es wird darauf hingewiesen, dass eine Datenbank vom Systemstandard abweichen kann, aber Probleme sind zu erwarten.
Der Systemstandard wird bestimmt von den Variablen in der MySQL-Server Konfiguration (mysqld.cnf) zum Beispiel:
character-set-server=utf8mb4
collation-server=utf8mb4_bin
Datenbank anlegen:
CREATE DATABASE DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Datenbank löschen:
drop database DBNAME;
Bitte berücksichtigen: Wenn eine Datenbank gelöscht wird, werden die darauf angelegten Berechtigungen NICHT gelöscht. Sollte es danach wieder eine neue Datenbank geben mit gleichem Namen so gelten die vorher gesetzten Berechtigungen weiter.
Benutzer anlegen:
MySQL hat in den aktuellen Versionen verschiedene Möglichkeiten der Authentifizierung und auch Möglichkeiten den Zugriff auf lokal oder netzbasiert einzuschränken.
Benutzer anlegen mit Authentifierung über Kennwort:
(Dieser Befehl wird in der mysql-History nicht gespeichert)
CREATE USER 'Username' IDENTIFIED BY 'Kennwort';
Benutzer auf Datenbank berechtigen:
GRANT ALL PRIVILEGES ON DBNAME.* TO 'Username' WITH GRANT OPTION;
flush privileges;
4. MySQL Server absichern nach Neuinstallation
Nach der Installation können durch das Script ‚mysql_secure_installation‘ einige Sicherheitsrelevante Einstellungen vorgenommen werden.
Trotzdem hat der User „root“ weiterhin kein Kennwort. Zwar gilt das nur für den Zugriff vom lokalen Server, aber Sicherheit geht anders. Durch den folgenden Befehl kann man für den Benutzer ‚root‘ ein Kennwort setzen:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Your_Passwort';