• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位置: MySQL 8 中文手册 -> MySQL 扩展

    MySQL 插件服务

    MySQL服务器插件访问服务器“插件服务。”插件服务接口公开了插件可以调用的服务器功能。它是插件API的补充,并具有以下特征:

    • 服务使插件可以使用普通函数调用来访问服务器内部的代码。服务也可用于用户定义的功能(UDF)。
    • 服务是可移植的,可以在多个平台上工作。
    • 该接口包括一个版本控制机制,以便可以在加载时根据插件版本检查服务器支持的服务版本。版本控制可以防止服务器提供的服务版本与插件预期或要求的服务版本之间存在不兼容性。
    • 有关用于测试插件服务的插件的信息,请参见MySQL Server Doxygen文档的“用于测试插件服务的插件”部分,网址为 https://dev.mysql.com/doc/index-other.html。

    插件服务接口与插件API区别如下:

    • 插件API允许服务器使用插件。调用计划由服务器来调用插件。这使插件可以扩展服务器功能或注册以接收有关服务器处理的通知。
    • 插件服务接口使插件可以在服务器内部调用代码。调用倡议在于用于调用服务功能的插件。这使得服务器中已经实现的功能可以被许多插件使用。他们不需要自己单独实施它。

    要确定存在哪些服务及其提供的功能,请查看include/mysqlMySQL源代码分发目录。相关文件是:

    • plugin.hinclude services.h,它是“伞”头,其中包括所有可用的特定于服务的头文件。
    • 特定于服务的标头的格式为。service_xxx.h

    每个特定于服务的标头都应包含注释,以提供给定服务的完整用法文档,包括可用的服务功能,其调用顺序和返回值。

    对于希望修改服务器以添加新服务的开发人员,请参见 MySQL内部知识:MySQL插件服务。

    可用服务包括:

    • get_sysvar_source:一项使插件能够检索系统变量设置源的服务。
    • locking_service:一种通过三个属性实现锁的服务:锁名称空间,锁名称和锁模式。该锁定接口有两个级别:1)作为C语言接口,可以从服务器插件或用户定义的函数作为插件服务调用;2)在SQL级别,作为一组用户定义的函数,这些函数映射到对服务例程的调用。有关更多信息,请参见“锁定服务”。
    • my_plugin_log_service:一项使插件能够报告错误并指定错误消息的服务。服务器将消息写入其错误日志。
    • status_variable_registration。用于注册状态变量的服务。
    • my_thd_scheduler:用于插件选择线程计划程序的服务。
    • mysql_keyring:用于密钥环存储的服务。有关更多信息,请参见“密钥环服务”。
    • mysql_password_policy:用于密码验证和强度检查的服务。
    • plugin_registry_service:MySQL Server包括基于组件的基础架构,用于提高服务器的可扩展性;请参见“ MySQL服务器组件”。但是,MySQL插件使用的接口早于组件接口。在plugin_registry_service使插件来访问组件注册和服务。
    • security_context:一种使插件能够检查或操纵线程安全性上下文的服务。该服务提供设置程序和获取程序例程,以访问服务器Security_context类的属性,其中包括诸如操作系统用户和主机,经过身份验证的用户和主机以及客户端IP地址之类的属性。
    • thd_alloc:内存分配服务。
    • thd_wait:用于插件报告睡眠或失速状态的服务。

    本节的其余部分描述了插件如何使用作为服务可用的服务器功能。另请参见使用该服务的“ daemon ”示例插件的源代码my_snprintf。在MySQL源代码发行版中,该插件位于plugin/daemon_example目录中。

    要使用插件中的一项或多项服务,插件源文件必须包含plugin.h头文件才能访问与服务相关的信息:

    #include <mysql/plugin.h>
    

    这不代表任何额外的安装费用。插件无论如何都必须包含该文件,因为它包含每个插件都需要的定义和结构。

    要访问服务,插件会像其他任何功能一样调用服务功能。

    要报告服务器将写入错误日志的错误,请首先选择一个错误级别。mysql/service_my_plugin_log.h定义以下级别:

    enum plugin_log_level
    {
      MY_ERROR_LEVEL,
      MY_WARNING_LEVEL,
      MY_INFORMATION_LEVEL
    };
    

    然后调用my_plugin_log_message()

    int my_plugin_log_message(MYSQL_PLUGIN *plugin, enum plugin_log_level level,
                              const char *format, ...);
    

    例如:

    my_plugin_log_message(plugin_ptr, MY_ERROR_LEVEL, "Cannot initialize plugin");
    

    某些服务可提供的插件通过插件,因此只有当提供服务的插件加载可用。使用此类服务的任何MySQL组件都应检查该服务是否可用。

    构建插件时,请-lmysqlservices在链接时使用该标志来链接libmysqlservices库。例如,对于CMake,将其放在顶级CMakeLists.txt文件中:

    FIND_LIBRARY(MYSQLSERVICES_LIB mysqlservices
     PATHS "${MYSQL_SRCDIR}/libservices" NO_DEFAULT_PATH)
    

    将其放在CMakeLists.txt包含插件源的目录中的文件中:

    # the plugin needs the mysql services library for error logging
    TARGET_LINK_LIBRARIES (your_plugin_library_name ${MYSQLSERVICES_LIB})