Inception安装测试文档
一、Inception介绍
-
Inception是由去哪儿团队开发的一个集审核、执行、备份及生成回滚语句于一身的MySQL自动化运维工具
- MySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很吃力的,标准越多,DBA越累,开发也越累。那么,在这个都追求自动化运维的时代,审核也必须要跟上步伐,因此Inception诞生了。而Inception可以做的工作远不止是一个自动化审核工具,同时还具备执行,生成对影响数据的回滚语句(类似闪回的功能),这样一条龙服务的工具,将会给DBA的工作带来翻天覆地的变化,DBA从此就从繁重的审核、登上去执行,出错了很难回滚(如果提前没有备份的话)的被动局面解放了出来,突然发现,做DBA原来可以这么轻松,工作可以不饱和了,那就有更多的自由时间学习、进一步向自动化运维平台的实现等更智能化的方向去发展,是具有里程碑意义的。
二、Inception安装
安装环境
- CentOS release 6.5 (Final) 64位
-
4核
- 2G内存
- 安装了MySQL5.7.17
安装前准备
准备好安装包和依赖包
安装步骤
1、解压到安装目录
2、进入安装目录,执行安装脚本
3、编辑配置文件
4、启动服务
5、登录inception测试
输出变量则表明安装成功
常见报错
报错1
解决办法
或手动编译安装
三、Inception测试
测试前准备
创建测试用户inc
创建测试库inception_test
Inception SQL审核测试
1、建表语句
建表语句检查项
-
表属性的检查项
- 这个表不存在
- 对于create table like,会检查like的老表是不是存在。
- 对于create table db.table,会检查db这个数据库是不是存在
- 表名、列名、索引名的长度不大于64个字节
- 如果建立的是临时表,则必须要以tmp为前缀
- 必须要指定建立innodb的存储引擎(可配置)
- 必须要指定utf8的字符集(字符串可配置,指定支持哪些字符集)
- 表必须要有注释(可配置)
- 表不能建立为分区表(可配置)
- 只能有一个自增列
- 索引名字不能是Primay
- 不支持Foreign key(可配置)
- 建表时,如果指定auto_increment的值不为1,报错(可配置)
- 如果自增列的名字不为id,说明有可能是有意义的,MySQL这样使用比较危险,所以报警(可配置)
-
列属性的检查项
- 不能设置列的字符集(可配置)
- 列的类型不能使用集合、枚举、位图类型。(可配置)
- 列必须要有注释(可配置)
- char长度大于20的时候需要改为varchar(长度可配置)
- 列的类型不能是BLOB/TEXT。(可配置)
- 每个列都使用not null(可配置)
- 如果列为BLOB/TEXT类型的,则这个列不能设置为NOT NULL。
- 如何是自增列,则使用无符号类型(可配置)
- 如果自增列,则长度必须要大于等于4个字节(可配置)
- 如果是timestamp类型的,则要必须指定默认值。
- 对于MySQL5.5版本(包含)以下的数据库,不能同时有两个TIMESTAMP类型的列,如果是DATETIME类型,则不能定义成DATETIME DEFAULT CURRENT_TIMESTAMP及ON UPDATE CURRENT_TIMESTAMP等语句。
- 每个列都需要定义默认值,除了自增列、主键列及大字段列之外(可配置)
- 不能有重复的列名
-
索引属性检查项
- 索引必须要有名字
- 不能有外键(可配置)
- Unique索引必须要以uniq_为前缀(可配置)
- 普通索引必须要以idx_为前缀(可配置)
- 索引的列数不能超过5个(数目可以配置)
- 表必须要有一个主键(可配置)
- 最多有5个索引(数目可配置)
- 建索引时,指定的列必须存在。
- 索引中的列,不能重复
- BLOB列不能建做KEY
- 索引长度不能超过766
- 不能有重复的索引,名字及内容
-
默认值检查项
- BLOB/TEXT类型的列,不能有非NULL的默认值
- MySQL5.5以下(含)的版本,对于DATETIME类型的列,不能有函数NOW()的默认值。
- 如果设置默认值为函数,则只能是NOW()。
- 如果默认值为NULL,但列类型为NOT NULL,或者是主键列,或者定义为自增列,则报错。
- 自增列不能设置默认值。
建表语句审核测试
Python脚本testa.py
审核未通过
审核通过
2、插入语句
插入语句检查项
-
表是否存在
-
必须指定插入列表,也就是要对哪几个列指定插入值,如insert into t (id,id2) values(...),(可配置)
-
必须指定值列表,与上面对应的列,插入的值是什么,必须要指定。
-
插入列列表与值列表个数相同,上面二者的个数需要相同,如果没有指定列列表(因为可配置),则值列表长度要与表列数相同。
-
不为null的列,如果插入的值是null,报错(可配置)
-
插入指定的列名对应的列必须是存在的。
-
插入指定的列列表中,同一个列不能出现多次。
-
插入值列表中的简单表达式会做检查,但具体包括什么不一一指定
插入语句审核测试
Python脚本testb.py
审核未通过
审核通过
3、更新、删除语句
更新、删除语句检查项
-
表是否存在
-
必须有where条件(可配置)
-
delete语句不能有limit条件(可配置)
-
不能有order by语句(可配置)
-
影响行数大于10000条,则报警(数目可配置)
-
对WHERE条件这个表达式做简单检查,具体包括什么不一一指定
-
对更新列的值列表表达式做简单检查,具体不一一指定
-
对更新列对象做简单检查,主要检查列是不是存在等
-
多表更新、删除时,每个表必须要存在
更新语句审核测试
Python脚本testc.py
审核通过
删除语句审核测试
Python脚本testd.py
审核通过
4、查询语句
不支持大部分查询语句的优化,不能使用select *语句
查询语句审核测试
Python脚本teste.py
审核未通过
测试中遇到的问题
执行脚本时报错:
解决方法:
找到libmysqlclient.so.20的绝对路径,链接到/usr/lib64目录下(如果是32位的链接到/usr/lib目录下)
注意
配置脚本时,注意如下部分,try中的port为inception客户端的端口号