IT技术博客大学习 共学习 共进步

利用plugin更快的添加status variables

运维和开发 2011-07-18 23:30:42 累计浏览 2,425 次

在MySQL里添加一个system、status variables的比较复杂的,需要修改sql/sql_show.cc,sql/mysqld.cc, 还要修改sql/sql_yacc.yy,然后重新编译等等,前面的文章可见其复杂度,很容易出错。

daemon plugin 除了允许添加后台线程,也允许添加status,且不需要修改mysqld的代码。

#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>
 
static int get_value(MYSQL_THD thd, struct st_mysql_show_var* var, char *buff) {
	struct st_mysql_show_var *status = (struct st_mysql_show_var*) buff;
 
	var->type = SHOW_ARRAY;
	var->value= (char* )status;
 
	status->value = "aaa";
	status->type = SHOW_CHAR;
	status->name = "test1";
 
	status++;
	status->name = 0;
 
	return 0;
 
}
 
struct st_mysql_daemon sys_status = 
{
	MYSQL_DAEMON_INTERFACE_VERSION
};
 
static struct st_mysql_show_var sys_status_var[] = 
{
	{"plugin_test", (char *)&get_value, SHOW_FUNC},
	{0, 0, 0} 
};
 
mysql_declare_plugin(sys_status)
{
	MYSQL_DAEMON_PLUGIN,
	&sys_status,
	"sys_status",
	"hoterran",
	"test",
	PLUGIN_LICENSE_GPL,
	NULL,	
	NULL,	
	0x0100,
	sys_status_var,
	NULL,
	NULL,
}
mysql_declare_plugin_end;

上面添加了一个名字叫做plugin_test的status组,第一个status叫 plugin_test_test1,第二个status->name=0是个哨兵。

get_value(MYSQL_THD *thd, struct st_mysql_show_var* var, char* buff),其中thd为线程THD类, var就是你要填充的内容, buff是预先分配好的1024字节的一个变量,你不需要另外malloc了。先把status的内容填充到buff里,再把status赋值到var->value,就算结束了。

例子里status->value只是简单赋值为”aaaa”,你要加工获得想获得你想要的信息。

编译、安装、加载同上一篇文章。最后的效果如下

mysql> show status like '%plugin_test_test1%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| plugin_test_test1 | aaa   |
+-------------------+-------+
1 row in set (0.00 sec)

建议继续学习

  1. 根据status信息对MySQL服务器进行优化(一) (累计阅读 3,645)
  2. 根据status信息对MySQL服务器进行优化(二) (累计阅读 3,304)
  3. 动态加载Innodb Plugin (累计阅读 3,224)
  4. show engine innodb status显示信息不全? (累计阅读 2,766)
  5. MySQL daemon plugin example (累计阅读 2,543)