MySQL-Shell插件使用主要包括Reporting with MySQL Shell和MySQL Shell Extension Objects的形式。MySQL Shell Extension Objects相对更加灵活,以下主要以此种模式为例说明。
配置说明
mysqlsh插件路径
Unix: ~/.mysqlsh/plugins 或~/.mysqlsh/init.d
Windows: %AppData%\MySQL\mysqlsh\plugins
通过设置MYSQLSH_USER_CONFIG_HOME自定义,默认MYSQLSH_USER_CONFIG_HOME=~/.mysqlsh
指定 --log-level 参数时可记录详细调试信息到 ~/.mysqlsh/mysqlsh.log
mysqlsh插件加载后的全局变量
The built in global objects
shell
,dba
, andutil
.The Shell API main module
mysql
.The X DevAPI main module
mysqlx
.The AdminAPI main module
dba
.
要求
相关的文件夹(plugin or plugin group)符合python的PEP8规范,仅使用字母、数字、下划线;
里层每个视作package的文件夹都应包含
__init__.py
文件,init.py 用于标识当前文件夹是一个包;import的时候,必须指定package的全路径,如plugin group(ext)包含了plugin(demo),demo的包src中包含的模块sample,需要以如下格式导入:
from ext.demo.src import sample
创建plugin group
plugin group可以包含JavaScript和python类型的plugin,可用于存放plugins的公共内容
Plugins that provide reports on a particular theme.
Plugins that reuse the same common code.
Plugins that add functions to the same extension object.
plugin文件夹中必须包含 init.py 或 init.js 文件用来初始化扩展,若不包含mysqlsh将其视作plugin group并在里面搜索plugin的初始化脚本。子文件夹里(.)开头的文件夹会被忽略。
例如:
ext/ # plugin group
├── common # 建议存放公共函数,以ext.common.xxx形式导入
│ ├── __init__.py
│ └── showMaster.py
├── process
│ └── init.py # plugin
└── table
└── init.py # plugin
MySQL Shell Extension Objects
8.0.17以后的mysqlsh提供了这个能力,可以更加灵活地在mysqlsh中使用自己写的pyrhon脚本
主要函数
shell.create_extension_object():创建扩展对象
shell.register_globals(name, object[, definition])
name: 全局对象名(内建的全局对象 (
db
,dba
,cluster
,session
,shell
,util
) )object:注册的全局对象
definition:可选,brief、details等描述性信息
shell.addExtensionObjectMember(object, name, member[, definition])
object:父类扩展对象
name:扩展对象的成员名
member:扩展成员,可以是基本数据类型、函数或者extension object
definition:可选,除brief、details外,还有parameters(dict类型的list,可以起到某些约束作用,具体的key信息可查询官方文档)
1、直接调用
# ext的help信息,可以看到自定义的process属性以及help信息
MySQL 10.142.90.80:8018 ssl Py > ext.help()
NAME
ext - MySQL Shell extension plugins.
DESCRIPTION
MySQL Shell extension plugins.
PROPERTIES
process
Utility object for process operations.
FUNCTIONS
help([member])
Provides help about this object and it's members
# process的help信息,可以看到help函数以及自定义的kill函数信息
MySQL 10.142.90.80:8018 ssl Py > ext.process.help()
NAME
process - Utility object for process operations.
SYNTAX
ext.process
DESCRIPTION
Utility object for process operations.
FUNCTIONS
help([member])
Provides help about this object and it's members
kill(session, id)
Kills the process with the given ID.
# 使用,kill掉对应的connection id
MySQL 10.142.90.80:8018 ssl Py > ext.process.kill(session, 2241114)
一般python类的动态加载
zgj.py,将要加载的文件放在python的sys.path路径下,可通过print(sys.path)查看
def show_users(session):
query = "SELECT user from mysql.user"
result = session.run_sql(query)
report = []
if (result.has_data()):
report = [result.get_column_names()]
for row in result.fetch_all():
report.append(list(row))
return {"report": report}
使用
MySQL 10.142.90.80:8018 ssl Py > import zgj
MySQL 10.142.90.80:8018 ssl Py > zgj.show_users(session)