MysqlProtocolAnalyzer一个Java实现的MySql协议解析库

原创 2015年11月14日 17:37:46

MysqlProtocolAnalyzer

MysqlProtocolAnalyzer 是一个对Mysql的通讯协议的包进行解析的库,纯java编写,输入文件可以是任意的16进制的网络数据包文本文件,当然需要一定的预处理才能使用。本库是默认处理的是tcpdump产生的16进制的数据文件

项目背景

最近在做一个关于数据库的离线式容灾项目,近几年来,容灾已经成为信息数据中心建设的热门课题。很多容灾技术也快速发展起来,对用户来说也有很广阔的选择余地。但由于容灾方案的技术复杂性和多样性,一般用户很难搞清其中的优劣以确定如何选择最适合自己状况的容灾解决方案。
目前有很多种容灾技术,分类也比较复杂。但总体上可以区分为离线式容灾(冷容灾)和在线容灾(热容灾)两种类型。
而我们的项目是一种离线式的容灾,一个数据库集群,在有主备同步的状态下,如果备集群当机了,就会出现主备不一致的状态,当然只要主机群可用那可以通过很多种当时恢复备集群的数据,但是在当主集群发生不可恢复的灾难是,所以的数据都丢失。于是我们采用一种基于网络流量的离线式的容灾方案。首先在集群部署的时候在中间的网络网关或者路由器上的流量(网络数据包)进行抓取,分离出里面对于数据库主机群的数据包导流到我们指定的服务器Q上去,并不是拦截,主机群的网络数据完全不受影响,在服务器Q上安装流量包抓包程序将数据包写入到本地文件。在出现主备不一致的情况时,使用MysqlProtocolAnalyzer对生成的网络包数据进行解析,最终会生成其中主备差异的事务数据(一系列的sql语句),以便恢复备集群。

功能介绍

MysqlProtocolAnalyzer是根据MySql的通讯协议设计的一个对网络数据包进行解析的库(工具),我们在机器上可以通过tcpdump这个工具对某个网卡、端口或者IP地址的数据包进行抓取,抓取到的数据都是字节数据,我们需要将数据里面的TCP/IP层的数据去掉,得到真实的传输的数据。
而MysqlProtocolAnalyzer里面对于MySql协议(http://dev.mysql.com/doc/internals/en/client-server-protocol.html)全部支持。
会将数据解析成为一个一个的实体数据包,主要的数据包类型有MySqlAuthenticationPacket、MySqlColumnDefinitionPacket、MySqlCommandPacket、MySqlCommandPreparedPacket、MySqlEofPacket、MySqlErrorPacket、MySqlExecuteStmtPacket、MySqlHandShakePacket、MySqlOkPacket、MySqlPreparedOkPacket、MySqlResultsetPacket、MySqlResultsetRow等,这些包的作用官方的文档里面有介绍。

源码介绍

整个项目分为4个包
1. com.github.zhujunxxxxx.packet
2. com.github.zhujunxxxxx.type
3. com.github.zhujunxxxxx.tool
4. com.github.zhujunxxxxx.bootstrap
第一个包下面是对于所有的数据包的封装类,第二个包是里面的基本数据的定义,第三个包里面是对于数据包解析的类,第四个是一个快速启动的类。

Mysql协议

在Mysql协议中每个数据包都由三部分组成,分别是 length+sequence+真实数据。
其中length+sequence被称为包头(Packet Header),length占3个字节,sequence占1个字节。
在客户端和MySql服务端交互中,一般的通讯都只有一个包,但是其中其中情况是由多个数据包组成的。对于select语句的响应就是会返回多个数据包组成Resultset Packet,还有prepared语句的响应结果也是包含多个数据包组成PreparedOk packet的。

项目地址

该项目已经开源,项目地址 https://github.com/zhujunxxxxx/MysqlProtocolAnalyzer ,如果觉得有什么疑问请联系我。

注意事项

代码中有部分是在做测试的时候与业务相关的,去掉即可,你只需要留下其中解析包的部分代码。

mysql数据库协议..分析【mysql protocol 】

Retrieved from "http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol"MySQL Client/Serve...

MySQL协议分析

目录 目录1 交互过程 1.1 握手认证阶段1.2 命令执行阶段 2 基本类型 2.1 整型值2.2 字符串(以NULL结尾)(Null-Terminated String)2.3 二进制数...
  • wind520
  • wind520
  • 2015年02月27日 10:22
  • 13876

MySQL Client/Server Protocol

http://dev.mysql.com/doc/internals/en/client-server-protocol.html

mysql 协议的服务端握手包及对其解析

概况mysql客户端登陆到mysql服务端需要一个交互的过程,这里先看服务端给客户端发送的初始握手包。如下,client通过socket连接到server指定的端口后,server将往client发送...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

mysql 协议的ping命令包及解析

githttps://github.com/sea-boat/mysql-protocol概况mysql客户端可以用ping命令来检查服务端的状态,正常会返回ok包。mysql通信报文结构 类型 ...

mysql 协议的EOF包及解析

githttps://github.com/sea-boat/mysql-protocol概况mysql的EOF包用于标明查询结果的结尾。mysql通信报文结构 类型 名字 描述 int...

mysql 协议的query包及解析

githttps://github.com/sea-boat/mysql-protocol概况mysql客户端可以用query包向服务端发送一个基于文本查询。mysql通信报文结构 类型 名字...

mysql 协议的OK包及解析

githttps://github.com/sea-boat/mysql-protocol概况mysql客户端与mysql服务端交互过程中,当服务端完成客户端的某命令时则会返回OK包。mysql通信报...

基于MySQL协议的抓包工具:MySQL Sniffer

MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer 端的请求,并格式化输出。输出内容包访问括时间、访问用户、来源 IP、访问 Database、命令耗...
  • eagle89
  • eagle89
  • 2017年04月28日 17:35
  • 409
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MysqlProtocolAnalyzer一个Java实现的MySql协议解析库
举报原因:
原因补充:

(最多只允许输入30个字)