`
langzi_xl
  • 浏览: 22499 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何为mysql增加自定义命令

阅读更多

最近在做MySQL源码测试,某同学有个新做的**Patch,会新增加一些自定义的命令,实现策略比较”环保”,主要是考虑到低侵入性,通过某 些回调函数做,所以有些地方看着不优雅,有种”跳线”的感觉,不爽, 我于是找时间顺道学习了下官方比较传统的实现策略。下文仅供学习参考。

其实新增加一条命令,从技术角度讲并不复杂,但比较锁碎。首先需要有一份mysql的源代码,我这边桌面开发机上用的是5.1.45版本的源码,工具Visual Studio 2005、Bison。

原理上讲,对于一条client发过来的query,server端会有一个线程被分配过来处理(如果线程缓存有的话会先从里面拿,否则新建一 个),然后这个SQL会交到parser处理,这个parser会做词法分析和语法分析。parser在mysql中主要是通过bison结合Lex、 YACC实现的。其中Lex主要负责词法分析,YACC负责语法分析。

假设我们现在要新增一条命令,类似于show authors;这样的自定义命令,比较show disk_usage;那么我们就需要先加些符合信息到lex中,再加些命令语法到YACC中(sql_yacc.yy),最后通过bison编译成一个 C文件,再用gen_lex_hash重新生成lex hash文件,下面是详细步骤:

1. 修改lex.h,增加新符号信息,在“static SYMBOL symbols[]”里增加:

2. 在sql_lex.h中enum_sql_command中增加:

3. 在sql_yacc.yy中加上:

和相应的语法信息:

4.  然后就是到了比较熟悉的sql_parse.cc中增加相应的路由信息:

5. 接着我们在sql_show.cc中加上show_disk_usage_command的实现:

6. 对于windows用户来说,需要在sql_yacc.cc中增加几个声明:

7. 代码部分结束。现在我们来更新下sql_yacc.cc & sql_yacc.h。其它这两个文件是由sql_yacc.yy通过bison生成的:) 所以让我们到/sql目录下:

bison -y -d sql_yacc.yy

会生成两个新文件y.tab.c 和y.tab.h,分别替换掉之前原有的sql_yacc.cc和sql_yacc.h即可

8. 现在重新生成下lex hash:

gen_lex_hash > lex_hash.h 然后替换掉/sql下相应的同名文件即可

9. 现在已经大功告成,重新编译一把mysqld工程,然后从client测试下,果然可以了:)

10. 剩下的事就很简单了, 把刚才打的桩子 show_disk_usage_command的实现再细化些即可

参考资料《Expert MySQL》

0
0
分享到:
评论

相关推荐

    给mysql增加自定义函数(UDF),基于雪花算法生成分布式ID

    只需把dll或则so放到mysql安装目录下的lib/plugin目录下,然后登录mysql执行如下命令: DROP FUNCTION IF EXISTS `SNOWFLAKE`; CREATE FUNCTION `SNOWFLAKE` RETURNS INT SONAME 'snowflake.dll'; SELECT SNOWFLAKE...

    MySQL 5.1中文手冊

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 ...

    MySQL 5.1官方简体中文参考手册

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 ...

    MySQL 5.1参考手册

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 ...

    mysql5.1中文手册

    向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. ...

    MySQL 5.1参考手册中文版

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与...

    MySQL 5.1参考手册 (中文版)

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 ...

    MYSQL中文手册

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与...

    mysql官方中文参考手册

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 ...

    MySQL5.1参考手册官方简体中文版

    5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 ...

    DebianLNMP虚拟主机管理工具Nginx+PHP5.3+MySQL管理软件

    请输入额外增加的虚拟主机域名,中间以一个“空格”分隔 例如: bbs.jimmyli.tk blog.jimmyli.tk 3.请输入新的虚拟主机的目录 默认目录(直接按回车) 虚拟主机目录可以自定义。 4.允许访问日志?这将记录所有...

    DebianLNMP虚拟主机管理工具Nginx PHP5.3 MySQL管理软件

    请输入额外增加的虚拟主机域名,中间以一个“空格”分隔 例如: bbs.jimmyli.tk blog.jimmyli.tk 3.请输入新的虚拟主机的目录 默认目录(直接按回车) 虚拟主机目录可以自定义。 4.允许访问日志?这将记录所有...

    Ubuntu Debian(NGINX/PHP/MYSQL)快速配置工具LNMP云安装

    请输入额外增加的虚拟主机域名,中间以一个“空格”分隔 例如: bbs.jimmyli.tk blog.jimmyli.tk 3.请输入新的虚拟主机的目录 默认目录(直接按回车) 虚拟主机目录可以自定义。 4.允许访问日志?这将记录所有网络...

    基于MySQL的数据库中间件Meituan-DBProxy.zip

    增加后台MySQL版本号设置,主要影响MySQL连接协议中的server版本,客户端驱动可能依赖于server版本处理机制有所不同。由参数mysql-version控制 性能改进,将SQL词法分析从串行方式改进为并发方式;其次,...

    【安卓编程】E4A 4月28号版本 破解版

    15、中级例程增加《9909、自定义滑块条》例程,该源码来自E4A商业用户“孙大明”; 16、标签组件增加“置组件索引”、“取组件索引”、“绑定事件”命令; 17、删除高德地图组件中的弹出信息窗口上的小图标; 18、...

    mysql入门之1小时学会MySQL基础

    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件...

    zzzphp免费开源建站系统含手机站 v1.7.0 Build20190605

    邮箱验证,验证码开关留言开关,匿名留言,会员留言,管理员审核,管理员回复,可增加自定义留言参数(文本,数字,单选,多选,下拉)。手机开关水印开关:文字|图片水印,水印位置,水印质量邮件提醒:发信服务器...

    最新bugzilla安装.doc

    2. 我们需要在mysql中创建Bugzilla的用户以及数据库,主要三条命令为: a、建立数据库bugs 。命令:create database bugs; b、查询数据库。命令:show databases; c、建立用户bugs,密码为空,对Bugs数据库具有...

Global site tag (gtag.js) - Google Analytics