Aktionen

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!

Warning.png
Warnung: Einträge wie socket kommen mehrmals in der Datei vor - ändert alle!
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)


Loading comments...