正式發行前: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 Cluster 的狀態。
../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
}
}
當全域工作階段建立到 InnoDB Cluster 成員時,以 JavaScript 撰寫的報表後端函數會產生 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"})