简介:引子最近打算做一个 MySQL 的数据库运维平台。这里面有一个非常重要的功能就是 SQL 的审核,如果完全靠人工去实现就没必要做成一个平台了。正没头绪如何去实现的时候,google 了一下,看下有没有现成的开源方案。果 ...
|
引子 最近打算做一个 MySQL 的数据库运维平台。这里面有一个非常重要的功能就是 SQL 的审核,如果完全靠人工去实现就没必要做成一个平台了。正没头绪如何去实现的时候,google 了一下,看下有没有现成的开源方案。果不其然,github 上发现一个『去哪儿网』开源的一个数据库运维工具 Inception, 它是一个集审核、执行、备份及生成回滚语句于一身的 MySQL 自动化运维工具。 Inception 介绍 Inception 的架构图如下图所示,简单来说,Inception 就是一个 MySQL 的代理,能够帮助你审核 SQL,执行 SQL,备份 SQL 影响的记录。Inception 是一个 C/S 的软件架构。我们可以通过原生的 MySQL 客户端 去连接,也可以通过远程的接口去连接,目前执行只支持通过C/C++接口、Python接口来对Inception访问。
安装 Inception
安装依赖
编译安装 Inception git clone https://github.com/mysql-inception/inception.git sh inception_build.sh debug [linux] (如果不指定就是linux平台,而如果要指定是Xcode,就后面指定Xcode) 复制代码 可执行文件在 debug/sql/Debug/ 目录下面(不同平台有可能不相同)。启动 Inception 创建一个配置文件 inc.cnf, 里面主要是配置 Inception 启动的端口,SQL 审核的策略,备份数据库的配置等等,更多可参考官方文档。 [inception] general_log=1 general_log_file=inception.log port=6669 # Inception 的监听的端口 socket=/tmp/inc.socket character-set-client-handshake=0 character-set-server=utf8 inception_remote_system_password=root # 备份数据库密码 inception_remote_system_user=wzf1 # 备份数据库用户名 inception_remote_backup_port=3306 # 备份数据库端口 inception_remote_backup_host=127.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=/data/temp inception_osc_chunk_time=0.1 inception_enable_blob_type=1 inception_check_column_default_value=1 复制代码 启动 ./Inception --defaults-file=inc.cnf 复制代码 访问
mysql -uroot -h127.0.0.1 -P6669 复制代码
#!/usr/bin/python #-*-coding: utf-8-*- import MySQLdb sql="/*--user=username;--password=password;--host=127.0.0.1;--execute=1;--port=3306;*/ inception_magic_start; use mysql; CREATE TABLE adaptive_office(id int); inception_magic_commit;" try: conn=MySQLdb.connect(host="127.0.0.1",user="",passwd="",db="",port=9998) 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,e: print "Mysql Error %d: %s" % (e.args[0], e.args[1]) 复制代码 SQL 审核 & 执行 通过 Inception 对语句进行审核时,必须要告诉 Inception 这些语句对应的数据库地址、数据库端口以及 Inception 连接数据库时使用的用户名、密码等信息,而不能简单的只是执行一条 sql 语句,所以必须要通过某种方式将这些信息传达给 Inception。 连接信息放在 /* ... */ 的注释中,真正的 SQL 语句则包括在 inception_magic_start 与 inception_magic_commit:审核 审核的规范见官方文档,有些规范是可配置的,可根据自己公司的规范在 Inception 的配置文件中配置。 执行 注意下,官方说是支持 DDL,DML 语句的,但是并不支持 SELECT 查询。
... inception_magic_start; use mysql; CREATE TABLE adaptive_office(id int); inception_magic_commit; ... 复制代码 返回结果, 可见是每一条 SQL 就会返回一个可执行的结果,errlevel 非 0 时表示执行失败,下面所示中的第二条 SQL 语句 Audit completed(审核完成) 但是不符合建表的规范,更多关于返回结果的说明可见官方文档: "ID", "stage", "errlevel", "stagestatus", "errormessage", "SQL", "Affected_rows", "sequence", "backup_dbname", "execute_time", "sqlsha1" 1 | CHECKED | 0 | Audit completed | None | use inception_test | 0 | "0_0_0" | None | 0 | 2 | CHECKED | 1 | Audit completed | Set engine to innodb for table "adaptive_office". Set charset to one of "utf8mb4" for table "adaptive_office". Set comments for table "adaptive_office". Column "id" in table "adaptive_office" have no comments. Column "id" in table "adaptive_office" is not allowed to been nullable. Set Default value for column "id" in table "adaptive_office" Set a primary key for table "adaptive_office". | CREATE TABLE adaptive_office(id int) | 0 | "0_0_1" | 10_10_1_67_1028_inception_test | 0 | 复制代码 备份功能 前提条件
Inception 在做 DML 操作时具有备份功能(默认开启,可通过在执行 SQL 中注释文件中指定 --disable-remote-backup),它会将所有当前语句修改的行备份下来,存储到一个指定的备份库中, 备份库通过配置 Inception 参数来指定。关于备份数据库的命名方式,备份机器的库名组成是由线上机器的 IP 地址的点换成下划线,再加上端口号,再加上库名三部分,这三部分也是通过下划线连接起来的。例如:我执行 DML 操作的数据库地址是 192.168.1.1, 端口是 3306, 库名是 inceptiondb, 则在备份数据库中表名为: 192_168_1_1_3306_inceptiondb。比如,我有一个 inception_test 库,其中有一张 userinfo 表,就两个字段:
/*--user=root;--password=xxx;--host=1.1.1.1;--execute=1;--port=3306;--sleep=0;--enable-remote-backup;*/ inception_magic_start; use inception_test; insert into userinfo(`username`) values("test"); inception_magic_commit; 复制代码返回的结果如下, 可以看到已经执行成功并且备份成功了: 2 | EXECUTED | 0 | Execute Successfully Backup successfully | None | insert into userinfo(`username`) values("test") | 1 | "1533716166_25519001_1" | 1_1_1_1_3306_inception_test | 0.060 | 复制代码查看下备份数据库中的 1_1_1_1_3306_inception_test 库 userinfo 表的结果, 根据 INSERT 的语句相应地生成了一条 DELETE 语句:DELETE FROM `inception_test`.`userinfo` WHERE id=4; 复制代码 那么,我需要如果正确地找到回滚的语句呢? 可以查看下备份库 1_1_1_1_3306_inception_test 中 userinfo 的表结构:
更多说明,请参考官方文档中的备份功能说明。 最后 有了这么好用的工具,基于这个为基础,我们通过一个 WEB 应用做一个权限审批管理等功能,一个数据库运维平台就可以实现了,真的需要自己去写吗?我有发现了一个基于 Inception 实现的一个数据库运维平台 Yearning。 本文仅代表作者个人观点,不代表巅云官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱2522407257@qq.com。更多相关资讯,请到巅云www.rzxsoft.cn学习互联网营销技术请到巅云建站www.rzxsoft.cn。 |
执行流程图如下:
我通过 Inception 去执行一个 INSERT 一条记录: