mysql 插件开发

本文详细介绍了如何使用C语言开发MySQL监控插件,并通过mysql_config命令进行编译和链接,最终实现插件的加载与运行。重点阐述了插件的初始化、退出流程以及与MySQL核心函数库的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.代码demo

#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <plugin.h>
#include <mysql_version.h>
#include <my_global.h>
#include <my_sys.h>
#include <pthread.h>
extern ulong        thread_id;
extern uint        thread_count;
extern ulong        max_connections;
static pthread_t    G_thread;
pthread_t ntid;

pthread_handler_t func(void *p)
{
    while(1) {
         sleep(5);
         fprintf(stderr, "Thread id [%ld]  Max_connections:%lu\n",
             thread_id, max_connections);
         }
}

static int monitor_plugin_init(void *p)
{
       
   if (pthread_create(&G_thread,NULL,func, NULL) != 0) {}
 
    fprintf(stderr, "%s", "Monitor plugin init\n");
    return 0;
}

static int monitor_plugin_deinit(void *p)
{
    pthread_cancel(G_thread);
    pthread_join(G_thread, NULL);
    fprintf(stderr, "%s", "Monitor_plugin deinit\n");
 
    return 0;
}
 
struct st_mysql_daemon monitor_plugin =
{
    MYSQL_DAEMON_INTERFACE_VERSION
};
 
mysql_declare_plugin(monitor_plugin)
{
    MYSQL_DAEMON_PLUGIN,
    &monitor_plugin,
    "monitor",
    "hoterran",
    "test",
    PLUGIN_LICENSE_GPL,
    monitor_plugin_init,
    monitor_plugin_deinit,
    0x0100,
    NULL,
    NULL,
    NULL,
}
mysql_declare_plugin_end;


编译前查看mysql函数库的路经。

/usr/local/mysql/bin/mysql_config --cflags
-I/usr/local/mysql/include  -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing
[root@localhost demo]#

编译:

#gcc -o monitor.o monitor.c -shared '/usr/local/mysql/bin/mysql_config --cflags'

gcc -g -Wall -I/usr/local/mysql/include/ -DMYSQL_DYNAMIC_PLUGIN   -c -o monitor.o monit
or.c

64位系统:

错误:/usr/bin/ld: monitor.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

在编译时加-fPIC

gcc -g -Wall -I/usr/local/mysql/include/ -DMYSQL_DYNAMIC_PLUGIN   -c -fPIC -o monitor.o
 monitor.c

gcc -shared -o libmonitor.so monitor.o


拷贝monitor.o

cp monitor.o /usr/local/mysql/lib/plugin/

show variables like 'plugin_dir';


进入mysql:

加载:

install plugin monitor soname 'libmonitor.so';

show plugins;

select * from mysql.plugin




### MySQL 插件开发教程 MySQL插件开发是一种扩展MySQL功能的方式,允许开发者创建自定义的存储引擎、审计插件、认证插件等。以下是对MySQL插件开发相关的关键点进行详细说明。 #### 1. 插件类型 MySQL支持多种类型的插件,包括但不限于: - **存储引擎插件**:用于实现自定义存储引擎。 - **审计插件**:用于监控和记录数据库活动。 - **认证插件**:用于实现自定义用户认证逻辑。 - **信息 schema 插件**:用于扩展 INFORMATION_SCHEMA 表的内容。 - **全文解析器插件**:用于支持自定义的全文索引解析器[^1]。 #### 2. 开发环境准备 在开始开发之前,需要确保安装了MySQL开发库以及C/C++编译工具链。例如,在Linux系统中可以通过以下命令安装必要的依赖项: ```bash sudo apt-get install libmysqlclient-dev ``` 此外,还需要熟悉MySQL插件API文档,这是开发过程中不可或缺的参考资料[^1]。 #### 3. 插件结构 每个MySQL插件都需要遵循特定的结构,通常包括以下几个部分: - **插件描述符**:定义插件的基本信息,如名称、版本、作者等。 - **初始化函数**:当插件被加载时调用,用于初始化资源。 - **清理函数**:当插件被卸载时调用,用于释放资源。 以下是一个简单的插件描述符示例: ```c #include <mysql/plugin.h> struct st_mysql_plugin my_plugin = { MYSQL_PLUGIN_INTERFACE_VERSION, NULL, /* info */ "example_plugin", /* name */ "Example Plugin", /* author */ "An example plugin", /* description */ PLUGIN_LICENSE_GPL, NULL, /* init */ NULL, /* deinit */ 0x0100, /* version */ NULL, /* status variables */ NULL, /* system variables */ NULL /* config options */ }; ``` #### 4. 加载插件 开发完成后,可以使用`INSTALL PLUGIN`语句将插件加载到MySQL服务器中。例如: ```sql INSTALL PLUGIN example_plugin SONAME 'example_plugin.so'; ``` 需要注意的是,插件文件必须放置在MySQL插件目录中,并且文件名需与`SONAME`参数一致[^2]。 #### 5. 生产环境注意事项 在生产环境中,建议对插件的功能进行全面测试,以确保其稳定性和安全性。此外,应避免直接通过`spring.jpa.hibernate.ddl-auto`属性自动更新数据库结构,而是采用Flyway或Liquibase等工具进行数据库迁移管理[^4]。 #### 6. 示例代码 以下是一个简单的MySQL插件开发示例,展示了如何创建一个基本的审计插件: ```c #include <mysql/plugin_audit.h> #include <stdio.h> static int example_plugin_init(void *arg) { printf("Example plugin initialized\n"); return 0; } static int example_plugin_deinit(void) { printf("Example plugin deinitialized\n"); return 0; } struct st_mysql_audit_interface_v1 example_plugin_audit = { MYSQL_AUDIT_INTERFACE_VERSION, example_plugin_init, example_plugin_deinit, NULL }; mysql_declare_plugin(example_plugin) { MYSQL_AUDIT_PLUGIN, &example_plugin_audit, "example_plugin", "Author Name", "An example audit plugin", PLUGIN_LICENSE_GPL, NULL, NULL, 0x0100, NULL, NULL, NULL } mysql_end_plugin ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值