Inception的SQL审核分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Inception的SQL审核分析相关的知识,希望对你有一定的参考价值。

Inception的SQL解析过程继承自mysql,只要是MySQL支持的语法,它也能支持。Inception对SQL的审核是在MySQL的词法、语法解析过程中对审核选项进行判断的。

Inception的审核内容可以分为以下几类:

  1. SQL的词法检查,例如检查某个表存不存在,关键字正不正确,字段的长度等等。
  2. SQL的语法检查,例如是否有注释,主键的个数,索引的个数,字段的个数,字段是否有默认值,是否允许自己设置字符集。

Inception中对所有审核配置项的信息可以在mysql命令行下通过执行inception get variables来查看,在代码中,都放置在inception-src\\sql\\sys_vars.cc文件中:

技术分享
static Sys_var_charptr Sys_remote_bak_host(
    "inception_remote_backup_host", "the host of remote backup.",
    READ_ONLY GLOBAL_VAR(remote_backup_host), CMD_LINE(REQUIRED_ARG),
    IN_FS_CHARSET, DEFAULT("localhost"));

static Sys_var_uint Sys_remote_bak_port(
    "inception_remote_backup_port",
    "Port number to use for remote backup.",
    READ_ONLY GLOBAL_VAR(remote_backup_port), CMD_LINE(REQUIRED_ARG),
    VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1));

......................

static Sys_var_charptr Sys_inception_support_charset(
    "inception_support_charset",
    "check charset when create table or alter, set multi charset use comma to concat",
    GLOBAL_VAR(inception_support_charset),
    CMD_LINE(REQUIRED_ARG), IN_FS_CHARSET, DEFAULT("utf8mb4"),
    NO_MUTEX_GUARD, NOT_IN_BINLOG,
    ON_CHECK(check_charset));

static Sys_var_mybool Sys_inception_check_table_comment(
    "inception_check_table_comment",
    "check comment when create table",
    GLOBAL_VAR(inception_check_table_comment),
    CMD_LINE(OPT_ARG), DEFAULT(TRUE));
View Code

对于这些定义的审核参数对应的使用位置,可以从SQL的词法及语法解析后的逻辑层中查看到:

技术分享
  1 int
  2 mysql_check_inception_variables(
  3     THD * thd
  4 )
  5 {
  6     switch(thd->get_stmt_da()->sql_errno())
  7     {
  8     case ER_WITH_INSERT_FIELD:
  9         if (inception_check_insert_field)
 10             return true;
 11         else 
 12             return false;
 13         break;
 14 
 15     case ER_NO_WHERE_CONDITION:
 16         if (inception_check_dml_where)
 17             return true;
 18         else 
 19             return false;
 20         break;
 21 
 22     case ER_WITH_LIMIT_CONDITION:
 23         if (inception_check_dml_limit)
 24             return true;
 25         else 
 26             return false;
 27         break;
 28 
 29     case ER_WITH_ORDERBY_CONDITION:
 30         if (inception_check_dml_orderby)
 31             return true;
 32         else 
 33             return false;
 34         break;
 35 
 36     case ER_SELECT_ONLY_STAR:
 37         if (inception_enable_select_star)
 38             return false;
 39         break;
 40 
 41     case ER_ORDERY_BY_RAND:
 42         if (inception_enable_orderby_rand)
 43             return false;
 44         break;
 45 
 46     case ER_NOT_ALLOWED_NULLABLE:
 47         if (inception_enable_nullable)
 48             return false;
 49         break;
 50 
 51     case ER_FOREIGN_KEY:
 52         if (inception_enable_foreign_key)
 53             return false;
 54         break;
 55 
 56     case ER_USE_TEXT_OR_BLOB:
 57         if (inception_enable_blob_type)
 58             return false;
 59         break;
 60 
 61     case ER_TABLE_MUST_INNODB:
 62         if (inception_enable_not_innodb)
 63             return false;
 64         break;
 65 
 66 
 67     case ER_TABLE_MUST_HAVE_COMMENT:
 68         if (inception_check_table_comment)
 69             return true;
 70         else 
 71             return false;
 72         break;
 73 
 74     case ER_COLUMN_HAVE_NO_COMMENT:
 75         if (inception_check_column_comment)
 76             return true;
 77         else 
 78             return false;
 79         break;
 80 
 81     case ER_TABLE_MUST_HAVE_PK:
 82         if (inception_check_primary_key)
 83             return true;
 84         else 
 85             return false;
 86         break;
 87 
 88     case ER_PARTITION_NOT_ALLOWED:
 89         if (inception_enable_partition_table)
 90             return false;
 91         break;
 92 
 93     case ER_USE_ENUM:
 94     case ER_INVALID_DATA_TYPE:
 95         if (inception_enable_enum_set_bit)
 96             return false;
 97         break;
 98 
 99     case ER_INDEX_NAME_IDX_PREFIX:
100     case ER_INDEX_NAME_UNIQ_PREFIX:
101         if (inception_check_index_prefix)
102             return true;
103         else 
104             return false;
105         break;
106 
107     case ER_AUTOINC_UNSIGNED:
108         if (inception_enable_autoincrement_unsigned)
109             return true;
110         else 
111             return false;
112         break;
113 
114     case ER_INC_INIT_ERR:
115         if (inception_check_autoincrement_init_value)
116             return true;
117         else 
118             return false;
119         break;
120     case ER_INVALID_IDENT:
121         if (inception_check_identifier)
122             return true;
123         else 
124             return false;
125         break;
126 
127     case ER_SET_DATA_TYPE_INT_BIGINT:
128         if (inception_check_autoincrement_datatype)
129             return true;
130         else 
131             return false;
132         break;
133 
134     case ER_TIMESTAMP_DEFAULT:
135         if (inception_check_timestamp_default)
136             return true;
137         else 
138             return false;
139         break;
140 
141     case ER_CHARSET_ON_COLUMN:
142         if (inception_enable_column_charset)
143             return false;
144         break;
145 
146     case ER_IDENT_USE_KEYWORD:
147         if (inception_enable_identifer_keyword)
148             return false;
149         break;
150 
151     case ER_AUTO_INCR_ID_WARNING:
152         if (inception_check_autoincrement_name)
153             return true;
154         else 
155             return false;
156         break;
157 
158     case ER_ALTER_TABLE_ONCE:
159         if (inception_merge_alter_table)
160             return true;
161         else 
162             return false;
163         break;
164 
165     case ER_WITH_DEFAULT_ADD_COLUMN:
166         if (inception_check_column_default_value)
167             return true;
168         else 
169             return false;
170         break;
171 
172     default:
173         return true;
174     }
175 
176     return true;
177 }
View Code

 

Inception对SQL的词法检查有这样一些选项:

 

inception_check_index_prefix 检查索引名称的前缀
inception_max_char_length 检查char类型的最大长度
inception_enable_identifer_keyword 是否允许标识符使用关键字
inception_check_identifier 检查标识符的格式

 Inception对SQL的语法检查的选项:

inception_check_insert_field 检查insert的字段
inception_check_dml_where 检查DML语句是否有where条件
inception_check_dml_limit 检查DML是否有limit语句
inception_check_dml_orderby 检查DML是否有orderby语句
inception_enable_select_star select语句中是否允许有*号
inception_enable_orderby_rand select语句中是否允许有order by
inception_enable_nullable 是否允许有nullable
inception_enable_foreign_key 是否允许外键
inception_max_key_parts 最大的组合主键数量
inception_max_update_rows 一次更新的最大记录数
inception_max_keys 单个表中索引的最大数量
inception_enable_not_innodb 是否允许非InnoDB的表创建
inception_support_charset 在建表或建库时默认支持的字符集
inception_check_table_comment 是否检查表的注释
inception_check_column_comment 是否检查列的注释
inception_check_primary_key 是否检查是否有主键
inception_enable_partition_table 是否支持分区表
inception_enable_blob_type 是否支持blob类型
inception_enable_enum_set_bit 是否支持enmu,set,bit类型
inception_enable_autoincrement_unsigned 是否支持无符号的自增类型字段
inception_check_autoincrement_init_value 是否检查自增类型字段的初始值
inception_check_autoincrement_datatype 是否检查自增类型字段的数据类型
inception_check_timestamp_default 是否检查timestamp的默认值
inception_enable_column_charset 是否允许指定列的字符集
inception_check_autoincrement_name 是否检查自增列的名称
inception_check_column_default_value 是否检查列的默认值

Inception的其他一些控制配置项:

inception_merge_alter_table 将对同一张表的多个alter table操作合并为一个alter操作
inception_enable_sql_statistic 是否开启统计功能
inception_osc_bin_dir 指定osc的目录
inception_osc_print_sql 指定ocs时是否输出sql语句
inception_osc_print_none  
inception_read_only 指定Inception不能修改线上库的任何数据
inception_ddl_support 指定是否允许Inception进行线上的ddl操作
inception_osc_on 指定是否允许使用ocs功能

 

Inception的审核是在逻辑层进行的,相当于原来的MySQL中生成物理执行计划的层面,在该层面上,所有的审核项都是先进行收集,然后再由统一的函数来对它们的开关打开与否进行判断,如果选项是打开的,则在判断函数来进行汇总,没有打开就忽略收集到的该审核项的信息。

 

以上是关于Inception的SQL审核分析的主要内容,如果未能解决你的问题,请参考以下文章

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

Yearning和inception搭建MySQL审核平台

See自动化SQL审核 SQL优化管理平台

关于Inception默认配置的一个坑

MySQL自动化运维平台建设

基于Inception做二次web审核界面开发