Plug & Play: MySQL Shell Plugins mit Python
Die MySQL Shell ist ein nützliches Werkzeug. Sie stellt einen adäquaten Ersatz für den bekannten "mysql"-Client dar, bietet darüber hinaus aber unzählige weitere Funktionen und Features. So kann der Funktionsumfang der MySQL Shell beispielsweise relativ einfach über sogenannte Plugins erweitert werden. Als Programmiersprache kommen hierbei JavaScript oder Python in Frage.
Mit Struktur und Ordnung ...
Der Code, der als Plugin zur Verfügung gestellt wird, befindet sich normalerweise im Home-Verzeichnis eines OS-Users unter dem folgenden Pfad:
bash> cd ~ bash> cd .mysqlsh/plugins/ext/<PLUGIN_NAME>
Natürlich kann auch ein abweichender, zentraler (für mehrere OS-User gültiger) Bereich definiert werden. Der Ort muss dem Anwender über eine Shell-Umgebungsvariable bekannt gemacht werden.
bash> export MYSQLSH_USER_CONFIG_HOME=/mysql/shell_plugins/
... zum gewünschten Ergebnis
Im Folgenden wollen wir die Entwicklung eines Plugins beispielhaft zeigen. Es soll ein Report entwickelt werden, der uns die genutzten Engine (z.B. InnoDB, CSV, MyISAM, ....) je Schema (aka Database) anzeigen soll. Das entsprechende SQL für die Information sieht wie folgt aus:
mysql> SELECT table_schema AS 'Schema', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'MB', Engine as 'Engine' FROM information_schema.tables GROUP BY table_schema, engine ORDER BY 2 DESC; +--------------------+-------+--------------------+ | Schema | MB | Engine | +--------------------+-------+--------------------+ | sakila | 17.97 | InnoDB | | mysql | 2.48 | InnoDB | | sys | 0.02 | InnoDB | | information_schema | 0.00 | NULL | | performance_schema | 0.00 | PERFORMANCE_SCHEMA | | mysql | 0.00 | CSV | | sakila | 0.00 | MyISAM | | sys | NULL | NULL | | sakila | NULL | NULL | +--------------------+-------+--------------------+ 9 rows in set (0.0061 sec)
Diesen SQL-Code bauen wir nun in ein Python-Skript unterhalb des Plugin-Directory ein. Der Name des Plugins wird über einen Unterordner repräsentiert. Der Code befindet sich je nach Skript-Sprache in der Datei: init.[py|js].
bash> cd /mysql/shell_plugins/ext/dbengine bash> cat init.py def show_dbengine(session, args, options): # store SQL stmt in var query = "SELECT table_schema AS 'Schema', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'MB', Engine as 'Engine' \ FROM information_schema.tables \ GROUP BY table_schema, engine \ ORDER BY 2 DESC" # check for options if (options.has_key('limit')): query += ' LIMIT ' + str(options['limit']) result = session.run_sql(query); # build report array report = [] if (result.has_data()): report = [result.get_column_names()] for rowno in result.fetch_all(): report.append(list(rowno)) # printout report return {"report": report} # register / plugin code to shell shell.register_report("dbengine", "list", show_dbengine, { "brief":"Report used engines within schemata", 'details': ['Should be executed with admin privs'], 'options': [ { 'name': 'limit', 'brief': 'List only top <X> entries of report', 'shortcut': 'l', 'type': 'integer' } ], 'argc': '0' } )
Der Code ist transparent lesbar. Die Query wird als Variable gespeichert. Der Anwender kann wahlweise eine Option "-l" übergeben, um die Ausgabe auf eine zu definierende Anzahl an Zeilen einzuschränken. Die Ergebniszeilen werden in einem Array (report) gespeichert und ausgegeben. Am Ende wird das Plugin bei der MySQL Shell registriert. Die Plugins werden mit dem Start (Aufruf) des Kommandos "mysqlsh" geladen. Änderungen an den Plugins während die Shell aktiv ist, werden erst nach dem Neustart der MySQL Shell berücksichtigt.
MySQL localhost:3307 ssl SQL > \js Switching to JavaScript mode... MySQL localhost:3307 ssl JS > \show Available reports: dbengine, dbsize, query, sessions, thread, threads. MySQL localhost:3307 ssl JS > \show dbengine -l 5 +--------------------+-------+--------------------+ | Schema | MB | Engine | +--------------------+-------+--------------------+ | sakila | 17.97 | InnoDB | | mysql | 2.48 | InnoDB | | sys | 0.02 | InnoDB | | information_schema | 0.00 | NULL | | performance_schema | 0.00 | PERFORMANCE_SCHEMA | +--------------------+-------+--------------------+
Fazit
Die MySQL Shell ist ein vielseitiges Werkzeug und durch den Einsatz bzw. die Entwicklung von Plugins ergeben sich viele Möglichkeiten, die weit über das Erstellen einfacher Reports hinausgehen. Einen guten Überblick darüber, was alles mit Plugins möglich ist, geben die Plugins von Frederic Descampes (www.lefred.be), welche auf github.com (https://github.com/lefred/mysqlshell-plugins/tree/master/collations) zu finden sind.
Sie haben Fragen rund um MySQL und / oder die MySQL Shell? Dann sprechen Sie uns an oder besuchen Sie einen unserer Kurse aus unserem Seminarshop:
Zu unseren MySQL Seminaren
Principal Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare