预发布版:2024-07-17
您可以以报表和扩展对象的形式定义 MySQL Shell 控制台基本功能的扩展。报表和扩展对象可以使用 JavaScript 或 Python 创建,并且无论活动 MySQL Shell 语言是什么都可以使用。
本节介绍
您可以使用在启动时加载的用户定义插件来扩展 MySQL Shell。插件可以使用 JavaScript 或 Python 编写,并且它们包含的函数在 JavaScript 和 Python 模式的 MySQL Shell 中均可用。
MySQL Shell 插件可用于包含注册为 MySQL Shell 报表 的函数。单个插件可以包含并注册多个函数,并且可以包含报表和扩展对象成员的混合。在 MySQL 完成启动后,由 MySQL Shell 插件注册为报表或扩展对象成员的函数立即可用。
MySQL Shell 插件是一个包含适用于该语言的初始化脚本的文件夹(init.js
或 init.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
文件来开始加载它们。
shell
全局对象包含以下函数,可用于通过注册用户定义的报表或扩展对象来扩展 MySQL Shell 功能
用户定义的报表或扩展对象 | 说明 |
---|---|
shell.registerReport(name, type, report[, description]) |
注册用户定义的报表。 |
shell.createExtensionObject() |
创建扩展对象(稍后可以注册为全局对象)。 |
shell.addExtensionObjectMember(object, name, member[,definition]) |
将新成员添加到扩展对象中。 |
shell.registerGlobal(name, object[, definition]) |
将扩展对象注册为 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"})