News
Tool-Tipp: MySQL Sandbox - Der Spielplatz für den DBA

Die Information ist ein schnelllebiges Gut. Jeden Tag werden wir mit hunderten Informationen zugemüllt. Deshalb sind wir bestrebt uns auf das Wesentliche zu konzentrieren und nur substantiell nachhaltige Informationen bereitzustellen.

Icon Unternehmen

Daily Business im Leben eines DBAs: die Anwendung mit MySQL-Version X spuckt Fehler, die MySQL-Datenbank Version Y muss geupgradet werden, ein Ticket landet im Postfach mit der Bitte um Fehleranalyse und -behebung von MySQL Z.

Die Liste der Anwendungsmöglichkeiten für Test- und Entwicklungsserver ist schier endlos. Um allen Anforderungen gerecht zu werden, müsste für jede MySQL-Version und Infrastruktur (Single-Instance, Replikation, Multi-Master-Replikation, Ring-Replikation, etc.) ein bzw. mehrere Server installiert, konfiguriert und verwaltet werden. Selbst in Zeiten der Virtualisierung können diese Ressourcen knapp werden.

Auch die Zeit, die für solche Aufgaben aufgewandt werden muss, ist meist begrenzt, da Produktivsysteme in der Prioritätenliste erfahrungsgemäß höher angesiedelt sind.
Was also tun, wenn man Zeit und Ressourcen sparen will, das Ergebnis aber eine im vollen Funktionsumfang ausgeprägte Testumgebung/-infrastruktur sein soll?

MySQL::Sandbox ist ein in Perl geschriebenes Tool zur vereinfachten Installation, Konfiguration und Verwaltung von multiplen MySQL-Versionen und -Instanzen.

Die Installation gestaltet sich sowohl einfach als auch sekundenschnell:

[root@mysql-sandbox ~]# cpan -i MySQL::Sandbox

Bevor die erste Sandbox installiert und gestartet werden kann, muss ein lokales Repository mit den gewünschten MySQL-Versionen angelegt werden. Hierzu werden im $HOME-Verzeichnis des entsprechenden Nutzers die Unterordner "opt/mysql" angelegt (MySQL::Sandbox möchte keine Server unter `root` laufen lassen, wodurch sich die Einrichtung eines separaten Nutzers anbietet).
Dieses Verzeichnis wird in Zukunft die MySQL-Installationsdateien enthalten. Empfehlenswert ist es hierbei, den entpackten MySQL-Ordner in die Version umzubenennen, die er beinhaltet. Dies verkürzt später das Kommando zur Installation der Sandbox.

[mysql@mysql-sandbox ~]# mkdir -p ~/opt/mysql
[mysql@mysql-sandbox ~]# cd ~/opt/mysql

Jetzt nur noch die entprechende MySQL-Version downloaden, entpacken und umbenennen:

[mysql@mysql-sandbox ~]# wget dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
[mysql@mysql-sandbox ~]# tar -xvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
[mysql@mysql-sandbox ~]# mv mysql-5.6.21-linux-glibc2.5-x86_64 5.6.21
[mysql@mysql-sandbox ~]# rm -f mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz

Und schon kann mit der Installation der ersten Sandbox begonnen werden. Neben einfacher Single-Instances sind mit MySQL::Sandbox auch einfache Replikationen, Ringreplikation und Sandboxen gleicher Versionen möglich.

Wir beschränken uns hierbei auf eine Single-Instance Installation:

[mysql@mysql-sandbox ~]# make_sandbox 5.6.21

Es folgt eine kleine Zusammenfassung, bevor mit der Sandbox-Installation begonnen wird:

Executing low_level_make_sandbox --basedir=/mysql/opt/mysql/5.6.21 \
--sandbox_directory=msb_5_6_21 \
--install_version=5.6 \
--sandbox_port=5621 \
--no_ver_after_name \
--my_clause=log-error=msandbox.err
The MySQL Sandbox,  version 3.0.47
(C) 2006-2013 Giuseppe Maxia
installing with the following parameters:
upper_directory                = /mysql/sandboxes
sandbox_directory              = msb_5_6_21
sandbox_port                   = 5621
check_port                     =
no_check_port                  =
datadir_from                   = script
install_version                = 5.6
basedir                        = /mysql/opt/mysql/5.6.21
tmpdir                         =
my_file                        =
operating_system_user          = mysql
db_user                        = msandbox
remote_access                  = 127.%
bind_address                   = 127.0.0.1
ro_user                        = msandbox_ro
rw_user                        = msandbox_rw
repl_user                      = rsandbox
db_password                    = msandbox
repl_password                  = rsandbox
my_clause                      = log-error=msandbox.err
master                         =
slaveof                        =
high_performance               =
prompt_prefix                  = mysql
prompt_body                    =  [\h] {\u} (\d) >
force                          =
no_ver_after_name              = 1
verbose                        =
load_grants                    = 1
no_load_grants                 =
no_run                         =
no_show                        =
do you agree? ([Y],n) Y
loading grants
... sandbox server started
Your sandbox server was installed in $HOME/sandboxes/msb_5_6_21

Jede Sandbox wird in einem Ordner unterhalb von `$HOME/sandboxes` angelegt - in unserem Beispiel `$HOME/sandboxes/msb_5_6_21`. Dieses Verzeichnis wird auch als `$SANDBOX_HOME` bezeichnet. Schauen wir uns das erstellte $SANDBOX_HOME genauer an:

[mysql@mysql-sandbox ~]# ls ~/sandboxes/msb_5_6_21/
change_paths  clear data grants.mysql  load_grants  my proxy_start  rescue_mysql_dump.sql  send_kill  status  tmp  USING
change_ports  connection.json  default_connection.json  json_in_db msb my.sandbox.cnf  README restart start stop use

Alle Tools, die zum Management des Servers benötigt werden, sind hier enthalten.
Die Skripte "start", "restart" und "stop" sind selbsterklärend. Die Skripte "start" und "restart" akzeptieren bei der Ausführung zusätzliche Parameter, sofern benötigt:

[mysql@mysql-sandbox ~]# ./start --skip-innodb
[mysql@mysql-sandbox ~]# ./restart --event-scheduler=disabled

Das Skript "use" öffnet den MySQL-Client und "clear" stoppt den Server, bereinigt das Data Dictionary und lässt den Server "from scratch" zurück.

Fazit:
Ein Development-Server mit MySQL::Sandbox ist die ideale Spielwiese für den DBA und Anwendungsentwickler. Im Fehlerfall kann mit wenigen Handgriffen das Produktivsystem risikofrei nachgebaut und ein Bugreport oder Incident-Ticket analysiert werden.

Auch eine Testmigration/ein Testupgrade auf eine neue MySQL-Version kann hiermit einfach und ohne Auswirkungen auf produktive Prozesse und Daten vollzogen werden.
Vor allem im Bereich der Replikation ist MySQL::Sandbox ein praktischer Helfer, der Resourcen, aber vor allem Zeit und Nerven sparen kann.