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));

对于这些定义的审核参数对应的使用位置,可以从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 }

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中生成物理执行计划的层面,在该层面上,所有的审核项都是先进行收集,然后再由统一的函数来对它们的开关打开与否进行判断,如果选项是打开的,则在判断函数来进行汇总,没有打开就忽略收集到的该审核项的信息。

时间: 2024-12-13 03:14:15

Inception的SQL审核分析的相关文章

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

缘起于上家公司DBA同学的执着意愿,在他们的感染和帮助下开发了这套MySQL上线平台. 平台的核心功能是SQL操作,SQL语句优化.可以做到这些点,得益于开源力量的强大,在此感谢开源项目Inception及SQLAdvisor团队! 1 开源项目简介Inception:一个集审核.执行.备份及生成回滚语句于一身的MySQL自动化运维工具. SQLAdvisor:基于MySQL原生态词法解析,结合分析SQL中的where条件.聚合条件.多表Join关系 给出索引优化建议.关于inception的意

Yearning和inception搭建MySQL审核平台

前言 采用开源Yearning和inception开源软件,搭建用于MYSQL审核及线上MYSQL语句更新的审核平台. 功能说明 Yearning: 基于Vue.js与Django的整套mysql-sql审核平台解决方案.提供基于Inception的SQL检测及执行,为Inception提供可视化. Inception:是集审核.执行.回滚于一体的一个自动化运维系统,它是根据MySQL代码修改过来的,用它可以很明确的,详细的,准确的审核MySQL的SQL语句,它的工作模式和MySQL完全相同,可

mysql sql语句分析

SELECT     a.id    ,b.order_id,b.attr  FROM    tourist_order a     LEFT JOIN order_attr b     ON a.id = b.order_id        AND b.attr='order_status'    WHERE     b.order_id IS NULL    AND a.create_type!=19    AND a.added_time>='2014-01-01'    AND a.si

MS SQL Server分析数据库的I/O性能

系统有的时候响应会明显很慢,有的时候可以是因为访问人数增加导致,有的时候可能因为数据库的磁盘I/O访问次数频繁导致.MS SQL Server提供了一些动态管理视图和函数供我们分析磁盘I/O性能. 1.sys.dm_io_virtual_file_stats SELECT DB_NAME(vfs.database_id) AS database_name , vfs.database_id , vfs.FILE_ID , io_stall_read_ms / NULLIF(num_of_read

[译]SQL Server分析服务的权限配置

简介: 本文介绍如何配置SSAS数据库和cube相关维度的安全设置. 相对数据引擎来说,在Management Studio中配置分析服务的安全设置基本没什么区别.但是也会有一些限制,比如SSAS的权限配置都是围绕角色进行的,其次,角色的成员必须是基于windows或者ad环境的,SQL Server用户(比如sa)是无法使用的.还有,权限是无法直接授予给windows或者ad用户或者组的,这些用户或者组必须填加到角色中才可以.另外,如果UAC处于打开的状态,那么比如要以"Run as Admi

Spark SQL 源代码分析之 In-Memory Columnar Storage 之 in-memory query

/** Spark SQL源代码分析系列文章*/ 前面讲到了Spark SQL In-Memory Columnar Storage的存储结构是基于列存储的. 那么基于以上存储结构,我们查询cache在jvm内的数据又是怎样查询的,本文将揭示查询In-Memory Data的方式. 一.引子 本例使用hive console里查询cache后的src表. select value from src 当我们将src表cache到了内存后,再次查询src,能够通过analyzed运行计划来观察内部调

Spark SQL源代码分析之核心流程

/** Spark SQL源代码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人到了几十人,并且发展速度异常迅猛,究其原因,个人觉得有下面2点: 1.整合:将SQL类型的查询语言整合到 Spark 的核心RDD概念里.这样能够应用于多种任务,流处理,批处理,包含机器学习里都能够引入Sql. 2.效率:由于Shark受到hive的编程模型限制,无法再继续优化来适应Spark模型

SQL Server分析服务的权限配置

 简介: 本文介绍如何配置SSAS数据库和cube相关维度的安全设置. 相对数据引擎来说,在Management Studio中配置分析服务的安全设置基本没什么区别.但是也会有一些限制,比如SSAS的权限配置都是围绕角色进行的,其次,角色的成员必须是基于windows或者ad环境的,SQL Server用户(比如sa)是无法使用的.还有,权限是无法直接授予给windows或者ad用户或者组的,这些用户或者组必须填加到角色中才可以.另外,如果UAC处于打开的状态,那么比如要以"Run as A

Spark SQL 源代码分析之Physical Plan 到 RDD的详细实现

/** Spark SQL源代码分析系列文章*/ 接上一篇文章Spark SQL Catalyst源代码分析之Physical Plan.本文将介绍Physical Plan的toRDD的详细实现细节: 我们都知道一段sql,真正的运行是当你调用它的collect()方法才会运行Spark Job,最后计算得到RDD. lazy val toRdd: RDD[Row] = executedPlan.execute() Spark Plan基本包括4种操作类型,即BasicOperator基本类型