Spec-Zone.ru › MySQL Shell 8.4

10.3.3 Примеры плагинов MySQL Shell

Пример 10.3 Плагин MySQL Shell, содержащий отчёт и объект расширения

В данном примере определена функция show_processes() для отображения текущих запущенных процессов и функция kill_process() для завершения процесса с указанным ID. show_processes() будет отчётом MySQL Shell, а kill_process() – функцией, предоставляемой объектом расширения.

Код регистрирует show_processes() как отчёт MySQL Shell proc, используя метод shell.register_report(). Для регистрации kill_process() как ext.process.kill() код проверяет, существуют ли глобальный объект ext и объект расширения process, и создаёт и регистрирует их, если нет. Функция kill_process() затем добавляется как член объекта расширения process.

Код плагина сохранён в файле ~/.mysqlsh/plugins/ext/process/init.py. При запуске MySQL Shell ищет этот файл в папке с плагинами, выполняет код. Отчёт proc и функция kill() регистрируются и становятся доступными для использования. Глобальный объект ext и объект расширения process создаются и регистрируются, если они ещё не были зарегистрированы другим плагином; в противном случае используются существующие объекты.

# Define a show_processes function that generates a MySQL Shell report

def show_processes(session, args, options):
  query = "SELECT ID, USER, HOST, COMMAND, INFO FROM INFORMATION_SCHEMA.PROCESSLIST"
  if (options.has_key('command')):
    query += " WHERE COMMAND = '%s'" % options['command']

  result = session.sql(query).execute();
  report = []
  if (result.has_data()):
    report = [result.get_column_names()]
    for row in result.fetch_all():
        report.append(list(row))

  return {"report": report}


# Define a kill_process function that will be exposed by the global object 'ext'

def kill_process(session, id):
  result = session.sql("KILL CONNECTION %d" % id).execute()


# Register the show_processes function as a MySQL Shell report


shell.register_report("proc", "list", show_processes, {"brief":"Lists the processes on the target server.",
                                                       "options": [{
                                                          "name": "command",
                                                          "shortcut": "c",
                                                          "brief": "Use this option to list processes over specific commands."
                                                       }]})


# Register the kill_process function as ext.process.kill()

# Check if global object 'ext' has already been registered
if 'ext' in globals():
    global_obj = ext
else:
    # Otherwise register new global object named 'ext'
    global_obj = shell.create_extension_object()
    shell.register_global("ext", global_obj,
        {"brief":"MySQL Shell extension plugins."})

# Add the 'process' extension object as a member of the 'ext' global object
try:
    plugin_obj = global_obj.process
except IndexError:
    # If the 'process' extension object has not been registered yet, do it now
    plugin_obj = shell.create_extension_object()
    shell.add_extension_object_member(global_obj, "process", plugin_obj,
        {"brief": "Utility object for process operations."})

# Add the kill_process function to the 'process' extension object as member 'kill'
try:
    shell.add_extension_object_member(plugin_obj, "kill", kill_process, {"brief": "Kills the process with the given ID.",
                                                              "parameters": [
                                                                {
                                                                  "name":"session",
                                                                  "type":"object",
                                                                  "class":"Session",
                                                                  "brief": "The session to be used on the operation."
                                                                },
                                                                {
                                                                  "name":"id",
                                                                  "type":"integer",
                                                                  "brief": "The ID of the process to be killed."
                                                                }
                                                                ]
                                                              })
except Exception as e:
    shell.log("ERROR", "Failed to register ext.process.kill ({0}).".
       format(str(e).rstrip()))

Здесь пользователь запускает отчёт proc с помощью команды MySQL Shell \show, а затем использует функцию ext.process.kill() для остановки одного из указанных процессов:

mysql-py> \show proc
+----+-----------------+-----------------+---------+----------------------------------------------------------------------------------+
| ID | USER            | HOST            | COMMAND | INFO                                                                             |
+----+-----------------+-----------------+---------+----------------------------------------------------------------------------------+
| 66 | root            | localhost:53998 | Query   | PLUGIN: SELECT ID, USER, HOST, COMMAND, INFO FROM INFORMATION_SCHEMA.PROCESSLIST |
| 67 | root            | localhost:34022 | Sleep   | NULL                                                                             |
| 4  | event_scheduler | localhost       | Daemon  | NULL                                                                             |
+----+-----------------+-----------------+---------+----------------------------------------------------------------------------------+

mysql-py> ext.process.kill(session, 67)
mysql-py> \show proc
+----+-----------------+-----------------+---------+----------------------------------------------------------------------------------+
| ID | USER            | HOST            | COMMAND | INFO                                                                             |
+----+-----------------+-----------------+---------+----------------------------------------------------------------------------------+
| 66 | root            | localhost:53998 | Query   | PLUGIN: SELECT ID, USER, HOST, COMMAND, INFO FROM INFORMATION_SCHEMA.PROCESSLIST |
| 4  | event_scheduler | localhost       | Daemon  | NULL                                                                             |
+----+-----------------+-----------------+---------+----------------------------------------------------------------------------------+

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-shell-8.4-en/mysql-shell-plugins-examples.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API