MySQL Shell 插件怎么写?

随着MySQL的发展,mysqlshell已经变成了一件数据库维护和备份的利器。自从大学毕业,踏入数据库行业的那一刻起,我就一直在使用mysqlshell。这不仅仅是因为它的多功能性,更因为它就像是一个老朋友,伴我成长,见证我的每一步进步。现在,让我们一起来探索这个神奇的工具背后的魅力。

  • ✔️ MySQL Shell 可以做什么?

  • ✔️ 插件位置在哪里?

  • ✔️ 我该怎么写?

  • ✔️ 需要注意什么呢?

  • 📆 结束语


✔️ MySQL Shell 可以做什么?

  1. 多语言支持:MySQL Shell不仅仅支持SQL,还能让你像变魔术一样,用JavaScript和Python来操作数据库。这就像是拥有了通晓多国语言的超级助手,让数据库操作变得更加灵活多变。

  2. 集群管理:MySQL Shell是InnoDB Cluster的超级英雄。它能轻松管理和监控你的集群,确保数据高可用。就像是给你的数据库穿上了一件防弹衣,让它更加坚不可摧。

  3. 数据库备份与恢复:利用MySQL Shell的实用工具,你可以轻松备份数据,就像是给数据拍了个备份的自拍,随时准备恢复到它最美的模样。

  4. 格式化输出与报告:MySQL Shell提供了丰富的格式化输出选项和自定义报告功能,让数据展示变得既美观又实用,就像是给数据穿上了一件定制西服,既专业又风度翩翩。

  5. 升级检查:使用MySQL Shell的升级检查功能,就像是给数据库做了个体检,确保在升级到新版本前,一切都健健康康。

但是如果内部基础设施平台不太好的话,我们可能需要定制化地写一些插件来方便我们日常的维护工作。

✔️ 插件位置在哪里?

你可以在自己的home目录下找到.mysqlsh/文件夹,手动创建plugins目录,紧接着将你的插件模块放在该目录下,然后重启mysqlsh,就可以看到自动加载的插件。

✔️ 我该怎么写?

假如我们想写一个查看当前数据库长事务的方法。

我们首先创建一个check模块,增加init.py

check/
├── init.py

init.py如下:

from mysqlsh.plugin_manager import plugin, plugin_function  
  
@plugin  
class check:  
    """  
    Check management and utilities.  
    A collection of tools and utilities to perform checks on your    MySQL Database Server.    """

然后touch trx.py

check/
├── init.py
└── trx.py
from mysqlsh.plugin_manager import plugin, plugin_function  
  
from check.queries import _get_full_details  
from mysqlsh_plugins_common import is_consumer_enabled, run_and_show  
from mysqlsh_plugins_common import are_instruments_enabled

@plugin_function("check.getLongRunningTransactions")  
def get_long_running_transactions(seconds_wait=1, limit=10, session=None):  
    """  
    注释
    """
    # Get hold of the global shell object    import mysqlsh  
    shell = mysqlsh.globals.shell  
  
    if session is None:  
        session = shell.get_session()  
        if session is None:  
            print("No session specified. Either pass a session object to this "  
                  "function or connect the shell to a database")  
            return  
    if not are_instruments_enabled("transaction%", session, shell):  
        print("Aborting, instruments are not enabled")  
        return  
    if not is_consumer_enabled("events_statements_current", session, shell):  
        print("Aborting, the consumer is not enabled")  
        return  
    if not is_consumer_enabled("events_transaction_current", session, shell):  
        print("Aborting, the consumer is not enabled")  
        return  
  
    stmt = """
                select  
                format_pico_time(trx.timer_wait) as trx_runtime,
                trx.thread_id as thread_id,
                trx.event_id as trx_event_id,
                trx.isolation_level,
                trx.autocommit,
                stm.current_schema as db,
                stm.sql_text as query,
                stm.rows_examined as rows_examined,
                stm.rows_affected as rows_affected,
                stm.rows_sent as rows_sent,
                if(stm.end_event_id is null,
                'running',
                'done') as exec_state,
                format_pico_time(stm.timer_wait) as exec_time
            from
                performance_schema.events_transactions_current trx
            join performance_schema.events_statements_current stm
                    using (thread_id)
            where
                trx.state = 'ACTIVE'
                and trx.timer_wait > power(10, 12) * %d
            order by
                trx.timer_wait desc
            limit %d
    """
 % (seconds_wait, limit)  
  
    run_and_show(stmt, 'vertical')  
  
    if limit == 1:  
        result = session.run_sql(stmt)  
        row = result.fetch_one()  
        if row:  
            original_query = row[6]  
            _get_full_details(shell, session, original_query, row[0])


可以看到该方法依赖其他模块,is_consumer_enabledare_instruments_enabled 确保所需要的performance_schema性能采集和消费选项打开。

刚开始会检查是否已经提供了会话,如果没有的话,会打印报错信息。 所以在使用前需要连接到DB

/connect dba_user@172.16.131.131:3306

run_and_show 是一个写好的,可以将查询结果美化显示的方法。

如果您觉得麻烦的话,我们这边有维护一个插件仓库,其中已经提供了很多现成的插件mysqlshell-plugins。

写好之后,我们便可以在mysqlshell里面调用该方法。

MySQL Shell 插件怎么写?

当然,在python模式下,方法名是符合python的语法风格的。

MySQL Shell 插件怎么写?

✔️ 需要注意什么呢?

建议在开发过程中给插件方法增加详细的注释,这样别人或自己在使用过程中才能更加清楚地知道每个方法的具体用途,以免时间久远忘记。

@plugin_function("check.getLongRunningTransactions")  
def get_long_running_transactions(seconds_wait=1, limit=10, session=None):  
    """  
    Print transacitons running longer than 1 second.  
    Args: 
        seconds_wait: the transaction running longer than this value will be printed(default: 1)        
        limit (integer): The optional limit of transactions to list (default: 10).    
        session (object): The optional session object used to query the database. If omitted the MySQL Shell's current session will be used.
MySQL Shell 插件怎么写?

📆 结束语

随着我们的MySQL Shell插件开发之旅画上句号,希望你不仅掌握了如何赋予老朋友MySQL新技能,还在这个过程中找到了些许乐趣。记住,每当你的插件完美运行时,不只是因为你精湛的编程技巧,还有那份对创新的热情在发光。如果偶尔遇到些小挑战,别忘了,即便是最优秀的代码,有时也需要一杯咖啡和一点耐心。感谢你在这段探索和创造的旅程中与我同行。期待在未来的代码旅程中,我们能再次相遇,共同探索更多未知的领域!


原文始发于微信公众号(小新数据库):MySQL Shell 插件怎么写?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/207547.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!