博客迁移至:

从事DBA工作多年

MYSQL源码也是头一次接触

尝试记录下自己看MYSQL5.7源码的历程

申明:个人Python编程很溜,但是C++还停在白痴水平,源码理解方面有点弱,如发现有错误的地方,轻喷。

博客的题目是看源码,实际上可能会发现在不停的在改源码,没办法,手贱,不改不舒服。

目录:

上一篇我们实现了,屏掉了MYSQL的DELTE语句的执行功能。

想了想这种改动太暴力了,不够优雅

现在我们要改变一下思路,做一个MYSQL的黑名单功能。

什么叫黑名单呢?

就是说属于屏掉在带黑名单里的关键字的SQL的执行

举例来说,

我们发现有个上线故障,导致有大量的SQL在查一个表 SELECT * FROM A WHERE ...

我们设置个黑名单: SELECT * FROM A

那么所有这种查询将不执行,直接返回,这对线上服务的快速缓解问题是有很大帮助的。

现在我们来尝试在源码上定制这个功能

首先按上一篇文章说的,找到sql_parse.cc 定位 到这个函数 void mysql_parse(THD *thd, Parser_state *parser_state

通过 这一行

DBUG_PRINT("mysql_parse", ("query: '%s'", thd->query().str));  可以看到执行的SQL文本,现在只需要判断这个文本是否包含指定的字符串就可以了。

所以我们在入口的地方加上判断,如下:

void mysql_parse(THD *thd, Parser_state *parser_state)

{interror MY_ATTRIBUTE((unused));

DBUG_ENTER("mysql_parse");

DBUG_PRINT("mysql_parse", ("query: '%s'", thd->query().str));

DBUG_EXECUTE_IF("parser_debug", turn_parser_debug_on(););

#这里加我们的代码,目的是如果判断SQL文本中有指定字符abc ,直接退出。

std::string str_blacklist="abc";

std::string sqlstr_dba= thd->query().str;

std::string::size_type idx_blacki = sqlstr_dba.find( str_blacklist );

if ( idx_blacki != std::string::npos )

{

DBUG_PRINT("find blacklist sqlst",("query: '%s'", thd->query().str));

return;

}

#这里结束

mysql_reset_thd_for_next_command(thd);

lex_start(thd);

编译安装,随便 执行个SQL发现没问题,只要带上abc这个字符,立即退出,黑名单功能实现

但是我们不可能每次修改SQL黑名单都要修改一次MSYQL源码,这不现实,所以需要把这个黑名单做成系统变量 variables

这里注意了,一共是两个地方需要修改,全局变量定义放在mysqd.cc中 而变量的值初始化在sys_vars.cc中

打开mysqd.cc 加上

char *opt_black_sqlstr;

opt_black_sqlstr= NULL;

在mysqld.h里面加上:

extern char *opt_black_sqlstr;

以下完成了变量的申明

然后打开sys_vars.cc,加上下面这行初始化代码。

staticSys_var_charptr Sys_black_sqlstr("black_sqlstr","the black list sqlstr --by 51ak",

READ_ONLY GLOBAL_VAR(opt_black_sqlstr), CMD_LINE(REQUIRED_ARG),

IN_FS_CHARSET, DEFAULT(0));

现在我们完成了增加一个系统变量,也完成了SQL黑名单的判断,把这两个结合起来。执行SQL时如果文本中包含black_sqlstr中的文本,则强行退出执行。

我们去修改mysql_parse.cc

std::string str_blacklist=opt_black_sqlstr;

std::string sqlstr_dba= thd->query().str;

std::string::size_type idx_blacki =sqlstr_dba.find( str_blacklist );if ( idx_blacki != std::string::npos )

{

DBUG_PRINT("find blacklist sqlst",("query: '%s'", thd->query().str));return;

}

接下来编译,安装

修改配置文件 ,默认是/etc/my.cnf

增加一个变量:black_sqlstr=order

进入MYSQL,试一下:

#查一下我们设置的变量

mysql> show global variables like '%black%';+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| black_sqlstr | order |

+---------------+-------+

1 row in set (0.02sec)

#尝试触发黑名单

mysql> select 'order';

ERROR2013 (HY000): Lost connection toMySQL server during query

#尝试触发黑名单

mysql> select * from dba_test.op_log where content like '%order%';ERROR2013 (HY000): Lost connection toMySQL server during query

mysql>

好,一个SQL黑名单功能 已经完成,

通过这个例子,做了两个层面的修改,定义一个Mysql变量,使用这个变量来完成SQL限定的功能。

大家举一反三,发现更多的利用方式

今天到此为止。

mysql 黑名单_51ak带你看MYSQL5.7源码4:实现SQL黑名单功能相关推荐

  1. 51ak带你看MYSQL5.7源码2:编译现有的代码

    从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 申明:个人Python编程很溜,但是C++还停在白痴水平,源码理解方面有点弱,如发现有错误的地方,轻喷 目 ...

  2. Java多线程——带你看AQS框架源码

    AQS,全称AbstractQueuedSynchronizer,是Concurrent包锁的核心,没有AQS就没有Java的Concurrent包.它到底是个什么,我们来看看源码的第一段注解是怎么说 ...

  3. 【MySQL内核系列】Centos7环境MySQL5.7源码编译教程

    1.下载源码 下载带boost库的源码解压(-DDOWNLOAD_BOOST=1 为直接下载boost库),安装下面系统依赖.(Percona Software downloads for datab ...

  4. 带着问题读 TiDB 源码:Power BI Desktop 以 MySQL 驱动连接 TiDB 报错

    原文来源: https://tidb.net/blog/d343818b 作者:张翔 常有人说,阅读源码是每个优秀开发工程师的必经之路,但是在面对像类似 TiDB 这样复杂的系统时,源码阅读是一个非常 ...

  5. c#erp项目源码 mysql_Jsp+Ssm+Mysql实现图书馆预约占座管理系统项目源码(可带论文文档)...

    JSP+SSM+MYSQL实现图书馆预约占座管理系统项目源码(可带论文文档). 一款ssm图书馆预约占座管理系统,此系统有论文文档,需单独购买,此商品只为项目源码. 提前预定的好处:一开始我们这边有大 ...

  6. 字节跳动面试官问我看过哪些源码,然后就没有然后了

    最近,我的一位朋友在找工作,已经拿到了美团.快手等公司的Offer,准备选择其中一家入职了. 后来他又接到了字节跳动的电话,通知他去参加三面.从二面到三面之间隔了挺久的,他以为都没戏了,结果就收到了通 ...

  7. rock带你读CornerNet-lite系列源码(二)

    文章目录 前言 CorNerNet 结构 CornerNet_saccade结构 attention机制 CornerNet_Squeeze结构 构建Groundtruth 热图 focal loss ...

  8. 无错版K线全修复带余额堡/带会员等级财经系统源码

    K线全修复微盘带余额堡会员等级等附带完整教程.UI看着简洁美观.确实是一套不可多得的好程序. 环境需求:php5.6 修改数据库信息/application/database.php 设置伪静态thi ...

  9. mysql5.7 源码调试,用VS2015 Debug MySQL5.7源码

    用VS2015 Debug MySQL5.7源码 用VS2015 Debug MySQL5.7源码 一.软件准备: Cmake : https://cmake.org/download/ Active ...

最新文章

  1. 磁盘文件目录罗列和list控件的使用
  2. 谷歌发布TensorFlow Privacy​:大幅提升AI模型中的隐私保护
  3. Windows查看端口被占用的程序!
  4. Tomcat工程部署常见问题
  5. [Python]ConfigParser解析配置文件
  6. 如何写好一份工程师简历
  7. mysql1130_解决远程连接mysql错误1130的方法
  8. 1668智能下数教程视频_你需要的教程合集更新
  9. java 屏蔽邮箱_使用javamail发送邮件的时候如何阻止附件内容输出到控制台
  10. 三星国行S10 5G版本要来了?这次它抢在了国产手机的前面
  11. python如何导入类里_Python中如何导入类示例详解
  12. 狼群ps-天空大师扩展插件_扩展OctoberCMS-构建软删除插件
  13. 制作TTF格式的字体
  14. MySQL 中STD、STDDEV、STDDEV_SAMP 标准差函数的区别
  15. 线性代数(1)—— 行列式
  16. 什么是SVG及使用方式
  17. 关于RTMP推流直播摄像头最新问题解答
  18. python怎么搜索文献_学习帖|大神是如何用Python高效解决文献搜索和数据处理!?...
  19. Mysql安装(转自韩顺平教育)
  20. 疾病研究:DMD患者家庭理疗练习指南

热门文章

  1. 信息系统安全等级保护流程
  2. Echarts - legend、tooltip、xAxis属性设置
  3. c语言switch购物折扣,SWITCH国际版ESHOP史低来袭推荐(64):精彩在继续,折扣在进行,捡漏的机会到啦!...
  4. 防火墙阻止tftp_H3C防火墙常见问题汇总
  5. 独家秘技||如何快速入门一个陌生知识领域?
  6. 导出pdf文件时加图片水印
  7. 弗洛伊德算法(floyd)
  8. 去中心化的联邦图神经网络
  9. 以XML数据源为例的一个数据结构化方法
  10. 趋势 |「酸性设计」到底有多酷?