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.pswp.cn/news/279642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279642.shtml
英文地址,請注明出處:http://en.pswp.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…