dba+開源工具:8.0升級無障礙!基于MySQL協(xié)議的抓包工具
mysql_sniffer工具簡介
mysql_sniffer 是一個基于 MySQL 協(xié)議的抓包工具,用來實時抓取 MySQL 服務(wù)端的請求,并格式化輸出,輸出內(nèi)容包括訪問時間、來源 IP、執(zhí)行的SQL語句。
在進(jìn)行MySQL 8.0升級時,了解新版本對SQL語法的改變和新增的功能是非常重要的。通過使用mysql_sniffer,DBA可以在升級之前對現(xiàn)有的SQL語句進(jìn)行抓取和分析,以確保在新版本中能夠正常運(yùn)行。
使用mysql_sniffer工具可以帶來以下幾點好處:
- 對SQL語法的改變有更深入的了解:MySQL 8.0引入了一些新的SQL語法,也對一些舊的語法進(jìn)行了修改或棄用。通過mysql_sniffer,DBA可以抓取并分析現(xiàn)有的SQL語句,以確定它們是否會受到這些改變的影響。
- 發(fā)現(xiàn)并解決潛在的問題:如果在新版本中,某些SQL語句無法正常運(yùn)行,那么通過mysql_sniffer,DBA可以提前發(fā)現(xiàn)這些問題,并在升級之前進(jìn)行修復(fù)。
有一些已知SQL語法與MySQL 8.0不兼容,例如:
select NVL(id/0,'YES') from test.t1 where id = 1;
select user_id,sum(amount) from test.user group by user_id DESC limit 10;
第一條語句,NVL函數(shù)是MariaDB特有的,在MySQL 8.0中,要改成:
select IFNULL(id/0,'YES') from test.t1 where id = 1;
第二條語句,在MySQL 8.0中g(shù)roup by 字段 ASC/DESC 失效,要改成:
select user_id,sum(amount) from test.user group by user_id order by user_id DESC limit 10;
- 那么,如何判斷業(yè)務(wù)上的未知SQL是否與MySQL 8.0兼容呢?
- mysql_sniffer工具可以幫助你
介紹
usage: mysql_sniffer [-h] -p PORT [-t TABLES [TABLES ...]] [-l LOG] [-c] [-r RUNTIME] [-v]
MySQL packet sniffer
options:
-h, --help show this help message and exit
-p PORT, --port PORT MySQL server port
-t TABLES [TABLES ...], --tables TABLES [TABLES ...]
Table names to capture
-l LOG, --log LOG Log file path
-c, --console Print log to console
-r RUNTIME, --runtime RUNTIME
Runtime of packet sniffing in seconds
-v, --version show program's version number and exit
參數(shù)解釋
-p 指定端口,MySQL默認(rèn)3306
-c 是把抓取到的SQL打印到終端
-t 指定具體的表名,例如只抓取t1,t2,t3這三張表, -t t1 t2 t3 (不支持正則表達(dá)式,請寫具體的表名)
-l 抓取的SQL保存在哪個文件里,不指定默認(rèn)保存在mysql_packet.sql文件里
-r 抓取多長時間,單位秒
使用
hell> chmod 755 mysql_sniffer
在 MySQL 5.7 或者 MariaDB 機(jī)器上執(zhí)行(SSH的ROOT權(quán)限)
shell> ./mysql_sniffer -p 3306
將會抓取60秒數(shù)據(jù)(-r 代表抓取的時間,單位秒),默認(rèn)會把線上的SQL語句(select/insert/update/delete)存入mysql_packet.sql文件里。
圖片
圖片
抓取1-10分鐘數(shù)據(jù),然后把mysql_packet.sql文件拷貝到MySQL 8.0測試環(huán)境里,然后執(zhí)行下面的命令:
mysql -S /tmp/mysql_mysql8_1.sock yourDB < mysql_packet.sql > /dev/null
看報錯信息。沒有報錯,就代表SQL是兼容的。
注:請確保生產(chǎn)環(huán)境和測試環(huán)境的表結(jié)構(gòu)一致,測試環(huán)境不需要任何數(shù)據(jù)。
測試
1) 假定 192.168.1.1 是 MySQL 5.7 / MariaDB,在該機(jī)器上運(yùn)行./mysql_sniffer -p 3306 -c
2) 在 192.168.1.2 機(jī)器上運(yùn)行sysbench,模擬出生產(chǎn)環(huán)境數(shù)據(jù)讀寫。
3) mysql_sniffer會實時打印出目前運(yùn)行的SQL語句。
注:工具適用于 Centos6 和 Centos7 系統(tǒng)。
- mysql_sniffer(Centos7)
- mysql_sniffer_centos6(Centos6)
工具研發(fā)者介紹
賀春旸,dbaplus社群金牌專家,凡普金科和愛錢進(jìn)DBA團(tuán)隊負(fù)責(zé)人,《MySQL管理之道:性能調(diào)優(yōu)、高可用與監(jiān)控》第一&二版、《MySQL運(yùn)維進(jìn)階指南》作者,曾任職于中國移動飛信、安卓機(jī)鋒網(wǎng)。五次榮獲dbaplus年度MVP,致力于MariaDB、MongoDB等開源技術(shù)的研究,主要負(fù)責(zé)數(shù)據(jù)庫性能調(diào)優(yōu)、監(jiān)控和架構(gòu)設(shè)計。
工具下載:https://github.com/hcymysql/mysql_sniffer