Mysql Hunter

一、简介
自动化实施的过程中,我们通常都面临一个棘手的问题:数据的准备和恢复。即在成功执行一个自动化用例时,我们可能需要一定的数据前提,而为了使得整个前提不至于被其他的用例破坏,以至于我们有时不得不在自动化用例编写过程中手工的添加许多Insert、Update、Delete语句来保证数据被恢复到我们执行用例前的状态。 
使用phpunit等工具框架进行php自动化单元测试的过程中也同样面临数据准备和恢复的问题。单元测试开发人员开发过程中不得不编码中显示编写数据准备,验证,恢复的代码,这样会带来以下几个缺点:
1、用例阅读性降低,难于辨别主要的测试逻辑 
2、用例可维护性降低,当数据库的表结构略微有变化或者业务底层逻辑有变动,数据的准备和恢复的代码都将有可能面临修改甚至重写 
3、极大消耗开发人员开发成本,用例编写过程中不得不额外花很多的时间去思考数据的准备和恢复。


基于以上三点,考虑设计实现一个mysql server及client的中间层,通过此中间层,可以将开发人员的数据恢复操作透明化,且在数据环境稳定的前提下,适度的降低开发人员的数据准备工作。 
基于Hunter扩展,将来可能带来: 
1、自定义Mysql桩(模拟、修改结果集) 
2、实时监控Query(已经实现,目前可以监控query性能) 
3、性能测试辅助,集成query性能瓶颈分析反馈

二、Amoeba和Hunter的角色
Amoeba for mysql位于Application与数据库之间,为应用提供透明的代理服务。Amoeba对外接口采用 mysql protocol,没有定义自己的协议和接口,使得任何mysql的应用都能方便的使用Amoeba,诸如php、java、c等等的cennector。Amoeba本身没有Build 任何 SQL语句,而是直接接收client的SQL、命令等进行代理转发,Amoeba采用 SQL、命令等 mysql protocol规范作为统一的接口,完备性得到了保证,能够完成mysql的所有功能操作。

三、 安装
Mysql Hunter不需要编译,仅需要Java运行环境(JRE1.5以上)。
先决条件 :
1、Java SE 1.5或以上Amoeba 框架是基于JDK1.5开发的,采用了JDK1.5的特性 支持Mysql协议版本10(mysql 4.1以后的版本) 
2、网络环境至少运行有一个mysql 4.1以上的服务 
操作步骤 :
1、 设置环境变量,在~/.bashrc中加入JAVA_HOME=/JRE的安装路径 / 
2、 将程序目录解压或拷贝出来,直接运行mysql-hunter/bin/amoeba即可启动 
参考参数配置进行配置后启动amoeba,此时proxy应连接到Mysql Server,同时对于client而言,mysql servers对于client是透明的,client认为proxy为mysql服务器直接连接proxy的ip和端口即可正常操作数据库。

四、 功能介绍
4.1 Amoeba for mysql
Mysql-hunter是基于amoeba框架做的mysql代理扩展如图。


amoeba for mysql本身实现的功能包括:
读写/分离;
失败重连 ;
负载均衡 ;
连接池 ;
身份认证


4.2 Mysql hunter扩展
Mysql-Hunter的功能则主要在于SQL/SQL Result的inject、rewrite以及reverse,如图: 


从上图可以看出,mysql hunter可以实现如下功能:
Client连接server的阶段进行自定义命令发送或返回 
Client发送query cmd至server的阶段,进行query截取,修改 
同理,Server返回给Client的结果集也能被hunter监控,修改甚至重写 
特点:使用起来很简单,只需要设置start点和end点,那么两者之间所有执行的sql query都可以被捕获、并生成逆命令

 

4.3 基本扩展BasicMysqlHunter
BasicMysqlHunter?是一个基本且实用的扩展实现,继承自Hunter类,实现了Hunter的抽象方法 ,可以在client发送cmd至server前对query进行截获处理,也可以对server返回的结果集进行修改。 
BasicMysqlHunter?下的basic handlers这里不再介绍,详细请参考《Mysql Hunter总体设计》,BasicMysqlHunter目前定位于对DML query进行如下操作: 
分析识别 
逆向语句及序列生成 
逆向语句的回放,即显示命令恢复数据库数据

举例说明 
Client通过mysql hunter向server发送了一条query: 
INSERT INTO tblLemma SET title = ‘北京’, content = ‘我爱北京天安门’; 
此时tblLemma表的自增字段ID变为了100 
Mysql Hunter将分析识别这条语句,最终生成逆向的恢复语句序列: 
Stack = (
‘DELETE FROM tblLemma WHERE title = ‘北京’ AND content = ‘我爱北京天安门’ AND ID = 100;’,
‘ALTER TABLE tblLemma SET AUTO_INCREMENT = 99;’,
)
通过顺序执行stack中的语句,数据库中的数据就将恢复到insert命令之前的状态。


4.4 Sql检查扩展SqlCheckHunter
继承自Hunter类,实现了Hunter的抽象方法,用来截获SQL语句,并对sql语句进行分析,最终给出分析报告。 
主要用于Sql query的性能分析,极大省去人力的比对分析,配置简单,对功能测试透明。 
支持SELECT、INSERT、UPDATE、DELETE语句的常规经验性检查。 
规则主要包含: 
mapIssueReason.put(SELECT_REASON_1, "使用的索引为Null,建议检查SQL涉及表的索引字段是否合理");
mapIssueReason.put(SELECT_REASON_2, "Filesort,所使用的索引对排序支持不好,如果检索排序结果集大建议增强索引");
mapIssueReason.put(SELECT_REASON_3, "查询结果集可能对应超过50条记录,而SQL非翻页查询语句");
mapIssueReason.put(SELECT_REASON_4, "备选索引数大于1,可以考虑采用force index优化");
mapIssueReason.put(INSERT_REASON_1, "连续采用单语句插入相同的表大于100次,建议考虑:1. 写合并;2. 采用LOAD DATA INFILE;3. 调节bulk_insert_buffer_size变量");
mapIssueReason.put(INSERT_REASON_2, "INSERT...SELECT...语句,请查看该语句的SELECT性能是否可接受");
mapIssueReason.put(UPDATE_REASON_1, "UPDATE语句,未包含where条件字段,进行全表更新操作效率低");
mapIssueReason.put(UPDATE_REASON_2, "UPDATE语句,WHERE字句不能使用索引找到被更新记录或修改范围过大");
mapIssueReason.put(UPDATE_REASON_3, "UPDATE语句连续更新相同表大于100次,建议考虑:1. 写合并;2. 如果有索引,索引更新可能过于频繁,适当修改缩减索引");
mapIssueReason.put(DELETE_REASON_1, "DELETE语句删除全表,建议使用truncate语句");
mapIssueReason.put(DELETE_REASON_2, "DELETE语句,WHERE字句不能使用索引找到被更新记录或修改范围过大");
mapIssueReason.put(DELETE_REASON_3, "DELETE语句连续更新相同表大于100次");

4.5 参数配置
下面介绍conf文件中所有的配置项。
amoeba.xml :
1. <server> //Amoeba 代理server,即proxy server的配置
/* port: 绑定端口
* ipAddress: 绑定ip
* readThreadPoolSize: 网络IO最大线程数
* user: amoeba 对外验证所需用户名
* password: amoeba 对外验证所需密码
*/
2. <connectionManagerList> 所使用的连接管理类,通常不需要修改
3. <dbServerList> 后端所连接的数据库服务器配置,包括主从所有的DB服务器
* <dbServer>
/* port: 真实mysql数据库端口
* ipAddress: 真实mysql数据库ip
* schema: 默认的数据库schema
* user: 连接该db所需的用户名
* password: 连接该db所需的相应用户的密码
*/
* <poolConfig>: 对象池,通常不需要修改
4. <dbServer name="multiPool" virtual="true"> 设定参与负载均衡的服务器
/* loadbalance: 负载均衡设定:1为轮询 2为权重
* poolNames: 以逗号分隔如,server1,server2,server3…
*/
5. <queryRouter> 所用的query分发路由相关配置
/* writePool: 写操作池包含的数据库服务器
* readPool: 读操作池包含的数据库服务器
* needParse: 是否需要进行query parse
*/
高亮的配置项是重新部署DB环境的时候通常需要关注的配置项。<br>
// 扩展配置
<extension>
<hunter class="com.meidusa.amoeba.extend.BasicMySqlHunter"></hunter>
</extension>
设定使用的hunter扩展是BasicMysqlHunter。

 

log4j.xml 
日志打印的配置,通常不需要修改。如果需要额外的增加日志格式,或者修改日志格式,级别可以参考log4j的文档,或者参考本配置文件的其他配置方法。
BasicMysqlHunter?目前提供三条自定制命令: 
1 select start:开始启用扩展,扩展将开始监控select start执行之后流经Hunter的DML命令并求逆;Hunter直接返回Ok packet 
2 select print_stack:打印当前Hunter上下文中的逆命令堆栈 
3 select end:结束扩展监控,并将Hunter上下文中的逆向命令栈依顺序pop出栈并发送Server恢复DB数据;Hunter直接返回Ok packet

$link = mysql_connect('127.0.0.1:3307', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
// Case执行前
$result = mysql_query("select start");

/*
* Case 执行
* 执行过程中可以自身或用其他客户端发送select print_stack命令check当前逆命令栈
*/

// Case执行后
$result = mysql_query("select end");
// 此时Case执行过程中的所有DML操作将被还原

五、使用注意
5.1 Mysql Hunter不支持的操作
Mysql Hunter(确切的说是BasicMysqlHunter)已经支持了绝大部分常用的DML语句,目前已知的不支持的query类型包括: 
DML语句的多表操作,例如一个query中同时修改update表A和表B的字段,暂时没有实现逆语句生成,仅能转发 
未实现UPDATE语句中包含order by limit的语句的逆语句生成,仅能转发 
暂不支持改变表结构和用户属性权限的语句,ALTER TABLE、TRUNCATE TABLE、CREATE TABLE、DROP TABLE、GRANT、ALTER USER等,仅能转发 
不支持非DML语句,仅能转发 
内置函数支持有限,根据实际应用过程中的使用情况增加对内置函数的扩展并求逆(目前已支持now())

5.2 Mysql Hunter日志使用
Mysql Hunter运行时日志记录在: 
log/hunter.log 正常日志 
log/hunter.log.wf 错误日志 
正常日志会打印所有流经proxy层的query cmds,以及hunter的关键执行步骤的log,通常不应出现错误日志,如果出现了错误日志有两种情况: 
hunter不支持的操作 
hunter自身的bug 
利用hunter.log有时可以辅助我们定位问题,甚至可以抛弃mysql的query.log

(作者:weichenxi)
 

【本文转自百度测试技术空间http://hi.baidu.com/baiduqa/blog/item/69fc0553d19d8f9b8c543004.html

关注百度技术沙龙











本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/744475,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C6748_UART(5) - UART寄存器

1、FIFO控制寄存器&#xff08;FCR&#xff09;RXFIFTL&#xff1a;接收FIFO中断触发(当FIFO中的数据量刚到达所要求&#xff08;trigger level&#xff09;的时候会产生中断);DMAMODE1:如果FIFO使能的话此位可以使能DMA模式。TXCLR&#xff1a;发送FIFO清除。RXCLR&#xff1a…

如何在Windows 10上限制Wi​​ndows Update的下载带宽

Windows 10’s Fall Creators Update gives you more control of Windows Update’s downloads and uploads. You can now set a download bandwidth limit, ensuring Windows Update won’t hog your Internet connection with its background downloads. Windows 10的Fall Cr…

Elasticsearch嵌套查询

2019独角兽企业重金招聘Python工程师标准>>> 一、背景 最近在做基于宴会厅档期的商户搜索推荐时&#xff0c;如果用传统平铺式的mapping结构&#xff0c;无法满足需求场景&#xff0c;于是用到了Elasticsearch支持的Nested(嵌套)查询。 二、普通对象与嵌套对象的索引…

写给深圳首期Python自动化开发周未班的信

你是否做了正确的决定&#xff1f; 深圳首期周未班的同学们大家好&#xff0c;我是Alex, 老男孩教育的联合创始人&#xff0c;Python项目的发起人&#xff0c;51CTO学院连续2届最受学员喜爱的讲师&#xff0c;中国最早一批使用Python的程序员&#xff0c;当然还有一堆头衔&…

网站跳出率的相关要点介绍

今天小峰seo博客和大家一起来探讨关于“网站跳出率的相关要点”&#xff0c;这里大体是分为三大要点&#xff1a;首先是进入的流量渠道&#xff0c;然后就是综合流量速度和内容的质量问题&#xff0c;细的来说就是我们的网站进来的用户是搜索什么关键词来的是通过百度还是搜狗或…

如何使用PowerShell提升开发效率(以Windows Embedded CE为例)

简介 本文讲述如何使用Powershell通过RAPI来控制Windows Embedded CE和Windows Mobile设备。 缘由 我入行的时候是做AS400 RPG和UNIX C开发的&#xff0c;所有开发环境都是字符界面&#xff0c;因此习惯了vigrepmake的开发模式。后来开始做Windows的开发&#xff0c;开始也不大…

视频图像传输学习笔记-基础小知识(一)

摄像头DVP与MIPI区别 DVP是并口&#xff0c;需要PCLK、VSYNC、HSYNC、D[0&#xff1a;11]——可以是8/10/12bit数据&#xff0c;看ISP或baseband是否支持&#xff1b;总线PCLK极限大约在96M左右&#xff0c;而且走线长度不能过长&#xff0c;所有DVP最大速率最好控制在72M以…

java程序员面试交流项目经验

粘贴自&#xff1a;https://blog.csdn.net/wangyuxuan_java/article/details/8778211 1&#xff1a;请你介绍一下你自己 这是面试官常问的问题。一般人回答这个问题过于平常&#xff0c;只说姓名、爱好、工作经验&#xff0c;这些简历上都有。其实&#xff0c;面试官最希望知道…

Windows7旗舰版磁盘分区详解—附分区步骤截图

最近工作中配置使用联想的Thinkpad TL系列本本.当然原装的系统时刚发布的Windows RTM旗舰版.在考虑买之前也参考了戴尔 苹果的等等, 但个人私下也是一直在用Tinkpad系列, 相比其他的品牌本人还是比较钟情于Tinkpad 非常实用的键盘. 以及简洁的外观.买回来一看这个TL系列原装的系…

outlook存档邮件_如何在Outlook 2013中存档电子邮件

outlook存档邮件We’ve always been told that backing up our data is a good idea. Well, that same concept can extend to email as well. You may want to archive your email every so often, such as monthly, quarterly, or even yearly. 我们一直被告知备份数据是一个…

洛谷 P1736 创意吃鱼法(多维DP)

题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中&#xff0c;然后开始思考&#xff1a;到底要以何种方法吃鱼呢&#xff08;猫猫就是这么可爱&#xff0c;吃鱼也要想好吃法 ^_*&#xff09;。她发现&#xff0c;把大池子视为01矩阵&#xff08;0表示对应位置无…

计算机组装和维护_如何构建自己的计算机,第二部分:组装在一起

计算机组装和维护So you’ve selected your parts, double- and triple-checked their compatibility, and waited for economy shipping to bring them all to your door. It’s time to get to the fun part: putting them all together. 因此&#xff0c;您已经选择了零件&a…

Python学习-集合的常见用法

st [1,2,3,4,5] ct [2,3,4,5,76] list set(["name", list, try]) list2 set(["name", list, try, but, test]) # 两个列表去重&#xff0c;利用集合st set(st) #设为集合 ct set(ct) print(st, type(st))sct0 st.union(ct) #并集 sct st | ct …

Autofac之自动装配

从容器中的可用服务中选择一个构造函数来创造对象&#xff0c;这个过程叫做自动装配。这个过程是通过反射实现的 默认 思考这么一个问题,如果注册类型中存在多个构造函数,那么Autofac会选择哪一个来创建类型的实例 答案是"尽可能最多参数" class ConstructorClass {p…

对Emlog 6.0 Beta的完整代码审计过程

Emlog 6.0 beta版本&#xff0c;这可能是最后一篇关于PHP语言CMS的代码审计文章&#xff0c;此次将详细记录完整的审计过程。 文章基本上完整记录小东的对此CMS审计过程&#xff0c;或许显得繁琐&#xff0c;但代码审计的过程就是这样&#xff0c;发现可能项&#xff0c;然后精…

SINOCES 2011

突然发现又好久没写过日志了 是在是太懒了… 难得休假去看了眼消费电子 感觉实在是一年不如一年 佳能、索尼不见踪影&#xff0c;相机满场没见一家&#xff08;大牌子是真没见到&#xff09; 华硕技嘉微星等主板厂商同样失踪… PC方面&#xff0c;联想貌似是来卖电脑包鼠标的&a…

esim卡与ms卡的区别_什么是eSIM,它与SIM卡有何不同?

esim卡与ms卡的区别With the launch of the Apple Watch 3, the term “eSIM” has been thrown around a lot. And now, Google’s Pixel 2 is the first phone to use this new technology, it’s time we take a closer look at what it is, what it does, and what this me…

机器学习实战之logistic回归分类

利用logistic回归进行分类的主要思想&#xff1a;根据现有数据对分类边界建立回归公式&#xff0c;并以此进行分类。 logistic优缺点&#xff1a; 优点&#xff1a;计算代价不高&#xff0c;易于理解和实现。缺点&#xff1a;容易欠拟合&#xff0c;分类精度可能不高。 .适用数…

HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题] 代码: 1 //1012-6343-数学2 #include<iostream>3 #include<cstdio>4 #include<cstring>5 #include<…

Android GridView LruCache

照片墙这种功能现在应该算是挺常见了&#xff0c;在很多应用中你都可以经常看到照片墙的身影。它的设计思路其实也非常简单&#xff0c;用一个GridView控件当作“墙”&#xff0c;然后随着GridView的滚动将一张张照片贴在“墙”上&#xff0c;这些照片可以是手机本地中存储的&a…