本文根据高效运维系列微信群「运维讲坛」线上嘉宾分享整理而成。“高效运维”公众号作为本系列群的官方唯一公众号,原创并独家首发。 欢迎关注“高效运维”公众号,以免费参加「运维讲坛」每月一次的线下交流活动;并抢先赏阅干货满满的各种原创文章(详见文末)。 编辑
作者介绍
主题简介本文将主要从以下几个部分同大家探讨:
1. 诞生背景腾讯游戏业务的DB变更流程是由职能化或运维同学在腾讯游戏GCS平台(Game Cloud Storage)中提SQLScript的变更单,DBA对SQL逐句进行审核,通过后再由提单者在GCS平台执行现网变更。 腾讯游戏GCS平台:是腾讯互动娱乐事业群DBA(简称:腾讯游戏DBA)倾力打造,提供多样化的底层存储架构(TProxy\TMySQL\TSpider\TRedis),以及贴合游戏运营生命周期实现数据层的管理调度体系。 由于变更单据的多样性与复杂性,变更单的审核工作不止消耗DBA大量的时间精力,也无法保证变更单的正确性。可能会执行非法SQL导致变更时间延长,影响游戏正常开服造成损失。 下表为腾讯游戏 GCS 平台(Game Cloud Storage)统计2012.7.1~2013.7.1 一年SQL变更单据语法错误的结果。
从上表可以看出,变更因语法错误导致的失败率为3.3%,平均每2天有一个变更失败是因为语法错误。于是诞生了SQL审核工具(TMySQLParse)。 SQL审核工具(TMySQLParse)用于对 MySQL的SQL 语句进行语法解析,判定语法正确性,并根据自定义的高危特性检测SQL是否存在高危情况。 通过将 TMySQLParse 集成到 GCS 平台中,可以降低人工审单的难度及减少其工作量,从而实现审单的自动化。 在 TMySQLParse 集成 GCS 平台后,运维的提单就可由SQL审核工具自动进行语法解析及高危SQL告警,保证提交语法正确的变更单据到现网服务器中。
2. 实现原理SQL审核工具应该完全兼容 MySQL 的输入,及解析 MySQL 的语法。 我们改造 MySQL 源码的 Client 模块来实现SQL审核工具的输入,利用 MySQL 源码的语法分析模块来对 SQL 语法进行解析。 下图1为 SQL 审核工具与 MySQL 源码模块对应示例。
SQL审核工具实现中最重要的两个模块:输入模块及语法分析模块,下面分别进行说明。 2.1 输入模块SQL审核工具的输入模块是对 MySQL Client 源码进行了改造。
其中最主要的函数就是
在这个循环里,处理每一条读取或者输入的字符串,分别通过函数 SQL解析工具需要完全兼容 MySQL Client 的输入模式,比如文件/终端输入,支持 delimiter 分割断句,支持各种注释等,却不需要连接到MySQL Server,并与MySQL Server进行交互。 因此,SQL审核工具在MySQL Client的基础上,不需要做
2.2 语法解析模块MySQL 语法处理是由 yacc 实现的, yacc(Yet Another Compiler Compiler) ,是一个经典的生成语法分析器的工具。 MySQL 通过 yacc定义语法规则,并且将 SQL 语句解析出来的内容放在LEX结构体里。 如下图3所示为 Update 语句的 yacc 规则, Update:为一个非终结符,后面为一系列的终结符号与非终结符号组合。 如果SQL语句能够匹配到其中的终结符号,则执行大括弧 {} 中的动作,否则则进一步解析解析成终结符号。 从图3也可以看出,语法解析的内容存放在LEX结构体中。在 MySQL 源码中,函数 parse_sql() 封装了MySQL中通过 yacc 解析语法的逻辑。传入一条 SQL 给 parse_sql(), parse_sql()即可将SQL语句生成语法树,保存到LEX结构体中。 SQL 审核工具的语法解析模块就是依赖于MySQL的语法模块实现。
为此我们只需要剥离出函数 parse_sql 即可。
3. 使用介绍上面介绍了 SQL 审核工具的背景及实现,现在讲下SQL审核工具应如何使用。 先总结下 SQL 审核工具: 具体一点就是:
3.1 SQL 审核工具参数SQL 解析组件有如下参数,比如指定字符集,字符 MYSQL 版本号,指定输入的文件路径,指定获取表的个数,获取 table,database 信息等。具体详见图4:
其中-v参数用来指定MySQL的版本号。 TMySQLParse是基于MySQL 5.5.24的源码实现,所以主要支持MySQL 5.5.24版本的语法。此处指定MySQL版本号的意义在于兼容MySQL各个版本间的保留字。由于各业务使用习惯不同,开发商可能在MySQL 5.1版本中使用了MySQL 5.5版本的保留字,会被TMySQLParse判定为语法错误。 为此我们兼容了 MySQL 各个版本间的保留字。即 MySQL 5.5.24 前的版本,使用后面版本新增加的保留字作为表中字段也可以通过语法检查。 3.2 SQL 审核工具的输入/输出SQL 审核工具 TMySQLParse 提供两种输入方式:
文本输入可以通过 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|