4 Minuten Lesezeit (821 Worte)

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.

Principal Consultant bei ORDIX.

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Gäste
Freitag, 07. Oktober 2022

Sicherheitscode (Captcha)

×
Informiert bleiben!

Bei Updates im Blog, informieren wir per E-Mail.