Sandkastenspiele 2.0*: MySQL Testumgebungen mit der MySQL Shell bereitstellen.
Bereits in der ORDIX News 3/2012 haben wir Ihnen gezeigt, wie man MySQL-Sandbox-Systeme aufbauen kann. Zu der damaligen Zeit gab es natürlich noch keine MySQL Shell. In vielen Fällen ist dieses nützliche Tool den DBAs noch unbekannt. Dabei ist es z.B. geeignet, um schnell Testumgebungen unterschiedlicher Couleur bereitzustellen.
Von Schaufeln und Förmchen: Was ist eine Sandbox und was macht die MySQL Shell?
Bevor wir Testumgebungen aufbauen, lassen Sie uns kurz über die Grundlagen sprechen. Eine Sandbox-Umgebung meint in diesem Fall eine isoliert laufende MySQL-Instanz mit unabhängigen Binaries, Datenbank- und Konfigurationsdateien. Eine solche Instanz kann vollkommen autark von anderen betrieben und beispielsweise gestartet und gestoppt werden.
Die MySQL Shell ist ein umfangreiches Client-Werkzeug, welches für unterschiedliche Zwecke genutzt werden kann. Es dient der Administration von Instanzen. So lassen sich beispielsweise Cluster- und Replikationslösungen hierüber aufbauen, steuern und monitoren. Es kann aber auch zur reinen Abfrage von Daten (SQL) genutzt werden. Zusätzlich kann es als Skripting-Schnittstelle (JS, Phython) verwendet werden, um beispielsweise eigene Reports zu implementieren. Darüber hinaus stehen diverse Helferlein und APIs bereit (z.B. der Upgrade Checker oder der JSON Importer), die einem DBA das Leben einfacher machen.
--> https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-features.html
Mein Sandkasten, dein Sandkasten...
Neben den oben genannten Möglichkeiten kann die Shell aber auch genutzt werden, um Testumgebungen bereitzustellen. Dies kann interaktiv in der Shell oder über Skript (JS) erfolgen:
MySQL JS > dba.deploySandboxInstance(3399) A new MySQL sandbox instance will be created on this host in /opt/mysql/sand/3399 Warning: Sandbox instances are only suitable for deploying and running on your local machine for testing purposes and are not accessible from external networks. Please enter a MySQL root password for the new instance: **** Deploying new MySQL instance... Instance localhost:3399 successfully deployed and started. Use shell.connect('root@localhost:3399') to connect to the instance.
Im oben gezeigten Beispiel wird eine neue Instanz mit dem Port 3399 ins Leben gerufen. Sämtliche Daten der Instanz liegen dabei unterhalb des folgenden (Sandbox-)Verzeichnisses "/opt/mysql/sand/3399".
[root@localhost 3399]# pwd /opt/mysql/sand/3399 [root@localhost 3399]# ls -la insgesamt 20 drwxr-xr-x 6 root root 127 17. Mär 10:00 . drwxr-xr-x. 8 root root 78 17. Mär 10:23 .. -rw-r----- 1 root root 6 17. Mär 10:00 3399.pid drwxr-xr-x 2 root root 20 17. Mär 09:59 bin drwxr-xr-x 3 root root 21 17. Mär 09:59 lib -rw------- 1 root root 815 17. Mär 09:59 my.cnf drwxr-xr-x 2 root root 6 17. Mär 09:59 mysql-files drwxr-x--- 6 root root 4096 17. Mär 10:00 sandboxdata -rwx------ 1 root root 262 17. Mär 10:00 start.sh -rwx------ 1 root root 194 17. Mär 10:00 stop.sh
Hier befinden sich alle Komponenten der Datenbank. Die Datenbank-Dateien ("/sandboxdata"), die Binaries ("/bin"), die Konfigurationsdatei ("my.cnf") und die Start- und Stopp-Skripte ("start.sh", "stop.sh").
Komplexere Lösungen (z.B. der Aufbau von zwei Instanzen) können über Skripte (z.B. in JS) gelöst werden:
bash> mysqlsh -f sandbox.js Setup of two sandbox instances. Port 3350 Port 3360 Enter a password for root account: **** Setup instance on port: 3350 A new MySQL sandbox instance will be created on this host in /opt/mysql/sand/3350 Warning: Sandbox instances are only suitable for deploying and running on your local machine for testing purposes and are not accessible from external networks. ... Instance localhost:3360 successfully deployed and started. Use shell.connect('root@localhost:3360') to connect to the instance. ... bash> cat sandbox.js print('Setup of two sandbox instances.\n'); print('Port 3350\n'); print('Port 3360\n'); var Pass = shell.prompt('Enter a password for root account: ', {type:"password"}); try { print('Setup instance on port: 3350\n'); dba.deploySandboxInstance(3350, {password: Pass}); print('Setup instance on port: 3360\n'); dba.deploySandboxInstance(3360, {password: Pass}); } catch { print('Error: ' + e.message + '\n'); }
Selbstverständlich können auch komplexere Strukturen wie z.B. Cluster- und Replikationslösungen auf diesem Wege erstellt werden Die notwendigen Kommandos (z.B. "dba.createCluster()") lassen sich nahtlos in solche Skripte integrieren.
Hier ein weiteres Beispiel zum Zerstören (Abbau) einer Sandbox:
bash> cat deletebox.js print('Which box should be destroyed?\n'); var PortNo = shell.prompt('Enter the port of sandbox: '); try { print('Stop instance on port: ' + PortNo + '\n'); dba.stopSandboxInstance(PortNo); print('Destroy instance on port: ' + PortNo + '\n'); dba.deleteSandboxInstance(PortNo); } catch(e) { print('Error: ' + e.message + '\n'); }
Natürlich kann man dies wahlweise auch manuell und dialogorientiert erledigen.
Wohin mit all dem Sand?
Die MySQL Shell lässt sich umfangreich konfigurieren. Den aktuellen Konfigurationsstatus kann man über das folgende Kommando ermitteln.
MySQL JS > \option -l autocomplete.nameCache true batchContinueOnError false ... sandboxDir /opt/mysql/sand showColumnTypeInfo false showWarnings true useWizards true verbose 0
Die Variable"sandboxDir" ist maßgeblich für diesen Blog. Sie definiert den physikalischen Speicherort unserer Sandbox-Instanzen. Natürlich kann dieser Wert verändert werden. Das Flag "--persist" sorgt dafür, dass die Einstellung persistent (also über eine MySQL-Shell-Session) hinaus geändert wird:
MySQL JS > \option --persist sandboxDir /tmp ... sandboxDir /tmp ...
Fazit: Alles nur Spielerei?
Die MySQL Shell ist zum Aufbau von Testsystemen sehr nützlich. Der Aufbau von Sandboxen erfolgt schnell und gut strukturiert. Als DBA muss man lediglich die bereits vergebenen Ports im Auge behalten. In jedem Fall (auch über Sandboxen hinaus) lohnt es sich mit diesem Tool vertraut zu machen.
Sie haben Fragen rund um den Betrieb von MySQL Datenbanken? Sprechen Sie uns an oder besuchen Sie einen unserer Kurse aus unserem Seminarshop:
Zu unseren Seminaren
Principal Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare