MySQL数据库Inception工具学习与测试 笔记

作者: 东山絮柳仔

MySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很吃力的,标准越多,DBA越累,开发也越累。 那么在这个都追求自动化运维的时代,审核也必须要跟上步伐,因此Inception诞生了。而Inception可以做的工作远不止是一个自动化审核工具,同时还具备执行,生成对影响数据的回滚语句(类似闪回的功能),这样一条龙服务的工具,将会给DBA的工作带来翻天覆地的变化,DBA从此就从繁重的审核、登上去执行,出错了很难回滚(如果提前没有备份的话)的被动局面解放了出来,突然发现,做DBA原来可以这么轻松,工作可以不饱和了,那就有更多的自由时间学习、进一步向自动化运维平台的实现等更智能化的方向去发展,是具有里程碑意义的。

1.Inception架构原理

Inception是集审核、执行、回滚于一体的一个自动化运维系统。它是根据MySQL代码修改过来的。

相对于应用程序(上层审核流程系统等)而言,它是一个服务器,在连接时需要指定

2.Inception安装

2.1 环境配置

安装依赖项

yum install cmake ncurses-devel gcc gcc-c++ openssl-devel

移除bison较新的版本

yum remove bison –y

http://ftp.gnu.org/gnu/bison/ 路径,下载 bison-2.6.1.tar.gz 指定版本。下载后,上传至服务器。

解压并安装bison

tar zxvf bison-2.6.1.tar.gz
cd bison-2.6.1
./configure && make && make install

2.2 下载安装Inception

下载

 wget https://github.com/qunarcorp/inception/archive/master.zip

解压

unzip master.zip
cd inception-master
./inception_build.sh debug [Xcode]

指定路径下创建inc.cnf

touch /data/Inception/inc.cnf

初始化

/data/Inception/inception-master/debug/mysql/bin/Inception --defaults-file=/data/Inception/inc.cnf &

(Inception 最佳启动方式是通过nohup后台启动

nohup /data/Inception/inception-master/debug/mysql/bin/Inception --defaults-file=/data/Inception/inc.cnf &

) 

2.3 关闭Inception

找到初始化后的Inception

关闭Inception

kill -9 7927

2.4 修改增加配置项

[inception]
general_log=1
general_log_file=inc.log
port=6669
socket=/tmp/inc.socket
character-set-client-handshake=0
character-set-server=utf8
inception_remote_system_password=备份库密码
inception_remote_system_user=备份库账号
inception_remote_backup_port=备份库实例端口
inception_remote_backup_host=备份库IP
inception_support_charset=utf8mb4,utf8,latin1
inception_enable_nullable=0
inception_check_primary_key=1
inception_check_column_comment=1
inception_check_table_comment=1
inception_osc_min_table_size=1
inception_osc_bin_dir=/data/temp
inception_osc_chunk_time=0.1
inception_ddl_support=1
inception_enable_blob_type=1
inception_check_column_default_value=1

如果执行 ./inception_build.sh debug [Xcode] 命令报错,可将inception-master目录删除,重新解压,然后用 ./inception_build.sh build linux 替代。当然,此时的可执行文件 在 /data/Inception/inception-master/build/mysql/bin/Inception

更多的安装知识,可参阅 https://qunarcorp.github.io/inception/install/) 2.5 连接验证

通过mysql 客户端连接

执行 代码验证

 inception get variables;

2.6 Inception的选项支持

|--------------------------|--------|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数名                      | 是否需要参数 | 是否可选 | 功能描述                                                                                                                                                                                                                                                |
| --host                   | 是      | 否    | 需要操作的这部分语句块对应的数据库地址。指定方式可以是IP地址、机器名或DNS域名等,只能唯一解析到这个机器即可。                                                                                                                                                                                           |
| --port                   | 是      | 否    | 与上面的--host选项对应,指定机器名,必然要再指定一个MySQL实例的端口。                                                                                                                                                                                                            |
| --user                   | 是      | 否    | 通过--user指定的用户名来连接需要操作SQL语句的MySQL实例。                                                                                                                                                                                                                 |
| --password               | 是      | 否    | 与上面的--user选项对应。                                                                                                                                                                                                                                     |
| --sleep                  | 是      | 是    | 这个参数用来指定在执行完每一条语句后,暂停多少毫秒,这样可以适当控制对线上数据库的冲击,特别是针对大量的写入操作, 单位是毫秒,最小值为0,也就是不暂停,最大值为100秒,也就是100000毫秒。如果设置的值超过了100000毫秒, Inception会自动将其设置为100000毫秒。这个参数可以和其他参数一起设置,但是只有在--enable-execute为1的情况下,才起作用。                                                    |
| --enable-check           | 否      | 否    | 告诉Inception当前要做什么操作,是审核还是执行,这个参数与下面的--enable-execute智能指定一个。enable-check就是要告诉Inception, 当前的请求是要做审核操作,审核完成后就返回结果集。                                                                                                                                    |
| --enable-execute         | 否      | 否    | 如果执行的选项是--enable-execute,则Inception在执行前还会做一次实时的审核,这个审核和前面指定的--enable-check时的 审核是基本相同的,这是这次在审核完成后,还会继续进行。因为相同的语句在不同的时间审核可能会产生不同的审核结果(环境有可能变了), 所以有必要再做一次审核。如果审核发现了错误(而不是警告),就不会被执行,此时会提前返回告知错误;如果审核发现的是警告, 并且没有指定--enable-ignore-warnings,则有警告也不会执行。 |
| --enable-ignore-warnings | 否      | 是    | Inception采取严格的分阶段处理方式,先对所有的语句进行审核,审核完成之后,会执行所有的语句,之后再会执行所有语句的备份操作。 在三个阶段的过渡过程中,如果审核有问题则不会继续进行,此时如果人为确定想要跳过这些警告,则可以选择这个参数, 告诉Inception跳过这个警告的检查,继续执行。                                                                                                |
| --enable-force           | 否      | 是    | 批量导入时,有可能会报主键冲突的问题,而DBA可以确定的是,出现主键冲突不是问题,可以继续执行,那么此时可以通过选项 --enable-force告诉Inception,在执行过程中碰到一个错误时,可以先保存错误信息并继续下一条语句。此参数需谨慎使用。                                                                                                                      |
| --enable-remote-back     | 否      | 是    | Inception支持备份并生成对应的回滚语句,这是默认的,但当有些影响行数很多且明确不需要回滚的时候,为了提高执行效率, 可以指定在执行时不做备份,指定方式是通过disable来禁用它,即disable-remote-backup。                                                                                                                               |
| --enable-split           | 否      | 是    | 这个参数用来拆分要执行的语句块。如果在语句块中存在对同一个表的DDL操作和DML操作,那么在分析Binlog来生成回滚语句时, 由于表结构已经发生改变,会导致Inception没有办法处理,所以使用这个参数将这些语句分成多批,然后再分别执行。这是在执行前 必须要做的一个操作,不然可能会产生不可预知的错误。当然在执行前的最后一次审核中,如果检查到这样的混用情况, 则会返回报错,而不是警告。                                                 |
| --enable-query-print     | 否      | 是    | 这个参数用来打印SQL语句在被Inception分析之后的执行树结构,已JSON的形式提供,目的是为了可以在Inception的基础上, 对已经结构化的(JSON)语句再次分析,可以对Inception内置支持的规则进行扩展,做个性化定制,比如使用到哪些列、 哪些语句类型等信息。                                                                                                        |

2.7 Inception结构集导读

|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 返回列           | 详细描述                                                                                                                                                                                                                                                                                                                                                      |
| ID            | 用来表示结果集中记录序号的,也就是被审核的语句在语句块中的序号,按位置排序,计数从1开始。                                                                                                                                                                                                                                                                                                             |
| stage         | 显示当前语句已经进行到哪一步了,包括四个值:CHECKED、EXECUTED、RERUN和NONE。CHECKED表示这个语句只做审核,而没有再进行下一步操作;EXECUTED表示已经执行过, 如果执行失败,也是用这个状态表示,RERUN表示的是,对于影响上下文的语句,已经执行成功了,但是为了与EXECUTED区分,用RERUN表示,主要是因为在执行过程中,如果某一条语句 执行失败了,则上层可能需要将没有执行的语句提取出来,再次执行,那么影响上下文的语句就是需要加上的,所以用RERUN来表示。Inception目前支持两种影响上下文的语句,分别是 set names charset 语句和use database语句。NONE表示没有做过任何处理,有可能前面有语法错误直接提前返回。 |
| errlevel      | 总共有三个值,分别是0、1、2。如果为0,则说明当前语句审核没有任何问题;如果为1,则说明当前语句审核时发现有些写法不符合Inception定义的内置规则,属于警告;如果值为2,则说明 当前语句审核时,发现了严重错误,无论如何都不能通过的。                                                                                                                                                                                                                                  |
| stagestatus   | 该列用来描述当前语句的阶段结果,与列stage对应。如果是审核阶段,并且完成,则返回Audit completed。如果是执行阶段,并且执行成功则返回Execute Successfully,否则返回Execute failed。如果是备份阶段,并且备份成功,则在执行描述信息后面追加Backup successfully,否则追加Backup failed。                                                                                                                                                                      |
| errormessage  | 用来表示出错的错误信息,这里包括一条语句中的所有错误信息,用换行符分隔,但有时候如果某一个错误导致不能继续分析了,比如表不存在等问题,在这种情况下,如果语句还有其他错误, 就不能被审核出来了。如果当前语句没有任何错误,则这个列值为NONE。对于执行及备份操作,因为对于一条语句,这样的错误只会有一次,那么执行错误会在执行后面追加:"execute:具体 的执行错误原因",如果是备份出错,则在后面追加"backup:具体的错误原因"。在执行时,有时候还会出现Warning。                                                                                                             |
| SQL           | 用来表示当前检查的是那条SQL语句,这一列存储的值就是这条SQL语句的文本内容。                                                                                                                                                                                                                                                                                                                  |
| affected_rows | 审核时,用来表示当前语句预计影响的行数,这个行数一般是通过EXPLAIN来获取的。在执行时,该列输出的是执行时真实影响的行数。                                                                                                                                                                                                                                                                                           |
| sequence      | 该列与Inception备份功能有关,其实就是与$_$Inception_backup_information$_$表中的列opid_time一一对应,这就为自动化运维平台针对某一条语句做回滚操作找到了入口。                                                                                                                                                                                                                                                  |
| backup_dbname | 该列表示的是当前语句产生的备份信息,存储在备份服务器的那个数据库中。如果是不需要备份的语句,则返回字符串NONE。                                                                                                                                                                                                                                                                                                 |
| excute_time   | 该列表示当前语句的执行时间,单位是秒,精确到小数点后两位。列类型是字符串。如果只是审核而不执行,则该列返回的值为0.                                                                                                                                                                                                                                                                                                |
| SQLSHA1       | 这一列用来存储当前这条语句的一个HASH值,用来标识这个语句是否会使用OSC功能,如果返回信息中有值,则表示这条语句在执行时会使用OSC。                                                                                                                                                                                                                                                                                     |

3.Inception 备份功能

Inception在做DML操作时,具有备份功能。它会将所有当前语句修改的行对应生成回滚语句并备份下来,同时也会将所有操作的任务备份下来,一起存储到一个指定的库中。 3.1 配置项中关于备份主要有4个参数

|----------------------------------|-----------------------------------------------------------------|
| 参数                               | 说明                                                              |
| inception_remote_backup_host     | 指定远程备份MySQL实例的地址。                                               |
| inception_remote_backup_port     | 指定远程备份MySQL实例的端口。                                               |
| inception_remote_system_user     | 备份时,连接备份MySQL实例时所需的用户名,这个用户需要有相应的权限,一般包括Create、Insert和Select权限。 |
| inception_remote_system_password | 备份时,连接备份库时所需要的用户对于的密码。                                          |

3.2 备份数据库命名规则

因为线上机器有很多,而备份机器只有一台,所以为了防止在备份数据库实例中存在库名冲突的问题,备份机器的库名是将线上机器IP地址的点换成下划线,再加上端口号及库名。

例如: 169_169_167_167_3306_testDB. 3.3 备份库上的表

主要有两类,一种针对线上每一个表生产一个备份表,即与线上的表是一一对应的,表名相同,但是表结构不一样。备份表主要用来存储所有对表修改的回滚语句。

主要有以下3列:

|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
| 列名                 | 说明                                                                                                                                                     |
| id                 | 标识列                                                                                                                                                    |
| rollback_statement | 当某一行被修改后,生成的对应的回滚语句。因为Binlog必须为Row模式,所以,不管是什么语句,产生的回滚语句都是针对被修改的行记录的。 如果一条语句的执行,影响了多行,那么这里就会有多条回滚语句。                                                    |
| opid_time          | 执行SQL语句时获取的一个序列号。序列号由三部分组成:timestamp(int值,是语句执行的时间点)、线上服务器执行时所产生的thread_id及 当前这条语句在所有被执行语句块中的一个序号。序列号在指定的备库中是唯一的。针对同一条语句影响多行的情况、在产生的多行回滚语句中, 该列的值是相同的。 |

还有一类表,其实这个表每个库中只有一个,$$Inception_backup_information$$。该表主要用来记录所有对当前库的操作,它是为该库中所有表服务的,对线上这个库的所有的表的操作,都会被存储在这里面。

|-------------------|---------------------------------------------------------------------------------------------------------------------------|
| 参数                | 说明                                                                                                                        |
| opid_time         | 该列与上面备份表中的列opid_time是一一对应的,因为这个表中的每一行对应的是在线上执行的实际的一条SQL语句。 opid_time从各个备份表中查找这条语句对应的回滚语句,是一对多的关系。                         |
| start_binlog_file | 表示执行这条语句前Binlog所在的位置的文件名。这个值是通过 show master status 获取的,在数据库并发比较高的情况下, 这个值不一定准确。这个值只能是这条语句产生Binlog前面的某个位置。同理。下面三个位置信息也是一样。 |
| start_binlog_pos  | 该列与上面的列对应,表示的是上面指定文件的位置信息。                                                                                                |
| end_binlog_file   | 该列表示的是执行当前语句之后,Binlog所在的文件名。                                                                                              |
| end_binlog_pos    | 该列与上面的列对应,表示执行完成后,Binlog在文件end_binlog_file中的偏移位置。                                                                         |
| sql_statement     | 该列存储的是当前这个被执行的SQL语句。                                                                                                      |
| host              | 表示在线上的哪个数据库实例上执行了该语句。                                                                                                     |
| dbname            | 表示执行当前语句时所处的环境变量,指的是数据库名。                                                                                                 |
| tablename         | 表示当前语句影响的表的表名,通过这个名字对应到备份表名。                                                                                              |
| port              | 与host对应,表示执行时数据库的端口号。                                                                                                     |
| time              | 表示当前语句的执行时间                                                                                                               |
| type              | 表示操作类型,现在只支持INSERT、UPDATE、DDELETE、CREATEDB、CREATETABLE、ALTERTABLE、DROPTABLE等类型。                                           |

3.4线上库表结构与备份库表结构的对应关系如下图:

3.5 通过python脚本验证

测试环境

|-----------|---------------|------|
| 类别        | ServerIP      | Port |
| 线上数据库     | XXX.XXX.XXX.9 | 3306 |
| Inception | XXX.XXX.XXX.8 | 6669 |
| 备份数据库     | XXX.XXX.XXX.9 | 3307 |

测试python脚本

!/usr/bin/python
-*- coding:utf-8 -*-
import MySQLdb
sql='''/*--user=数据库账号;--password=相应密码;--host=XXX.XXX.XXX.9;--execute=1;--port=3306;*/\
    inception_magic_start;\
    use dbtest;\
    CREATE TABLE table_test(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '测试';\
    inception_magic_commit;'''
try:
       conn=MySQLdb.connect(host='XXX.XXX.XXX.8',user='',passwd='',db='',port=6669)
       cur=conn.cursor()
       ret=cur.execute(sql)
       result=cur.fetchall()
       num_fields = len(cur.description)
       field_names = [i[0] for i in cur.description]
       print field_names
       for row in result:
                print row[0], "|",row[1],"|",row[2],"|",row[3],"|",row[4],"|",row[5],"|",row[6],"|",row[7],"|",row[8],"|",row[9],"|",row[10]
       cur.close()
       conn.close()
except MySQLdb.Error as e:
       print "Mysql Error %d: %s" % (e.args[0], e.args[1])

执行结果如下:

去备份库上查看,备份情况如下:

3.6 备份所需的条件

如果在测试的过程中,发现没有实现备份,可以从以下几个方面去检查

(1)线上服务器必须要打开Binlog,在启动时需要设置参数log_bin、log_bin_index等关于Binlog的参数。不然不会备份及生成回滚语句,因为Inception的生成回滚语句是通过解析Binlog来做的。

(2)参数必须binlog_format必须设置为mixed或者row模式。如果是statement模式,则不做备份及回滚语句的生成。可通过语句set global binlog_format=ROW来设置。

(3)将binlog_row_image设置为full ,该配置项默认为 full ,但是如果为了减少binlog的size改成minimal的话,则Inception无法生成回滚语句。

(4)参数server_id必须设置为非0非1,通过语句set global server_id=server_id;来设置,不然在备份时报错。因为在获取Binlog时,需要通过server_id在主库上注册Inception。

(5)被修改表需要有主键:执行时,被影响的表如果没有主键的话,就不会做备份了。这样更简单并且备份时间及数据都会少一点,不然回滚语句的where条件就会将所有列写进去,这样会影响性能且没有太大意义,所以在where条件中,只需要主键即可。

(6)备份相关的四个参数需要设置好,并且对应的用户在备份数据库实例中有足够的权限。 3.7 在进行验证时可能遇到的错误。 1执行 Python验证,报错信息。 ImportError: No module named MySQLdb

解决方案:

yum install MySQL-python

2.有时候执行Python脚本报错:invalid source infomation。

这时候需要去检查Inception连接数据库的参数配置。

4.Inception常见关于审核规范的变量参数

5.Inception统计功能

其数据存储在备份实例上的inception数据库上statistic表中,此库自动生成。

主要字段的说明如下:

|--------------|-----------------------------------------------|
| 列名           | 字段描述                                          |
| deleting     | 包括普通的删除操作及多表删除操作。                             |
| inserting    | 包括单行插入、多行插入及查询插入。                             |
| updating     | 包括普通单表更新及多表的更新。                               |
| renaming     | 指的是ALTER table语句中的rename操作。                   |
| createindex  | 指的是ALTER table语句中的add index操作。                |
| dropindex    | 指的是ALTER table语句中的drop index操作。               |
| alteroption  | 指的是ALTER table语句中的修改表属性的操作,比如存储引擎、自增值及字符集中操作。 |
| alterconvert | 指的是ALTER table语句中修改表字符集的操作。                   |

—–主要内容参考梳理于网络知识和《MySQL运维内参》,此短文仅为学习笔记,在此作者感谢!

原文创作:东山絮柳仔

原文链接:https://www.cnblogs.com/xuliuzai/p/10785142.html

文章列表

更多推荐

更多
  • AWS自动化机器学习-十一、MLSDLC 的持续集成、部署和训练 技术要求,编纂持续集成阶段,管理持续部署阶段,管理持续训练,延伸,构建集成工件,构建测试工件,构建生产工件,自动化持续集成流程,回顾构建阶段,回顾测试阶段,审查部署和维护阶段,回顾应用用户体验,创建新的鲍鱼调查数据,回顾持续训练流程,清
    Apache CN

  • AWS自动化机器学习-六、使用 AWS 步骤函数自动化机器学习过程 技术要求,介绍 AWS 步骤功能,使用 Step 函数 Data Science SDK for CI/CD,建立 CI/CD 渠道资源,创建状态机,解决状态机的复杂性,更新开发环境,创建管道工件库,构建管道应用构件,部署 CI/CD
    Apache CN

  • AWS自动化机器学习-第三部分:优化以源代码为中心的自动化机器学习方法 本节将向您介绍整体 CI/CD 流程的局限性,以及如何将 ML 从业者的角色进一步整合到管道构建流程中。本节还将介绍这种角色集成如何简化自动化过程,并通过向您介绍 AWS Step 函数向您展示一种优化的方法。本节包括以下章节:
    Apache CN

  • AWS自动化机器学习-一、AWS 上的自动化机器学习入门 技术要求,洗钱流程概述,洗钱过程的复杂性,端到端 ML 流程示例,AWS 如何使 ML 开发和部署过程更容易自动化,介绍 ACME 渔业物流,ML 的情况,从数据中获得洞察力,建立正确的模型,训练模型,评估训练好的模型,探索可能的后续步
    Apache CN

  • AWS自动化机器学习-二、使用 SageMaker 自动驾驶器自动化机器学习模型开发 技术要求,介绍 AWS AI 和 ML 前景,SageMaker 自动驾驶器概述,利用 SageMaker 自动驾驶器克服自动化挑战,使用 SageMaker SDK 自动化 ML 实验,SageMaker Studio 入门,准备实验
    Apache CN

  • AWS自动化机器学习-四、机器学习的持续集成和持续交(CI/CD) 四、机器学习的持续集成和持续交CI/CD技术要求,介绍 CI/CD 方法,通过 CI/CD 实现 ML 自动化,在 AWS 上创建 CI/CD 管道,介绍 CI/CD 的 CI 部分,介绍 CI/CD 的 CD 部分,结束循环,采取以部
    Apache CN

  • AWS自动化机器学习-九、使用 Amazon Managed Workflows 为 Apache AirFlow 构建 ML 工作流 技术要求,开发以数据为中心的工作流程,创建合成鲍鱼调查数据,执行以数据为中心的工作流程,构建和单元测试数据 ETL 工件,构建气流 DAG,清理, 在前面的年龄计算器示例中,我们了解了如何通过 ML 从业者和开发人员团队之间的跨职能
    Apache CN

  • AWS自动化机器学习-七、使用 AWS 步骤函数构建 ML 工作流 技术要求,构建状态机工作流,执行集成测试,监控管道进度,设置服务权限,创建 ML 工作流程, 在本章中,我们将从第六章中的 [处继续,使用 AWS 步骤函数自动化机器学习过程。您将从那一章中回忆起,我们正在努力实现的主要目标是简化
    Apache CN

  • AWS自动化机器学习-八、使用 Apache Airflow 实现机器学习过程的自动化 技术要求,介绍阿帕奇气流,介绍亚马逊 MWAA,利用气流处理鲍鱼数据集,配置 MWAA 系统的先决条件,配置 MWAA 环境, 当建立一个 ML 模型时,有一个所有 ML 从业者都知道的基本原则;也就是说,最大似然模型只有在数据被训练时
    Apache CN

  • AWS自动化机器学习-五、自动化 ML 模型的持续部署 技术要求,部署 CI/CD 管道,构建 ML 模型工件,执行自动化 ML 模型部署,整理管道结构,创建 CDK 应用,部署管道应用,查看建模文件,审查申请文件,查看模型服务文件,查看容器构建文件,提交 ML 工件,清理, 在 [第 4
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多