Plug & Play: MySQL Shell Plugins mit Python

Bausteine

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.  

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/