文档主页
面向 VS Code 的 MySQL Shell


面向 VS Code 的 MySQL Shell  /  MySQL Shell 控制台  /  扩展 MySQL Shell 控制台

预发布版:2024-07-17

5.10 扩展 MySQL Shell 控制台

您可以以报表和扩展对象的形式定义 MySQL Shell 控制台基本功能的扩展。报表和扩展对象可以使用 JavaScript 或 Python 创建,并且无论活动 MySQL Shell 语言是什么都可以使用。

本节介绍

MySQL Shell 插件

您可以使用在启动时加载的用户定义插件来扩展 MySQL Shell。插件可以使用 JavaScript 或 Python 编写,并且它们包含的函数在 JavaScript 和 Python 模式的 MySQL Shell 中均可用。

MySQL Shell 插件可用于包含注册为 MySQL Shell 报表 的函数。单个插件可以包含并注册多个函数,并且可以包含报表和扩展对象成员的混合。在 MySQL 完成启动后,由 MySQL Shell 插件注册为报表或扩展对象成员的函数立即可用。

MySQL Shell 插件是一个包含适用于该语言的初始化脚本的文件夹(init.jsinit.py 文件)。初始化脚本是插件的入口点。插件只能包含一种语言的代码,因此,如果您要创建一个包含 Python 和 JavaScript 中定义的成员的扩展对象,则必须将这些成员存储为单独的、使用相应语言的插件。

插件在 MySQL Shell 启动时自动加载,为此,插件文件夹必须位于配置路径的 plugins 文件夹中

  • Windows:C:\Users\<user>\.vscode\extensions\oracle.mysql-shell-for-vs-code-1.2.1-win32-x64\shell\lib\mysqlsh\plugins

  • Unix:/home/<user>/.vscode/extensions/oracle.mysql-shell-for-vs-code-1.1.8/shell/lib/mysqlsh/plugins

当嵌入式 MySQL Shell 启动时,它会读取 Plugins 文件夹的内容,并识别所有包含 init 文件的子文件夹。此类 init 文件。当 MySQL Shell 识别出所有插件后,它将通过在 JavaScript 或 Python 中执行 init 文件来开始加载它们。

使用插件扩展 MySQL Shell

shell 全局对象包含以下函数,可用于通过注册用户定义的报表或扩展对象来扩展 MySQL Shell 功能

用户定义的报表或扩展对象 说明
shell.registerReport(name, type, report[, description]) 注册用户定义的报表。
shell.createExtensionObject() 创建扩展对象(稍后可以注册为全局对象)。
shell.addExtensionObjectMember(object, name, member[,definition]) 将新成员添加到扩展对象中。
shell.registerGlobal(name, object[, definition]) 将扩展对象注册为 shell 全局对象。

使用 MySQL Shell 插件创建报表

在以下示例中,我们将创建一个简单的报表来监控 InnoDB 集群的状态。

../plugins/monitor/init.js 文件包含一个后端 JavaScript 函数,该函数返回与给定会话关联的集群对象

function get_cluster(session, context) {
  if (session) {
    try {
      return dba.getCluster();
    } catch (err) {
      throw "A session to a cluster instance is required: " + err.message
    } 
  } else {
    throw "A session must be established to execute this " + context
  }
}

报表的 JavaScript 后端函数在全局会话建立到 InnoDB 集群成员时生成 InnoDB 集群状态报表

// The report backend function in native JavaScript which will be
// used to generate the cluster status report.
function cluster_status(session, argv, options) {
  // Gets the cluster using the backend function above
  var cluster = get_cluster(session, "report")

  // Prints the Cluster status
  println(cluster.status())

  // A report must return a list always
  return {report:[]}
}

将上述函数注册为报表

shell.registerReport("idc_status", "print", cluster_status,
  {brief: "Monitors the status of the cluster where the global session is connected"})