MariaDB bei Uberspace.de

Update: Uberspace.de bietet inzwischen eine eigene Übergangslösung für MariaDB 10.0 an.

Die Server bei Uberspace.de basieren zur Zeit noch auf CentOS 6, das eine relativ alte MySQL Version (5.1) an Bord hat:

mysql -V
mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1

Wenn man Software laufen lassen möchte, die neuere Versionen benötigt (z.B. TYPO3 7), kann man entweder warten bis die CentOS 7 Hosts fertig sind oder seinen eigenen Server laufen lassen.

Dies ist ein kleines HowTo, wie man bei Uberspace.de einen eigenen MariaDB Server betreiben kann.

jemalloc installieren

MariaDB benötigt die Bibliothek jemalloc, die auf den Uberspace Hosts nicht vorhanden ist. Diese kann man mit toast installieren:

$ toast arm https://github.com/jemalloc/jemalloc/releases/download/4.0.4/jemalloc-4.0.4.tar.bz2

Da MariaDB nach der Datei libjemalloc.so.1 sucht, toast aber nur libjemalloc.so.2 installiert, wird noch ein Symlink benötigt:

cd ~/.toast/armed/lib
ln -s libjemalloc.so.2 libjemalloc.so.1

MariaDB installieren

Zunächst muss die korrekte Version heruntergeladen werden. Die verfügbaren Versionen findet man auf der Downloadseite von MariaDB.

Wichtig ist hier, dass man die Version für Linux x86_64 verwendet und zwar die ohne (requires GLIBC_2.14+) im Dateinamen. Das folgende Script lädt die Version 10.1.8 herunter:

mkdir -p ~/opt/mysql
cd ~/opt/mysql
wget https://downloads.mariadb.org/interstitial/mariadb-10.1.8/bintar-linux-x86_64/mariadb-10.1.8-linux-x86_64.tar.gz/from/http%3A//mirrors.n-ix.net/mariadb/ -O mariadb-10.1.8-linux-x86_64.tar.gz
tar -xzf mariadb-10.1.8-linux-x86_64.tar.gz
ln -s ~/opt/mysql/mariadb-10.1.8-linux-x86_64 ~/mysql

Im Verzeichnis ~/opt/mysql können mehrere Versionen von MariaDB entpackt werden, der Symlink ~/mysql zeigt immer auf die Version, die aktuell verwendet werden soll. Das ganze ist nur ein Vorschlag für eine mögliche Struktur und kann natürlich an die eigenen Bedürfnisse und Geschmäcker angepasst werden.

MariaDB konfigurieren

Wir müssen MariaDB noch sagen, dass es seine Daten in unserem Home-Verzeichnis ablegen und auch nur auf einem Socket in unserem Home-Verzeichnis lauschen soll.

Dazu erzeugen wir zunächst die benötigten Verzeichnisse:

mkdir ~/opt/mysql/data
mkdir ~/opt/mysql/tmp

Außerdem machen wir ein Backup von der my.cnf Datei von Uberspace und legen eine neue Version an:

mv  ~/.my.cnf ~/.my.cnf.orig
vi ~/.my.cnf

Die my.cnf Datei sollte folgenden Inhalt haben (kann bei Bedarf natürlich auch angepasst werden):

[client-server]
# Socket konfigurieren, auf dem der Server lauscht
socket=/home/uberuser/mysql/mysql.sock

[client]
# Standard Benutzername und Passwort konfigurieren, damit können mysql
# Befehle ohne Angabe von Zugangsdaten auf der Shell ausgeführt werden.
user=root
password=[Das festgelegte root Passwort]

[mysqld]

# Netzwerk deaktivieren, nur per Socket lauschen
skip-networking

# Datenverzeichnis konfigurieren
data=/home/uberuser/opt/mysql/data

# Verzeichnis für temporäre Dateien konfigurieren
tmpdir=/home/uberuser/opt/mysql/tmp

# Sprachdatei konfigurieren
language=/home/uberuser/mysql/share/english

# Aus der Standardkonfiguration von
# https://mariadb.com/kb/en/mariadb/mysqld-configuration-files-and-groups/

# Create a file where the InnoDB/XtraDB engine stores it's data
loose-innodb_data_file_path = ibdata1:1000M
loose-innodb_file_per_table

# This is the prefix name to be used for all log, error and replication files
log-basename=mysqld

Umgebung einrichten

Damit die MySQL Befehle der Servers mit den MariaDB Befehlen überschrieben werden, muss das ~/mysql/bin Verzeichnis in die $PATH Variable aufgenommen werden.

Dazu in der Datei ~/.bash_profile die Zeile mit der $PATH Initialisierung wie folgt anpassen:

PATH=$HOME/bin:$HOME/mysql/bin:$PATH

Wichtig ist dabei, dass das mysql Verzeichnis vorne steht.

Datenbank erstellen

Bevor man die Datenbank starten kann, muss das data-Verzeichnis initialisiert werden.

Dazu kann folgender Befehl verwendet werden:

cd ~/mysql/
./scripts/mysql_install_db --defaults-file=~/.my.cnf

Sollte dabei etwas schieflaufen, kann man das Verzeichnis einfach löschen und neu anlegen.

Service einrichten

Um den Server zu starten, können die daemontools verwendet werden. Diese müssen zunächst initialisiert werden:

test -d ~/service || uberspace-setup-svscan

Anschließend kann der Dienst eingerichtet werden:

uberspace-setup-service mariadb ~/mysql/bin/mysqld_safe

Da der Befehl noch angepasst werden muss, damit alles richtig läuft, stoppen wir den Dienst:

svc -d ~/service/mariadb

Jetzt bearbeiten wir die Datei ~/service/mariadb/run und passen die letzte Zeile an:

cd $HOME/mysql/
exec ./bin/mysqld_safe --defaults-file=~/.my.cnf 2>&1

Anschließend kann der Dienst wieder gestartet werden:

svc -u ~/service/mariadb

phpMyAdmin

Man kann logischerweise für die Administration nicht das vorinstallierte phpMyAdmin von Uberspace nutzen. Daher installieren wir unser eigenes:

cd /var/www/virtual/$USER/html
wget https://files.phpmyadmin.net/phpMyAdmin/4.5.1/phpMyAdmin-4.5.1-all-languages.zip
unzip phpMyAdmin-4.5.1-all-languages.zip
mv phpMyAdmin-4.5.1-all-languages pma

Anschließend ist phpMyAdmin mit der Standardkonfiguration unter https://uberuser.uberserver.uberspace.de/pma/ erreichbar.

Jetzt müssen wir noch die Konfiguration für unsere Umgebung anpassen:

cd pma
cp config.sample.inc.php config.inc.php
vi config.inc.php

In der Datei config.inc.php müssen folgende Einstellungen angepasst werden:

$cfg['Servers'][$i]['socket'] = '/home/uberuser/mysql/mysql.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';

Außerdem sollte ein Blowfish-Secret gesetzt werden:

$cfg['blowfish_secret'] = '[SECRET]';

Da wir zunächst noch kein Passwort für root haben, müssen wir, solange wir das nicht geändert haben, auch folgende Einstellung anpassen:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

Diese Änderung sollte rückgängig gemacht werden, sobald ein Passwort für root vergeben wurde!

Empfehlung: das gesamte phpMyAdmin Verzeichnis sollte noch mit einem .htaccess Schutz versehen werden. Die Anleitung dazu gibts im Uberspace Wiki.

logrotate einrichten

Damit die Log-Dateien von MariaDB nicht zu groß werden, sollte ein logrotate script eingerichtet werden.

Dazu muss zunächst ein eigener logrotate Aufruf eingerichtet werden, wie im Wiki von Uberspace beschrieben.

Schließlich muss in der Datei ~/etc/my-logrotate.conf noch die passende Konfiguration hinterlegt werden:

/home/uberuser/opt/mysql/data/mysqld.err {
	create 640 uberuser uberuser
	notifempty
	daily
	rotate 3
	missingok
	compress
	postrotate
		# just if mysqld is really running
		if test -x /home/uberuser/mysql/bin/mysqladmin && /home/uberuser/mysql/bin/mysqladmin ping &>/dev/null; then
			/home/uberuser/mysql/bin/mysqladmin flush-logs
		fi
	endscript
}

Letzte Hinweise

Der Verwendete Benutzer uberuser muss natürlich durch euren eigenen Uberspace Namen ersetzt werden.

Zur Zeit läuft das ganze bei mir im Testbetrieb. Sollten Probleme auftreten oder auch nicht, werde ich das hier ergänzen.

Ich freue mich auf eure Erfahrungen und euer Feedback.

Update!
4.11.2015: Sorry, der Abschnitt Datenbank erstellen hat gefehlt und wurde ergänzt.

10 Kommentare » Schreibe einen Kommentar

  1. Danke für die sehr gut nachvollziehbare Anleitung. Da ich auf Uberspace eine aktuelle Typo3-Installation ausprobieren möchte wollte ich auf diesem Wege eine MySQL auf den benötigten Stand bringen. Leider habe ich wenig Anhnung von der Materie.
    Am Ende der Prozedur kann ich mich nicht per phpMyAdmin mit der Datenbank verbinden.
    Rufe ich auf der Kommandozeile mysql -v, kommt eine Fehlermeldung:
    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‚/home/XXXX/mysql/mysql.sock‘ (2 „No such file or directory“). Tatsächlich gibt es auch keine solche Datei. Habe ich etwas übersehen?

    Danke für jeden Tip oder Hinweis!

    • Vielen Dank für das positive Feedback 🙂

      Beim Socket gibt es zwei mögliche Fehlerquellen. Zum einen muss in der ~/.my.cnf die Socket Datei richtig konfiguriert sein:

      [client-server]
      socket=/home/uberuser/mysql/mysql.sock

      Zum Anderen muss in der ~/etc/service/mysql/run der Pfad zur ~/.my.cnf angegeben werden:

      exec ./bin/mysqld_safe --defaults-file=~/.my.cnf  2>&1

      Schließlich muss der Server natürlich noch korrekt laufen. Dazu kann man auch einfach mal den Befehl zum Starten des Servers direkt in der Konsole eingeben bzw. die Datei ~/opt/mysql/data/mysqld.err prüfen.

      Ich hoffe ich konnte dir weiterhelfen.

    • Sorry, mir ist gerade aufgefallen, dass ich einen wichtigen Schritt in der Dokumentation vergessen habe. Daher wird vermutlich deine Datenbank nicht starten.

      Bitte den Schritt Datenbank erstellen ausführen. Ich hoffe dann klappt es.

      • Das war tatsächlich (neben einem weiteren kleinen Fehler) das Problem. Der tolle Support von Uberspace hat das für mich auch parallel rausgefunden. Schönen Dank auch an dieser Stelle.

        Mit der deiner Ergänzung sollte es dann auch bei anderen Newbies funktionieren 😉

  2. Gibt es einen Grund warum du das Verzeichnis ~/opt/mysql nennst und nicht ~/opt/mariadb?

    • Hmm, nein, kein spezieller Grund. Du hast schon recht, man könnte konsequenterweise alle Verzeichnisse mariadb anstatt mysql nennen.

    • Leider kann ich meinen Beitrag nicht bearbeiten, deswegen im Nachgang eine Frage: Muss man den normalen MySQL-Prozess noch irgendwie killen, damit dieser nicht in Konflikt mit MariaDB gerät? Bzw. ist es alternativ möglich beide DBS parallel zu betreiben? (Vor allem für die Umstellung interessant.)

      • Also bei Uberspace wirst du den Prozess nicht killen können, weil der unter einem Useraccount läuft, auf den du keinen Zugriff hast 😉

        Aber das ist auch kein Problem. Zum einen, weil die Datenbank nicht auf einem Port lauscht (mit skip-networking), sondern nur auf einem Socket. Zum anderen, weil wir unser eigenes Data-Verzeichnis benutzen.

        • Ich hatte leider das Problem, dass ich zwar die MariaDB-Konsole mit mysql starten konnte ($PATH stimmte also schonmal), dort dann aber weiterhin mit den Daten der MySQL-Datenbank zu tun hatte (SHOW DATABASES; etc), obwohl ich eigentlich bis auf phpMyAdmin und logrotate alle Schritte deiner Anleitung nachvollzogen habe (inklusive des Inititialiseren des data-Verzeichnis).

          Hab’s jetzt erstmal gelassen und hoffentlich alle Spuren wieder entfernt (inklusive Daemon).

          • Hmm, OK, schade dass es nicht geklappt hat.

            Wenn die ~/.my.cnf korrekt ausgetauscht wurde, sollte eigentlich der Socket der MariaDB Instanz angesprochen werden.

            Man kann sonst auch den Pfad zur my.cnf Datei auch explizit beim Aufruf von mysql angeben:

            mysql --defaults-file=~/.my.cnf