前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql_sniffer 是一个基于 MySQL 协议的抓包工具

mysql_sniffer 是一个基于 MySQL 协议的抓包工具

原创
作者头像
贺春旸的技术博客
修改2023-11-29 10:46:08
3010
修改2023-11-29 10:46:08
举报
文章被收录于专栏:DBA 平台和工具DBA 平台和工具

mysql_sniffer 是一个基于 MySQL 协议的抓包工具,用来实时抓取 MySQL 服务端的请求,并格式化输出,输出内容包括访问时间、来源 IP、执行的SQL语句。

使用 mysql_sniffer 工具可以带来以下几点好处:

  1. 对 SQL 语法的改变有更深入的了解:MySQL 8.0 引入了一些新的 SQL 语法,也对一些旧的语法进行了修改或弃用。通过 mysql_sniffer ,DBA 可以抓取并分析现有的 SQL 语句,以确定它们是否会受到这些改变的影响。
  2. 发现并解决潜在的问题:在 MySQL 8.0 版本中,某些 SQL 语句无法正常运行,那么通过 mysql_sniffer ,DBA 可以提前发现这些问题,并在升级之前进行修复。
  3. 数据库割接、迁移时,使用 mysql_sniffer 可以方便地判断原主库是否还有业务访问。通过 mysql_sniffer ,你可以截获数据库的查询语句、事务操作等信息,并进行分析。如果在割接或迁移过程中,没有新的业务请求经过原主库,那么可以判断原主库可以正常下线。

有一些已知SQL语法与MySQL 8.0不兼容,例如:

代码语言:javascript
复制
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函数是MariaDB特有的,在MySQL 8.0中,要改成:

代码语言:javascript
复制
select IFNULL(id/0,'YES') from test.t1 where id = 1;

第二条语句,在MySQL 8.0中group by 字段 ASC/DESC 失效,要改成:

代码语言:javascript
复制
select user_id,sum(amount) from test.user group by user_id order by user_id DESC limit 10;

那么,如何判断业务上的未知SQL是否与MySQL 8.0兼容呢?

mysql_sniffer工具可以帮助你

使用方法:

代码语言:javascript
复制
usage: mysql_sniffer [-h] -p PORT [-l LOG] [-c] [-v]

MySQL packet sniffer

options:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  MySQL server port
  -l LOG, --log LOG     Log file path
  -c, --console         Print log to console
  -v, --version         show program's version number and exit
代码语言:javascript
复制
shell> chmod 755 mysql_sniffer

在 MySQL 5.7 或者 MariaDB 机器上执行(SSH的ROOT权限)

代码语言:javascript
复制
shell> ./mysql_sniffer -p 3306

默认会把线上的SQL语句(select/insert/update/delete)存入mysql_packet.sql文件里。

image
image
image
image
抓取1-10分钟数据,然后把mysql_packet.sql文件拷贝到MySQL 8.0测试环境里,然后执行下面的命令:
代码语言:javascript
复制
mysql -S /tmp/mysql_mysql8_1.sock test < mysql_packet.log > /dev/null
看报错信息。没有报错,就代表SQL是兼容的。

注:请确保生产环境和测试环境的表结构一致,测试环境不需要任何数据。

测试

1) 假定 192.168.1.1 是 MySQL 5.7 / MariaDB,在该机器上运行./mysql_sniffer -p 3306 -c

2) 在 192.168.1.2 机器上运行sysbench,模拟出生产环境数据读写。

3) mysql_sniffer会实时打印出目前运行的SQL语句。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mysql_sniffer 是一个基于 MySQL 协议的抓包工具,用来实时抓取 MySQL 服务端的请求,并格式化输出,输出内容包括访问时间、来源 IP、执行的SQL语句。
  • 使用方法:
  • 测试
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档