Inception的备份语句生成原理分析

Inception是对MySQL数据库的线上运维操作进行辅助的一个工具,它能提供SQL的审核、执行、备份的操作,保证运维的可靠性。

现在为了在公司中使用这个工具来减轻我们的运维工作负担,开始着手使用它。

问题

使用之前,我们需要了解这个工具的原理,包括它对一些我们关注的方面的解决方式,以及在出现一些问题时我们应该怎样应对解决。

  • 首先,我们需要用到它的审核SELECT类型SQL功能,那么它的审核功能是怎么实现的?一些审核配置项是怎么发生作用的?
  • 其次,我们还需要用到它的DML操作功能,Inception是怎样完成在审核SQL的同时还能执行?执行完成后是怎么生成反向恢复语句?如果在执行多条语句的时候中途发生了错误,后续的语句还会执行吗?如果在执行过程中网络发生问题,执行结果又是怎样的?
  • 等等。。。

带着这些问题,我们开始一点点探索它内部的一些细节流程。

代码分析

我们先从执行函数的创建阶段开始查找,找到执行流程的具体入口在什么位置,以及这个具体入口是怎样被创建的。

  • 执行流程创建

通过GDB的定位以及代码的分析,我们可以得到Inception的具体工作是在新创建的工作线程中完成,而这个工作线程的入口钩子函数就是实际的处理函数:

而钩子函数的挂钩的过程是在进程刚启动时的初始化函数中完成的:

根据上面两个流程图,我们得到的结论是Inception在启动成功后,一旦接收到SQL语句的请求,就会创建新的线程,而这个创建新线程的钩子函数是指向create_thread_to_handle_connection(), 在这个函数会创建线程来处理对SQL语句块的分析、检查、执行和备份流程。

  • 执行SQL流程分析

在create_thread_to_handle_connection()函数中,新创建的线程入口函数为handle_one_connection(),从这个函数中,我们可以继续查找到SQL语句块的分析、检查、执行和备份流程以及回滚语句的具体执行位置,执行流程图如下所示:

上图从左往右的顺序就是函数栈的从上往下的顺序,一直到最底层实现具体逻辑的地方。

以下内容会对这个图的各个部分进行拆解分析。

  • SQL检查流程

当Inception监听的端口收到连接请求后,就会调用create_new_thread()函数,其中创建的新线程的入口函数钩子已经在Inception的main函数开始阶段确定下来,它是指向handle_one_connection()函数。

在handle_one_connection()函数中,会将输入的SQL语句进行处理(语法词法解析、检查规范、执行、备份语句等操作),处理完成后将结果给传回到客户端。

在一个Inception语句块中,一定会包含多条语句,因为它需要满足以下格式的语句块:

1 /*--user=inception_user;--password=123456;--host=192.168.1.200;--enable-execute;--port=3363;*/
2 inception_magic_start;
3 use test_2;
4 update test set name="aaaaab" where id=20;
5 inception_magic_commit;

第1行是Inception语句块的头信息,放在SQL的注释块中

第2行是Inception语句块的起始标记

第3~4行是Inception语句块,客户端需要处理的SQL语句

第5行是Inception语句块的结束标记

头信息、开始标记、结束标记必然是需要的,语句块信息也至少是1句SQL,每条语句经过语法解析后,会得到一棵语法树,交由mysql_process_command()进行处理。

此函数对每个语句生成的语法树都会进行处理,在处理到Inception_magic_commit对应的语法树之前,都是检查的过程,只有在处理完它之后才会进行执行(如果在头信息中指定的是--enable-check而不是--enable-execute后续就不会有执行的操作发生了,只是将得到的检查结果发回给客户端)。

在mysql_parse()中生成了一条语句的语法树后,会继续执行对这条语句的处理流程,其中检查过程是在mysql_check_command()函数中完成的,包括检查dml语句是否有where条件(inception_check_dml_where)、inception_check_dml_limit、inception_check_dml_orderby、inception_enable_select_star等等检查项。

  • 执行流程

在对所有语句的检查完成后,会进入到mysql_execute_commit()函数,开始进行所有语句的执行,每条语句按照顺序执行,并且每条语句都是独立的事务,如果中途有一条语句发生错误,后续的语句就不会执行了。

如果在执行过程中发生网络问题,那么这条语句对应到这个事务是否完成是未知的,但是对于Inception而言,发生网络错误了就相当于这条语句执行失败,后续的语句就不会执行了,当前的这条语句会标记为失败,也就不会有回滚语句备份。

  • 生成回滚语句流程

在执行过程完成后,就开始对每条语句逐个进行回滚语句解析并备份:

从下图中可以看出备份是在执行完成之后,在mysql_backup_sql()中逐条解析语句的binlog,对于每个语句在执行的过程中记录了该语句执行之前的binlog pos和之后的binlog pos,以及该连接的thread_id, 使用这三个值可以对每条语句的binlog进行精确定位,从而可以得到这个语句的所有binlog。

每条语句的binlog中可能包含多个event,每个event可以解析出一条回滚语句。

如果在binlog的传输过程中发生网络错误,Inception给每条语句的备份流程中进行重试的机会有三次,如果重试次数超过三次,这条语句的回滚语句就会备份失败。

上面这张图是Inception的回滚语句备份流程,会对不同的语句类型执行不同的event解析过程。具体的解析过程后续会有文章再分析。

结论

这篇文章从Inception的DML语句的检查、执行、备份的实现流程的角度去分析了它的源码执行流程:

检查过程是在mysql_check_command()过程中完成的,这个过程发生在每条语句的语法树生成之后,在执行所有语句之前。

执行过程是在mysql_execute_commit()函数中完成,在这个函数中会在线上服务器上逐条执行每个sql语句,执行结果中会包含执行前的binlog位置和执行后的binlog位置以及thread_id

备份过程是在执行过程完成之后,逐条语句分析对应的binlog(流式下载到Inception端),然后根据在执行时记录的执行前binlog位置和执行后的binlog位置以及thread_id来得到属于这条语句的所有binlog,解析为回滚语句并备份到备份服务器上。

通过源码的分析,在后面的使用中如果碰到了一些问题可以很容易定位,如果有需要的话直接上手改也是一个不错的选择,即解决了自己的问题也为开源工具的发展做出一点贡献。

时间: 2024-10-12 02:38:56

Inception的备份语句生成原理分析的相关文章

金蝶BOS 7.5 SQL语句生成分析

今天刚好有空,就分析下 金蝶BOS 7.5 SQL语句生成 方式.(分析环境 Oracle 11.0.2 , 金蝶BOS 7.5.0) 1 操作思路 思路是这样的,在开发环境触发SQL操作,然后在数据库中查出最近执行的SQL,对其分析. 数据库里使用SQL语句: --这里只查询JDBC操作的SQL语句 SELECT t.sql_id,        t.sql_text,        t.sql_fulltext,        to_char(t.last_active_time, 'yyy

Hadoop数据管理介绍及原理分析

Hadoop数据管理介绍及原理分析 最近2014大数据会议正如火如荼的进行着,Hadoop之父Doug Cutting也被邀参加,我有幸听了他的演讲并获得亲笔签名书一本,发现他竟然是左手写字,当然这个他解释为个人习惯问题,也是,外国人左手写字的为数不少,在中国,左撇子在小时候的父母眼中就是“异类”,早早的被矫正过来.废话不多说了,接下来介绍Hadoop的数据管理. Hadoop的数据管理,主要包括Hadoop的分布式文件系统HDFS.分布式数据库HBase和数据仓库工具Hive. HDFS的数据

深入理解HTTP协议、HTTP协议原理分析

深入理解HTTP协议.HTTP协议原理分析 目录(?)[+] http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本.其中最著名的就是RFC 26

MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解InnoDB存储引擎实现的多版本控制技术(简称:MVCC). 基本知识 假设对于多版本控制(MVCC)的基础知识,有所了解.MySQL数据库InnoDB存储引擎为了实现多版本的一致性读,采用的是基于回滚段的协议. 行结构 MySQL数据库InnoDB存储引擎表数据的组织方式为主键聚簇索引.由于采用索引

Chromium和WebKit的智能指针实现原理分析

C++不像Java一样,由虚拟机负责对象分配和释放.也就是说,开发人员使用C++编写代码时,要自己负责对象分配和释放.WebKit和Chromium都是使用C++开发的,因此它们也面临上述问题.在解决对象释放问题时,要做到在对象不需要时自动释放,因为手动释放会带来忘记释放或者释放后又继续使用的隐患.智能指针是实现对象自动释放的有效技术手段.本文就分析Chromium和WebKit的智能指针的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在现实中,

嵌入式linux QT开发(三)——GUI原理分析

嵌入式linux QT开发(三)--GUI原理分析 一.命令行程序 命令行程序是面向过程的程序设计. 命令行程序的特点: A.基于顺序结构执行 B.程序执行过程中不需与用户交互 C.程序执行结束给出最终运行结果 命令行程序适用场合: A.单任务场合 B.无交互.简单交互场合 C.服务器应用场合 二.GUI程序 GUI程序的特点: A.基于消息驱动模型的程序 B.程序执行依赖用户交互过程 C.程序执行过程中实时响应用户操作 D.一般程序执行后不会主动退出 GUI程序适用场合: A.多任务场合 B.

MyBatis的深入原理分析之1-架构设计以及实例分析

MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现. 一.MyBatis的框架设计        注:上图很大程度上参考了iteye 上的chenjc_it所写的博文原理分析之二:框架整体设计 中的MyBatis架构体图,chenjc_it总结的非常好,赞一个! 1.接口层---和数据库交互的方式 MyBatis

从安全攻击实例看数据库安全(三)数据库攻击原理分析

摘要:本文将通过对SQL注入攻击技术和数据库加密技术原理以及防护效果进行深入的分析,来辨析数据库安全技术误区"数据库加密能解决SQL注入",同时本文也给出了SQL注入的防护方法. 1. 数据库安全误区 针对2015年4月互联网大规模报道的全国30省市社保等行业用户信息泄露事件,安华金和对乌云历史报道的社保行业相关漏洞进行集中分析,得出的结论为:大量的信息泄露主要是由于软件中存在的SQL注入漏洞被黑客利用引起的,我们可以把SQL注入比作黑客攻击数据库"锋利的矛".  

一次SQL查询优化原理分析(900W+数据,从17s到300ms)

一次SQL查询优化原理分析(900W+数据,从17s到300ms) Muscleape关注 132019.12.09 00:48:52字数 1,163阅读 2,730 有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms),按照下文的方式调整SQL后,耗时347 ms (execution: 163 ms, fetching: 184 m