全面上市前:2022-11-17

5.10 扩展 MySQL Shell 控制台

您可以以报告和扩展对象的形式定义 MySQL Shell 控制台基本功能的扩展。可以使用 JavaScript 或 Python 创建报告和扩展对象,并且可以使用任何活动的 MySQL Shell 语言。

本节介绍:

MySQL 外壳插件

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

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

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

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

  • 视窗: 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 识别出所有插件时,它会通过执行 initJavaScript 或 Python 中的文件开始加载它们。

使用插件扩展 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 Cluster 成员建立全局会话时生成 InnoDB Cluster 状态报告:

// 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"})