MySQL X协议分析

求道派的驴子 · · 2460 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这篇文章从分析MySQL X这个插件的协议层, 包括两方面内容:protobuf消息的具体定义,及这些消息到SQL语句的映射。

MySQL X简介

MySQL X 是MySQL 5.7发布时自带的一个插件,启用后,即可通过 X Protocol 协议提供一个非常类似MongoDB的服务。在Unix/Linux环境下,加载这个插件的命令是:

INSTALL PLUGIN mysqlx SONAME 'mysqlx.so';

后续的配置,可以参考这里
对应地,客户端程序称为 MySQL Shell , 在这里可以下载。

服务端的这个插件在收到请求之后,会将其翻译为对应的SQL语句,然后转交给MySQL主服务执行,并将结果集返回给客户端。

消息协议

消息协议定义在 MySQL 5.7 源码树的rapid/plugin/x/protocol目录下,包括连接管理、会话管理、CRUD等各种类型。需要注意的是,这些文件中定义了多个不同名的包,因此在Golang中,是无法使用的,还需要做一些包括建立子目录、更改包名等在内的微小处理。消息本身的文档在这里

然而文档并不涵盖所有的细节,因此,我们写一个抓包并打印消息内容的工具,来帮助我们调试这个协议。项目在这里

消息映射到SQL

管理员命令 ,在rapid/plugin/x/src/{admin_cmd_handler.h,admin_cmd_handler.cc}中。

  • ping,直接返回OK消息;
  • list_clients,返回4个column metadata,分别为client_id, user, host, sql_session;
  • kill_client
  • create_collection
  • drop_collection
  • ensure_collection
  • create_collection_index
  • drop_collection_index
  • list_objects
  • enable_notices
  • disable_notices
  • list_notices

验证相关的命令 ,在同目录下的auth_mysql41.hauth_mysql41.cc文件中。由三个函数,分别对应start,continue和done三个阶段。

CRUD类操作 ,通过crud_cmd_handler.h中定义的Crud_command_handler类的7个接口实现,这7个接口分别负责增删改查记录,及创建、修改、销毁视图。

  • Insert_statement_builder类将文档的插入操作改写为SQL的INSERT语句;
  • Update_statement_builder类将文档的更新操作改写为UPDATE语句;
  • 对应的,还有Delete_statement_builderfind_statement_builder类。

还有一些 notice 相关的内容,暂略。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:求道派的驴子

查看原文:MySQL X协议分析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2460 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传