一、Inception简介
一款用于MySQL语句的审核的开源工具,不但具备自动化审核功能,同时还具备执行、生成对影响数据的回滚语句功能。
基本架构:
二、Inception安装
1、软件下载
下载链接:https://github.com/mysql-inception/inception
文档链接:http://mysql-inception.github.io/inception-document/
2、安装
(1)依赖包安装
inception相关脚本基于python2,所以我门最好安装python2.X版本,本文是通过python2.6操作
yum -y install cmake libncurses5-dev libssl-dev g++ bison openssl-devel.x86_64
(2)编译
[root@node1 ~]# unzip inception-master.zip
[root@node1 ~]# cd inception-master
[root@node1 ~]# sh inception_build.sh install_dir [Xcode]
##输入参数有两个,第一个是软件编译安装目录,第二个是平台代码,Xcode表示Linux平台,不填表示默认Linux平台
mv install_dir /usr/local/inception
ln -s /usr/local/inception/mysql/Inception /usr/bin/inception
(3)inception配置文件
/etc/inc.cnf
[inception]
general_log=1
general_log_file=/usr/local/inception/log/inception.log
port=6669
socket=/usr/local/inception/inc.socket
character-set-client-handshake=0
character-set-server=utf8
inception_remote_system_user=root
inception_remote_system_password=root123
inception_remote_backup_port=3306
inception_remote_backup_host=10.0.0.1
inception_support_charset=utf8mb4
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=/usr/local/inception/data
inception_osc_chunk_time=0.1
inception_enable_blob_type=1
inception_check_column_default_value=1
##特别参数解释
inception_remote_system_user=root ##远程备份数据库用户名
inception_remote_system_password=root123 ##远程备份数据库用户密码
inception_remote_backup_port=3306 ##远程备份数据库端口
inception_remote_backup_host=10.xx.xx.xx ##远程备份数据库IP地址,本次演示例如10.0.0.1
inception_support_charset=utf8mb4,utf8,latin1 ##建表、建库MYSQL支持的字符集类型
##其他配置参考附录
(4)启动
a.启动方式01
inception --defaults-file=/etc/inc.cnf
##最佳启动方式是通过nohup后台启动
nohup inception --defaults-file=/etc/inc.cnf &
b.启动方式02
inception --port=6669
注意: 因为Inception支持OSC执行的功能,是通过调用pt-online-schema-change工具来做的,但如果Inception后台启动(&)的话,可能会导致pt-online-schema-change在执行完成之后,长时间不返回,进而导致Inception卡死的问题,这个问题后面会解决,但现阶段请尽量不要使用后台启动的方式,或者可以使用nohup Inception启动命令 &的方式来启动。
(5)登陆校验
启动成功之后,可以简单试一下看,通过MySQL客户端
mysql -uroot -h127.0.0.1 -P6669
登录上去之后,再执行一个命令:
inception get variables;
输出了所有的变量,恭喜你,已经启动成功了,都说了非常简单。
三、Inception使用
本次业务目标库IP采用10.0.0.2
1、数据库DDL操作
(1)建库
需要指定字符集,不会产生回滚
#!/usr/bin/env python
#--*--coding=utf8--*-- import MySQLdb sql='''/*--user=root;--password=123456;--host=10.0.0.2;--execute=1;--port=3306;*/\
inception_magic_start;\
create database dbtest01 DEFAULT CHARACTER SET utf8mb4;\
inception_magic_commit;'''
try:
conn=MySQLdb.connect(host='127.0.0.1',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])
(2)建表
建表操作检查项如下:
表属性的检查项
这个表不存在
对于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脚本如下
#!/usr/bin/env python
# -*- UTF-8 -*- import MySQLdb sql='''/*--user=root;--password=123456;--host=10.0.0.2;--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='127.0.0.1',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])
执行结果如下:
[root@node1 ~]# python a.py
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | RERUN | 0 | Execute Successfully | None | use dbtest | 0 | '1514535958_11_0' | None | 0.000 |
2 | EXECUTED | 0 | Execute Successfully
Backup successfully | None | CREATE TABLE table_test(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '测试' | 0 | '1514535958_11_1' | 10_129_128_97_3306_dbtest | 0.010 |
检查备份库:(10.0.0.1)
##会增加两个数据库,分别是IP_端口_业务库命名的数据库,用以存放回滚记录、SQL操作日志;库inception,用于存储操作影响行数、时间等
(root:localhost:Fri Dec 29 15:41:46 2017)[(none)]>show databases;
+---------------------------+
| Database |
+---------------------------+
| information_schema |
| 10_0_0_1_3306_dbtest |
| inception |
| mysql |
| performance_schema |
| sys |
+---------------------------+ (root:localhost:Fri Dec 29 15:46:27 2017)[(none)]>show tables from 10_0_0_1_3306_dbtest;
+-------------------------------------+
| Tables_in_10_0_0_1_3306_dbtest |
+-------------------------------------+
| $_$Inception_backup_information$_$ |
| table_test |
+-------------------------------------+
2 rows in set (0.00 sec) (root:localhost:Fri Dec 29 15:47:08 2017)[(none)]>show tables from inception ;
+---------------------+
| Tables_in_inception |
+---------------------+
| statistic |
+---------------------+
1 row in set (0.00 sec) ##10_0_0_1_3306_dbtest库下表$_$Inception_backup_information$_$ 存储内容如下:
##10_0_0_1_3306_dbtest库下表table_test 存储内容如下:
##inception库下表statistic存储内容如下:
id optime usedb deleting inserting updating selecting altertable renaming createindex dropindex addcolumn dropcolumn changecolumn alteroption alterconvert createtable droptable createdb truncating
1 2017/12/29 15:42:37 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
检查目标库:(10.0.0.2)
(3) DROP/TRUNCE
(4)ALTER
修改表操作检查项如下:
表是不是存在
创建索引检查项
同上面创建表中的索引检查项
加列检查项
同上面创建表中的列检查项
修改表检查项
表是不是存在
如果语句块中存在多条对同一个表的修改语句,则建议合并成一个ALTER语句
列是否存在
剩下的同上面创建表,创建索引,创建列,默认值等检查项一样
删除索引检查项
表是不是存在
检查索引是不是存在
修改列的默认值检查项
同默认值检查项
修改表属性
表属性只支持对存储引擎、表注释、自增值及默认字符集的修改操作。
修改存储引擎时检查是不是Innodb(可配置)。
字符集修改检查是不是属于设置参数的值(支持字符集可配置)。
转换表字符集
字符集修改检查是不是属于设置参数的值(支持字符集可配置)。
(5)存储过程
不支持存储过程调用
2、数据库DML操作
a.插入操作
插入语句检查项如下:
表是否存在
必须指定插入列表,也就是要对哪几个列指定插入值,如insert into t (id,id2) values(...),(可配置)
必须指定值列表,与上面对应的列,插入的值是什么,必须要指定。
插入列列表与值列表个数相同,上面二者的个数需要相同,如果没有指定列列表(因为可配置),则值列表长度要与表列数相同。
不为null的列,如果插入的值是null,报错(可配置)
插入指定的列名对应的列必须是存在的。
插入指定的列列表中,同一个列不能出现多次。
插入值列表中的简单表达式会做检查,但具体包括什么不一一指定
b.更新操作
更新操作检查项如下:
表是否存在
必须有where条件(可配置)
delete语句不能有limit条件(可配置)
不能有order by语句(可配置)
影响行数大于10000条,则报警(数目可配置)
对WHERE条件这个表达式做简单检查,具体包括什么不一一指定
对更新列的值列表表达式做简单检查,具体不一一指定
对更新列对象做简单检查,主要检查列是不是存在等
多表更新、删除时,每个表必须要存在
c.删除操作
删除操作检查项如下:
表是否存在
必须有where条件(可配置)
delete语句不能有limit条件(可配置)
不能有order by语句(可配置)
影响行数大于10000条,则报警(数目可配置)
对WHERE条件这个表达式做简单检查,具体包括什么不一一指定
对更新列的值列表表达式做简单检查,具体不一一指定
对更新列对象做简单检查,主要检查列是不是存在等
多表更新、删除时,每个表必须要存在
3、数据库SELECT操作
select操作检查项如下:
对象是否存在(表、列)
是否是select * (默认不允许select * )
4、数据库DCL操作
5、远程变量获取
#!/usr/bin/env python
#--*--coding=utf8--*-- import MySQLdb sql='''/*--user=root;--password=123456;--host=10.129.128.97;--execute=1;--port=3306;*/\
inception_magic_start;\
inception show variables like "read%";
inception_magic_commit;'''
try:
conn=MySQLdb.connect(host='127.0.0.1',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])
6、OSC操作
OSC进度查看:
inception get osc_percent '当前执行的SQL语句以及一些基本信息生成的SHA1哈希值'; 输出内容解释如下:
- TABLENAME:当前被修改的表名;
- DBNAME:当前被修改表所在的库名;
- SQLSHA1:当前要查询的语句的SHA1字符串;
- PERCENT:当前修改已经完成的百分比,这个值是0到100的值。
- REMAINTIME:当前修改语句还需要多久才能完成,如03:55表示还需要三分55秒,01:33:44表示还需要1小时33分44秒。
- INFOMATION:显示当前OSC执行时的状态信息,内容为OSC当前所有的输出信息,不包括百分比信息,百分比还是由上面的列来显示,这个方便在使用时随时查看执行到哪一步了,可以更加清楚的了解到执行进度。
OSC操作终止:(需等触发器建立、完成之后)
inception stop alter '当前执行的SQL语句以及一些基本信息生成的SHA1哈希值' ;
查看所有OSC操作:
inception get osc processlist;
7、查看inception processlist操作
查看processlist
(1:127.0.0.1:Fri Dec 29 21:21:47 2017)[(none)]>inception get processlist;
+----+-----------+-----------+-----------+-----------+---------+----------+------+---------------------------+-----------------+
| Id | Dest_User | Dest_Host | Dest_Port | From_Host | Command | STATE | Time | Info | Current_Execute |
+----+-----------+-----------+-----------+-----------+---------+----------+------+---------------------------+-----------------+
| 20 | | | 0 | localhost | LOCAL | CHECKING | 0 | inception get processlist | NULL |
+----+-----------+-----------+-----------+-----------+---------+----------+------+---------------------------+-----------------+
- id:一个简单的计数。
- dest_user:表示当前执行语句访问数据库时所用的用户名。
- dest_host:表示当前执行语句要访问的数据库地址。
- dest_port:表示当前执行语句要访问的数据库的端口。
- from_host:表示当前执行语句是从机器上发起的。
- command:表示当前执行的是什么操作,包括CHECK(简单审核),EXECUTE(执行),SPLIT(拆分),PRINT(打印计划树),LOCAL(本地命令)。
- state:表示在当前命令下,执行的状态是什么,状态包括INIT(初始阶段),CHECKING(正在审核),EXECUTING(正在执行),DEINIT(退出),BACKUP(正在备份)。
- time:表示当前语句执行所用时间。
- info:显示当前正在执行的语句。
8、结果集解释
ID:用来表示检查的sql序号的,每次检查都是从1开始。
stage:这个列显示当前语句已经进行到哪一步了,包括CHECKED、EXECUTED、RERUN、NONE,NONE表示没有做过任何处理,有可能前面有语法错误直接就提前返回了, CHECKED表示这个语句只做过审核,而没有再进行下一步操作,EXECUTED表示已经执行过,如果执行失败,也是用这个状态表示,RERUN表示的是,对于影响上下文的语句,已经执行成功,但为了与EXECUTED区分,用RERUN表示,主要是因为在执行过程中,如果某一条语句执行失败了,则上层可能需要将没有执行的语句提取出来,再次执行,那么影响上下文的语句是需要加上的,所以用RERUN来表示。影响上下文的语句一般包括set names和use db这两种,而当前Inception支持的只有这两种。
errlevel:返回值为非0的情况下,说明是有错的。1表示警告,不影响执行,2表示严重错误,必须修改。
stagestatus:用来表示检查及执行的过程是成功还是失败,如果审核成功,则返回 Audit completed。如果执行成功则返回Execute Successfully,否则返回Execute failed,如果备份成功,则在后面追加Backup successfully,否则追加Backup failed,这个列的返回信息是为了将结果集直接输出而设置的,如果在具体使用过程中,为了更友好的显示,可以在这基础上再做加工处理。
errormessage:用来表示出错错误信息,这里包括一条语句中所有的错误信息,用换行符分隔,但有时候如果某一个错误导致不能继续分析了,则后面的错误就不能显示出来。如果没有出错,则用显示为None。而对于执行及备份错误,因为对于一条语句,这样的错误只会有一次,那么执行错误会在后面追加“execute:具体的执行错误原因”,如果是备份出错,则在后面追加“backup:具体的备份错误原因”,而在执行时,有时候会出现Warnings,比如插入数据时字符串被截断啥的,此时会输出这些warnings:#1 Execute(Warning, Code errno):warning message,#号后面的数字表示第几个警告,因为有时候执行一个语句会产生多个警告。
SQL:用来表示当前检查的是哪条sql语句。如果某一条sql语句在检查时有语法错误,则这里面会包括从出错语句开始到后面所有的语句,因为语法出错后实在是真的不能再继续分析了,也就不能将后面的每条语句分开了,这个列还会有一个特别的地方,如果当前语句是inception show xxxx命令集中的第一种情况(<<Inception命令集>>中会做具体介绍)。
affected_rows:用来表示当前语句执行时预计影响的行数,在执行时显示的是真实影响行数。
sequence:这个列与上面说的备份功能有关系,其实就是对应$$Inception_backup_information$$表中的 opid_time 这个列,一一对应,这就为前端应用在针对某一操作回滚找到了入口,每次执行都会产生一个序号,如果要回滚,则就使用这个值从备份表中找到对应的回滚语句执行即可。
backup_dbname:这个列表示的是当前语句产生的备份信息,存储在备份服务器的哪个数据库中,这是一个字符串类型的值,只针对需要备份的语句,数据库名由IP地址、端口、源数据库名组成,由下划线连接,而如果是不需要备份的语句,则返回字符串None。
execute_time:这个列表示当前语句执行时间,单位为秒,精确到小数点后两位。列类型为字符串,使用时可能需要转换成DOUBLE类型的值,如果只是审核而不执行,则这个列返回的值为0。
SQLSHA1:这个列用来存储当前这个语句的一个HASH值,这是用来标识这个语句是不是会使用OSC功能,如果返回信息中有值,则表示这个语句在执行的时候会使用OSC,因为在执行前,会有一次单独的审核操作,此时上层已经可以拿到这个值,审核通过之后,语句是不会改变的,当然这个值也不会改变,那么在执行时就可以使用这个值来查看OSC执行的进度等信息,这个值一般长的样子如下:D0210DFF35F0BC0A7C95CD98F5BCD4D9B0CA8154*
四、Inception附录
1、适用场景
a.支持的SQL操作
use db:此时会检查这个库是不是存在,需要连接到线上服务器来判断。
set option:现在只需要支持set names charset,设置其它变量时都报错不支持。
创建数据库语句
插入语句(包括多值插入)
查询插入语句
删除语句(包括多表删除)
更新语句(包括多表更新)
创建表语句
删除表语句
修改表语句
Truncate表语句
inception命令集语句(包括管理命令)
b.线上服务器必须要打开 binlog,在启动时需要设置参数log_bin、log_bin_index等关于 binlog 的参数。不然不会备份及生成回滚语句。
c.参数binlog_format必须要设置为 mixed 或者 row 模式,通过语句: set global binlog_format=mixed/row 来设置,如果是 statement 模式,则不做备份及回滚语句的生成。
d.参数 server_id 必须要设置为非0及非1,通过语句:set global server_id=server_id;来设置,不然在备份时会报错。
e.线上服务器一定要有指定用户名的权限,这个是在语句前面的注释中指定的,做什么操作就要有什么权限,否则还是会报错,如果需要执行的功能,则要有线上执行语句的权限,比如DDL及DML,同时如果要执行inception show 等远程命令的话,有些语句是需要特殊权限的,这些权限也是需要授予的,关于权限这个问题,因为一般Inception是运行在一台固定机器上面的,那么在选项中指定的用户名密码,实际上是Inception机器对线上数据库访问的权限,所以建议在使用过程中,使用专门固定的帐号来让Inception使用,最好是一个只读一个可写的即可,这样在执行时用可写,审核或者查看线上状态或者表库结果时用只读即可,这样更安全。
f.在执行时,不能将 DML 语句及 DDL 语句放在一起执行,否则会因为备份解析binlog时由于表结构的变化出现不可预知的错误,如果要有同时执行 DML 及 DDL,则请分开多个语句块儿来执行,如果真的这样做了,Inception 会报错,不会去执行。
2、优缺点
(1)优点:
a.支持强大的语法分析检查,同时可根据自己需求调整审核、执行操作语句
b.支持审核、回滚、OSC
c.
(2)缺点:
a.只支持MYSQL数据库的审核工作
b.面对很多复杂的子查询、表达式等是不容易检查到的,所以有些就直接忽略了
c.不支持DDL和DML同时存在的SQL操作
d.python2.X配置,MySQLdb安装,OSC安装
f.检查规则固定,结果集固定
3、安装错误
(1)错误示例01
错误日志:
[ 30%] Generating include/probes_mysql_dtrace.h, include/probes_mysql_nodtrace.h
File "/usr/bin/dtrace", line 170
print _("Usage ") + sys.argv[0] + " [--help] [-h | -G] [-C [-I<Path>]] -s File.d [-o <File>]"
^
SyntaxError: invalid syntax
make[2]: *** [include/probes_mysql_dtrace.h] Error 1
make[1]: *** [CMakeFiles/gen_dtrace_header.dir/all] Error 2
make: *** [all] Error 2
解决方案:
yum install dtrace systemtap-sdt-devel -y
(2)错误示例02
错误日志:
[ 61%] Building CXX object libmysql/CMakeFiles/libmysql.dir/libmysql_exports_file.cc.o
make[2]: *** No rule to make target `probes_mysql.o', needed by `libmysql/libmysqlclient.so.18.0.0'. Stop.
make[1]: *** [libmysql/CMakeFiles/libmysql.dir/all] Error 2
make: *** [all] Error 2
解决方案:
删除编译文件,并做相关库文件软链接
ln -s /usr/local/mysql/lib/libperconaserverclient.so.18.1.0 /usr/lib64/libmysqlclient.so.18.0.0
如依旧报错,可做其他类似的软链接到/usr/lib64/下
4、inception支持的参数变量
通过inception get variables;可以查看所有参数变量设置值
通过inception get variables 'variable_name';获取指定参数值
通过inception set variable_name=value;设置参数值
数名字 | 可选参数 | 默认值 | 功能说明 |
---|---|---|---|
inception_check_insert_field | ON/OFF | ON | 是不是要检查插入语句中的列链表的存在性 |
inception_check_dml_where | ON/OFF | ON | 在DML语句中没有WHERE条件时,是不是要报错 |
inception_check_dml_limit | ON/OFF | ON | 在DML语句中使用了LIMIT时,是不是要报错 |
inception_check_dml_orderby | ON/OFF | ON | 在DML语句中使用了Order By时,是不是要报错 |
inception_enable_select_star | ON/OFF | ON | Select*时是不是要报错 |
inception_enable_orderby_rand | ON/OFF | ON | order by rand时是不是报错 |
inception_enable_nullable | ON/OFF | ON | 创建或者新增列时如果列为NULL,是不是报错 |
inception_enable_foreign_key | ON/OFF | ON | 是不是支持外键 |
inception_max_key_parts | 1-64 | 5 | 一个索引中,列的最大个数,超过这个数目则报错 |
inception_max_update_rows | 1-MAX | 10000 | 在一个修改语句中,预计影响的最大行数,超过这个数就报错 |
inception_max_keys | 1-1024 | 16 | 一个表中,最大的索引数目,超过这个数则报错 |
inception_enable_not_innodb | ON/OFF | OFF | 建表指定的存储引擎不为Innodb,不报错 |
inception_support_charset | MySQL支持字符集 | "utf8mb4" | 表示在建表或者建库时支持的字符集,如果需要多个,则用逗号分隔,影响的范围是建表、设置会话字符集、修改表字符集属性等 |
inception_check_table_comment | ON/OFF | ON | 建表时,表没有注释时报错 |
inception_check_column_comment | ON/OFF | ON | 建表时,列没有注释时报错 |
inception_check_primary_key | ON/OFF | On | 建表时,如果没有主键,则报错 |
inception_enable_partition_table | ON/OFF | OFF | 是不是支持分区表 |
inception_enable_enum_set_bit | ON/OFF | OFF | 是不是支持enum,set,bit数据类型 |
inception_check_index_prefix | ON/OFF | ON | 是不是要检查索引名字前缀为"idx_",检查唯一索引前缀是不是"uniq_" |
inception_enable_autoincrement_unsigned | ON/OFF | ON | 自增列是不是要为无符号型 |
inception_max_char_length | 1-MAX | 16 | 当char类型的长度大于这个值时,就提示将其转换为VARCHAR |
inception_check_autoincrement_init_value | ON/OFF | ON | 当建表时自增列的值指定的不为1,则报错 |
inception_check_autoincrement_datatype | ON/OFF | ON | 当建表时自增列的类型不为int或者bigint时报错 |
inception_check_timestamp_default | ON/OFF | ON | 建表时,如果没有为timestamp类型指定默认值,则报错 |
inception_enable_column_charset | ON/OFF | OFF | 允许列自己设置字符集 |
inception_check_autoincrement_name | ON/OFF | ON | 建表时,如果指定的自增列的名字不为ID,则报错,说明是有意义的,给提示 |
inception_merge_alter_table | ON/OFF | ON | 在多个改同一个表的语句出现是,报错,提示合成一个 |
inception_check_column_default_value | ON/OFF | ON | 检查在建表、修改列、新增列时,新的列属性是不是要有默认值 |
inception_enable_blob_type | ON/OFF | ON | 检查是不是支持BLOB字段,包括建表、修改列、新增列操作 |
inception_enable_identifer_keyword | ON/OFF | OFF | 检查在SQL语句中,是不是有标识符被写成MySQL的关键字,默认值为报警。 |
auto_commit | ON/OFF | OFF | 这个参数的作用是为了匹配Python客户端每次自动设置auto_commit=0的,如果取消则会报错,针对Inception本身没有实际意义 |
bind_address | string | * | 这个参数实际上就是MySQL数据库原来的参数,因为Incpetion没有权限验证过程,那么为了实现更安全的访问,可以给Inception服务器的这个参数设置某台机器(Inception上层的应用程序)不地址,这样其它非法程序是不可访问的,那么再加上Inception执行的选项中的用户名密码,对MySQL就更加安全 |
general_log | ON/OFF | ON | 这个参数就是原生的MySQL的参数,用来记录在Inception服务上执行过哪些语句,用来定位一些问题等 |
general_log_file | string | inception.log | 设置general log写入的文件路径 |
inception_user | string | empty | 这个用户名在配置之后,在连接Inception的选项中可以不指定user,这样线上数据库的用户名及密码就可以不暴露了,可以做为临时使用的一种方式,但这个用户现在只能是用来审核,也就是说,即使在选项中指定--enable-execute,也不能执行,这个是只能用来审核的帐号。 |
inception_password | string | empty | 与上面的参数是一对,这个参数对应的是选项中的password,设置这个参数之后,可以在选项中不指定password |
inception_enable_sql_statistic | ON/OFF | ON | 设置是不是支持统计Inception执行过的语句中,各种语句分别占多大比例,如果打开这个参数,则每次执行的情况都会在备份数据库实例中的inception库的statistic表中以一条记录存储这次操作的统计情况,每次操作对应一条记录,这条记录中含有的信息是各种类型的语句执行次数情况,具体的信息需要参考后面一章<<Inception 的统计功能>> |
inception_read_only | ON/OFF | OFF | 设置当前Inception服务器是不是只读的,这是为了防止一些人具有修改权限的帐号时,通过Inception误修改一些数据,如果inception_read_only设置为ON,则即使开了enable-execute,同时又有执行权限,也不会去执行,审核完成即返回 |
inception_check_identifier | ON/OFF | ON | 打开与关闭Inception对SQL语句中各种名字的检查,如果设置为ON,则如果发现名字中存在除数字、字母、下划线之外的字符时,会报Identifier "invalidname" is invalid, valid options: [a-z,A-Z,0-9,_]. |
5、inception支持的选项
主要是在执行sql的时候指定的sql='''/*--user=root;--password=123456;--host=10.0.0.2;--execute=1;--port=3306;*/
参数名字 | 是否需要参数 | 参数是否可选 | 功能描述 |
---|---|---|---|
--host | 是 | 否 | 指定将要执行/审核这部分语句块的数据库地址。 |
--port | 是 | 否 | 指定将要执行这部分语句块的数据库端口。 |
--password | 是 | 否 | 指定Inception连接数据库的密码。 |
--user | 是 | 否 | 指定Inception连接数据库的用户名。 |
--sleep | 是 | 是 | 这个参数用来指定在执行完每一条语句之后,暂停多少毫秒,这样可以适当控制对线上数据库的冲击,特别是针对大量写入的操作,单位为毫秒,最小值为0,也就是不暂停,最大值为100秒,也就是100000毫秒。如果设置得超过100000毫秒,Inception会自动将其设置为100000毫秒。这个参数可以和其它参数一起设置,但是只有在--enable-execute为1的情况下,才起作用。 |
--enable-check | 否 | 否 | 告诉Inception当前要做什么操作,是审核还是执行,这个参数与下面的--enable-execute只能指定一个。 |
--enable-execute | 否 | 否 | 告诉Inception当前要做什么操作,是审核还是执行,这个参数与上面的--enable-check只能指定一个, 如果指定的是这个参数,则Inception在执行前还会做一次实时的审核,那么这个审核和前面指定--enable-check时的审核基本是相同的,因为相同的语句在不同的时间审核产生不同的结果是有可能的(环境有可能变了),所以再做一次审核是有必要的,如果审核发现错误(而不是警告)就不会被执行,当然如果没有指定--enable-ignore-warnings的话,有警告也是不会执行的,但有错误的话,肯定是不会被执行。 |
--enable-force | 否 | 是 | 告诉Inception,当在执行过程中碰到一个错误时,是中止执行还是保存错误信息继续执行下一个语句,这个参数要谨慎使用。 |
--enable-ignore-warnings | 否 | 是 | Inception采取严格的分阶段处理,如果审核有问题则不能执行,那么针对一些特殊问题并且审核有警告不通过,但人工审核没问题确定可以执行时,可以选择这个参数,告诉Inception跳过这个警告的检查,继续执行。 |
--enable-remote-backup | 否 | 是 | 指定在执行时是不是要备份,这个参数默认是打开的,如果不想备份,则指定参数--disable-remote-backup,这个选项所支持的备份,实际上是对当前所执行的操作的备份及被修改数据的回滚语句的存储,关于备份的具体内容,在后面章节中专门介绍。 |
--enable-split | 否 | 是 | 这个参数是用来拆分要执行的语句块的,如果在语句块中存在对同一个表的DDL操作及DML操作,那么在备份及生成回滚语句分析binlog时,由于表结构已经发生改变,会导致inception没法处理,所以使用这个参数将这些语句分成多批,然后再分别执行,这是在执行前必须要做的一个操作,不然可能产生不可预知的错误,当然在执行前的最后一次审核中,如果检查到有这样的混用情况,会报错返回,而不是警告。这个参数指定之后,除了前面四个参数之外,其它参数都被忽略,也可以不指定。 |
--enable-query-print | 否 | 是 | 这个参数用来打印提供SQL语句在被MySQL分析之后的执行树结构,以Json的形式提供,目的是为了可以在Inception的基础上,对已经结构化的(Json)被分析之后的语句做再次分析,比如使用到哪些列、语句类型等信息,目前支持的语句类型有:插入、删除、更新及查询,具体详情请参考<<Inception语法树打印>>一节。 |
6.OSC参数
参数名称 | 作用域 | 默认值 | 说明 |
---|---|---|---|
inception_osc_bin_dir | GLOBAL | 无 | 用于指定pt-online-schema-change脚本的位置,不可修改,在配置文件中设置 |
inception_osc_check_interval | SESSION | 5秒 | 对应参数--check-interval,意义是Sleep time between checks for --max-lag. |
inception_osc_chunk_size | SESSION | 1000 | 对应参数--chunk-size |
inception_osc_chunk_size_limit | SESSION | 4 | 对应参数--chunk-size-limit |
inception_osc_chunk_time | SESSION | 1 | 对应参数--chunk-time |
inception_osc_critical_thread_connected | SESSION | 1000 | 对应参数--critical-load中的thread_connected部分 |
inception_osc_critical_thread_running | SESSION | 80 | 对应参数--critical-load中的thread_running部分 |
inception_osc_drop_new_table | SESSION | 1 | 对应参数--[no]drop-new-table |
inception_osc_drop_old_table | SESSION | 1 | 对应参数--[no]drop-old-table |
inception_osc_check_replication_filters | SESSION | 1 | 对应参数--[no]check-replication-filters |
inception_osc_check_alter | SESSION | 1 | 对应参数--[no]check-alter |
inception_osc_max_lag | SESSION | 3 | 对应参数--max-lag |
inception_osc_max_thread_connected | SESSION | 1000 | 对应参数--max-load中的thread_connected部分 |
inception_osc_max_thread_running | SESSION | 80 | 对应参数--max-load中的thread_running部分 |
inception_osc_recursion_method | SESSION | processlist | 对应OSC参数recursion_method,具体意义可以参考OSC官方手册 |
inception_osc_alter_foreign_keys_method | SESSION | none | 对应OSC参数alter-foreign-keys-method,具体意义可以参考OSC官方手册 |
inception_osc_min_table_size | SESSION | 16 | 这个参数实际上是一个OSC的开关,如果设置为0,则全部ALTER语句都走OSC,如果设置为非0,则当这个表占用空间大小大于这个值时才使用OSC方式。单位为M,这个表大小的计算方式是通过语句: "select (DATA_LENGTH + INDEX_LENGTH)/1024/1024 from information_schema.tables where table_schema = 'dbname' and table_name = 'tablename'"来实现的。 |
inception_osc_on | GLOBAL | 1 | 一个全局的OSC开关,默认是打开的,如果想要关闭则设置为OFF,这样就会直接修改 |
inception_osc_print_sql | GLOBAL | 1 | 对应参数--print |
inception_osc_print_none | GLOBAL | 1 | 用来设置在Inception返回结果集中,对于原来OSC在执行过程的标准输出信息是不是要打印到结果集对应的错误信息列中,如果设置为1,就不打印,如果设置为0,就打印。而如果出现错误了,则都会打印 |