MySQL - weitere Instanz auf gleichen Server starten / betreiben
Aus znilwiki
Durch einen Fehler in der Datenbank von Zabbix ist mir neulich nach einem Restore der ganze Webserver weggeraucht ... die Datenbank hatte dadurch alle anderen mitgerissen.
Nun - schade um die Daten - aber geben wir doch Zabbix in Zukunft eine eigene mySQL Server Datenbank-Instanz:
Ausgangslage
Wir haben schon einen Linux Server auf dem bereits eine Standard-Instanz von mySQL auf Port 3306 läuft.
Die hat also die folgenden Standardwerte:
Konfigurationsdatei: /etc/mysql/my.cnf Datenpfad /var/lib/mysql Port: 3306 Socket-Datei /var/run/mysqld/mysqld.sock Pfad zur PID Datei /var/run/mysqld/mysqld.pid
Unsere neue Instanz darf nun nicht mit den obigen Werten konkurieren!
Vorbereitung neue Instanz
Ich nenne die neue Instanz hier mysqlzabbix
,
ich arbeite hier als root - ihr müsst sonst ggf. immer ein sudo
dem befehlen voran stellen.
Neues Datenverzeichnis anlegen:
mkdir /var/lib/mysqlzabbix
mysql zum Besitzer machen
chown -R mysql:mysql /var/lib/mysqlzabbix
Neues Logverzeichnis anlegen
mkdir /var/log/mysqlzabbix
mysql zum Besitzer machen
chown -R mysql:adm /var/log/mysqlzabbix
Neues Konfigurationsverzeichnis anlegen
mkdir /etc/mysqlzabbix
Originalkonfiguration zum anpassen kopieren
cp /etc/mysql/my.cnf /etc/mysqlzabbix/myzabbix.cnf
Konfiguration neue Instanz
wir bearbeiten nun die myzabbix.cnf
(vi oder nano etc.)
nano /etc/mysqlzabbix/myzabbix.cnf
oder
vi /etc/mysqlzabbix/myzabbix.cnf
und ändern mindestens folgende Zeilen - wenn es eine nicht gibt fügt diese hinzu!
datadir = /var/lib/mysqlzabbix port = 33306 socket = /var/run/mysqld/mysqldzabbix.sock pid-file = /var/run/mysqld/mysqldzabbix.pid log_error = /var/log/mysqlzabbix/error.log #general_log_file = /var/log/mysqlzabbix/mysql.log #general_log = 1
vor die letzen beiden Einträge ist ein #
- das Deaktiviert diese.
Schlagen die Macher von mySQL selbst vor das dies ein Performance-Killer wäre.
Für den Fall der Fälle stehen die Einträger aber schon mal drin.
Eventuell noch Tuning?
Wo wir schon mal dabei sind - tragen wir doch noch gleich
[mysqld] innodb_file_per_table
Also im Abschnitt [mysqld]
die Zeile innodb_file_per_table
hinzufügen.
Dann schreibt er nicht alle Datenbanken in eine große Datei sondern legt pro Datenbank eine Datei an.
Das alles in einer großen war hat mir letztes mal das Genick gebrochen.
Wenn dann eine Beschädigt ist reisst diese alle anderen mit.
Datenbank Initialisieren / Grundstruktur anlegen
Mit
mysql_install_db --user=mysql --datadir=/var/lib/mysqlzabbix/
bauen wir in unserem neuen Daten-Ordner das Grundgerüst auf.
Neue Instanz testen
Probeweise starten wir nun unsere neue Datenbank:
mysqld_safe --defaults-file=/etc/mysqlzabbix/myzabbix.cnf &
Das &
am Ende schickt den Prozess in den Hintergrund
Die Ausgabe sollte etwas so aussehen:
root@h2108591:/etc# 131003 14:01:47 mysqld_safe Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect. 131003 14:01:47 mysqld_safe Logging to '/var/log/mysqlzabbix/error.log'. 131003 14:01:47 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysqlzabbix
Nun öffnen wir eine Testverbindung:
mysql -h 127.0.0.1 -P 33306
Wenn wir einen
mysql>
Prompt bekommen hat alles geklappt, mit
exit
kommen wir wieder raus
mc
Mit
mysqladmin -S /var/run/mysqld/mysqldzabbix.sock shutdown
beenden wir den Server wieder
Automatischen Start beim Booten einrichten
Man kann ja z.B. mit
ps -A | grep mysqld
sich die laufenden MySQL Prozesse anzeigen lassen.
Normalerweise ist da immer nur einer - aber woran sehe ich welche meine 2. Instanz ist für Zabbix?
Lösung: indem wir das nicht mit mysqld
sondern mysqldzabbix
laufen lassen!
Als Vorbereitung deshalb ein:
ln /usr/sbin/mysqld /usr/sbin/mysqldzabbix
durch das ln
ist das eine harte Verknüpfung - es ist die gleiche Datei, sie hat nun nur einen 2. Namen.
Dadurch greifen wir auch nach Updates immer auf die aktuelle Version zu.
Nun brauchen wir ein Script für /etc/init.d/
als start|stop|restart Punkt:
mit
touch /etc/init.d/mysqlzabbix
erzeugen wir die Datei und machen diese mit
chmod 755 /etc/init.d/mysqlzabbix
ausführbar.
Nun mit
nano /etc/init.d/mysqlzabbix
bearbeiten und folgendes Skript hinein kopieren:
#!/bin/sh
#
# mysqlzabbix start/stop script.
#
# 2013 znil.net by Bernhard Linz / Bernhard@znil.de
#
# startet 2. mysqlserever Instanz
#
# zur Vorbereitung einmalig
# ln /usr/sbin/mysqld /usr/sbin/mysqldzabbix
# eingeben
INSTANCENAME="mysqldzabbix"
# Test 1
# prüfen ob unsere Instanz schon läuft ...
# Wenn da ein PID-File ist - dann ja!
if [ -s "/var/run/mysqld/mysqldzabbix.pid" ]; then
# Es gibt ein PID-File - lesen wir die PID daraus aus
INSTANCEPIDFILE=$(cat /var/run/mysqld/mysqldzabbix.pid)
else
#Gibt kein PID-File - wir setzen den Wert auf 0
INSTANCEPIDFILE=0
fi
# Test 2
# das es das PID-File gibt ist ja schön und gut - aber gibt es auch einen Prozess
# mit unserem Namen?
INSTANCEPIDPROCESS=$(pidof mysqldzabbix)
if [ -z "$INSTANCEPIDPROCESS" ]; then
# Variable ist leer, dann nicht
INSTANCEPIDPROCESS=99999999
fi
# Nun fängt die eigentliche Arbeit an ...
case "$1" in
start)
# aber nur wenn wir noch nicht gestartet sind!
if [ "$INSTANCEPIDFILE" -eq "$INSTANCEPIDPROCESS" ]; then
# nix da, läuft schon!
echo "MySQL Server Instanz läuft schon: $INSTANCENAME"
exit 1
else
echo "Starte MySQL Instanz: $INSTANCENAME"
# Variante 1 - bevor ich nohup kannte
/usr/sbin/mysqldzabbix --defaults-file=/etc/mysqlzabbix/myzabbix.cnf > /dev/null 2> /dev/null &
# Variante 2 - nohup
#nohup /usr/sbin/mysqldzabbix --defaults-file=/etc/mysqlzabbix/myzabbix.cnf &
fi
;;
stop)
# auch stoppen nur wenn schon ein Prozess läuft:
if [ "$INSTANCEPIDFILE" -eq "$INSTANCEPIDPROCESS" ]; then
# jepp, läuft, also stoppen
echo "Stoppe MySQL Instanz: $INSTANCENAME"
mysqladmin -S /var/run/mysqld/mysqldzabbix.sock shutdown
else
# Gibt nichts zu stoppen ...
echo "MySQL Server Instanz ist bereits beendet: $INSTANCENAME"
fi
;;
restart|force-reload)
$0 stop
$0 start
;;
*)
N=/etc/init.d/$NAME
echo "Aufruf: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
Dann die Datei speichern.
kleiner Test: mit
/etc/init.d/mysqlzabbix start
starten - wenn alles klappt sollte
ps -A | grep mysqld
etwa folgendes ausgeben:
root@h2108591:/etc/init.d# ps -A | grep mysq 8839 ? 00:00:29 mysqld 13282 pts/1 00:00:00 mysqldzabbix
mit
/etc/init.d/mysqlzabbix stop
wieder stoppen.
Das Skript prüft beim starten und stoppen auch immer brav ob nicht vielleicht schon ein Prozess läuft und tut dann ggf. nichts, es passiert also nichts wenn man es mehrmals aufruft.
Nun müssen wir unser Start-Skript nur noch in den normalen Bootvorgang einbinden:
update-rc.d mysqlzabbix defaults
danach können wir auch
service mysqlzabbix start
etc. nutzen - siehe auch init.d Script in den automatischen Start/Stop mit aufnehmen
Datenbak mit in Plesk Oberfläche aufnehmen
Jepp, mein Webserver hat die Plesk-Management Oberfläche - und das ist auch gut so!
Wir brauchen einen Benutzer mit dem Plesk auf die Datenbank zugreifen kann.
Dazu öffnen eine Verbindung zur laufenden Datenbank:
mysql -h 127.0.0.1 -P 33306
und am Prompt geben wir
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'123.123.123.123' IDENTIFIED BY 'daspasswort' WITH GRANT OPTION;
Dabei müsst Ihr admin
durch den gewünschten Benutzernamen und dasspasswort
durch - na ihr wisst schon ersetzen.
Die Zahlen 123.123.123.123
müsst ihr durch eine der IP-Adressen des Servers ersetzen - das hat optische Gründe!!!!! (kommt weiter unten)
Mit
exit
geht es wieder raus.
Alternativ als Einzeiler vom Prompt aus:
echo "GRANT ALL PRIVILEGES ON *.* TO 'admin'@'123.123.123.123' IDENTIFIED BY 'daspasswort' WITH GRANT OPTION;" | mysql -h 127.0.0.1 -P 33306
In der Plesk Oberfläche geht Ihr nun auf
Server --> Applikationen & Datenbanken --> Datenbankserver
Dort gibt es einen Button Datenbankserver hinzufügen
Nun kommt BITTE NICHT auf die Idee dort bei der Adresse einfach "localhost" einzugeben!
Dann fügt er die Datenbank als '"Lokaler MySQL-Server"' hinzu und ihr könnt nichts damit anfangen - denn diese gibt es ja schon.
Ihr habt dann 2 Einträge die er als den gleichen behandelt - und könnt den falschen nicht mal wieder löschen .... doch könnt Ihr:
Geht dann rechts neben der "Standard für MySQL" Datenbank auf das Werkzeugsymbol.
Es öffnet sich ein phpMyAdmin - geht auf die Datenbank "psa" in die Tabelle "DatabaseServers" und löscht die letzte Zeile (wahrscheinlich id 3, NICHT 1 oder 2)
Tricks mit der /etc/hosts etc greifen auch nicht- er lässt sich da nicht beschubsen
--Bernhard Linz 22:41, 3. Okt. 2013 (CEST)