一、为什么需要数据库DDL审计?

DDL在生产系统中扮演非常重要的作用。

1)首先从业务角度来说,DDL可能意味着表结构变更,意味着新的版本即将发布,是个重要的时刻。

2)其次从运维角度来说,DDL尤其是针对大表的DDL,耗时一般在小时级别,且任何不当操作,都有可能造成系统被锁死

3)最后从版本发布角度来看,如果能记录系统表结构变更的历史,对于理解整个系统是大有裨益的

因此针对线上DDL,每个公司都会有相关的规定。比如线上DDL,必须在凌晨1:00到早上5:00之间,防止对业务造成影响;或者做DDL操作前,需要提前备案等。

二、怎么做数据库DDL审计?

目前已知的做MySQL DDL审计的产品有如下几种。

1)Oracle官方提供的收费版audit plugin

2)Percona提供的开源audit plugin

3)Mariadb提供的开源audit plugin

4)安全厂商Macafee提供的开源audit plugin

从功能上来说,Oracle官方版本和Percona版本的audit plugin的审计策略包括

  A)登录

  B)查询

  C)登录、查询

可以看出其并不提供只针对DDL操作的记录,因此并不是一款理想的DDL审计产品。

Mariadb的audit plugin拥有更细粒度的控制,比如只记录DDL。但是当我把server_audit.so安装到Oracle官方版本的MySQL上时,客户端连接数据库报错

mysql -h192.168.15.128 -P3319 -utest -p test
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 0

至于Macafee的audit plugin性能,在超过十个用户并发时,性能会下降到60%左右。(http://www.cnblogs.com/cenalulu/archive/2012/11/12/mysql_audit_plugin_test.html)

上面的链接是一位大众点评DBA在2012年做的测试,时隔四年之后是否有性能提升,还需要做测试。

为了尽快得到一个测试结果,我在虚拟机(2core,2G,50G的SSD)上运行。

测试语句 : select id from tb1;

环境1:无audit plugin

环境2:开启audit plugin,注:默认记录所有行为

环境3:开启audit plugin,但只记录ddl

其QPS分别为:15042 ,5507 , 15000

从测试结果中可以看出,在记录所有行为时,性能会下降60%以上。

另外在使用过程中,我运行

uninstall plugin AUDIT

导致数据库意外重启

报错信息如下。
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (7fa29c0054c0): uninstall plugin AUDIT
Connection ID (thread ID): 2
Status: NOT_KILLED

因此建议大家慎重考虑这款产品的成熟度。

三、基于binary log的解决方案

  binary log记录了数据库的所有数据写入操作和DDL操作。因此可以利用binary log中的信息,去获得系统中所有的DDL。相对于其他方式,有如下优点

  1. 无须侵入数据库内部代码,避免降低数据库稳定性
  2. 对系统性能没有明显影响
  3. 部署方式灵活。既可以与数据库部署在同一台机器上,也可以远程部署在不同机器上。

  基于上述几点,我选择使用binlog方案。在mysqlbinlog代码的基础上,增加过滤DDL事件并插入到目标数据库的功能。其用法为:

./mysqlbinlog --host=192.168.15.128 --port=3319 --user=test --password=test --read-from-remote-server --stop-never --protocol=tcp  --host-target=192.168.15.128 --port-target=3319 --user-target=test --password-target=test --db-target=test  3319.000127

  注意target参数为扩展参数。

执行后,可以从数据库表中看到DDL事件。

 

mysql> select * from ddlevent\G
*************************** 1. row ***************************
query: create table suck9(id int)
executiontime: 1481374445
hostname: 192.168.15.128
port: 3319
endlogpos: 363
logname: 3319.000089
*************************** 2. row ***************************
query: create table suck10(id int)
executiontime: 1481374506
hostname: 192.168.15.128
port: 3319
endlogpos: 529
logname: 3319.000089
*************************** 3. row ***************************
query: create table suck11(id int)
executiontime: 1481374550
hostname: 192.168.15.128
port: 3319
endlogpos: 695
logname: 3319.000089

 

四、youge DDL audit

  为了使DDL audit不是一个DBA专属的玩具,而是一个运维管理人员,甚至公司管理人员都可以使用的产品。我增加了相关界面。

首页为:

点击明细,查看某时间段内,所有server的具体DDL违规事件

五、欢迎提出宝贵意见

首先写这篇文章,是想获得初期的反馈。如果喜欢的人多的话,我会把它再优化一下,并放出来供大家下载使用。

数据库DDL审计的更多相关文章

  1. 数据库DDL语句书写规范

    数据库DDL语句书写规范 1.SQL语句编写说明编写SQL语句应遵循统一的规范,包括大小写.空格.换行.缩进等等,只有完全一样的SQL才能在数据库中共享,从而减少硬解析. 字段类型.长度:根据数据情况 ...

  2. 0818基于360开源数据库流量审计MySQL Sniffer

    开源数据库流量审计MySQL Sniffer 我最推崇的数据库安全产品就是基于流量的数据库审计,因为它不需要更改网络结构,并且也是最关键的是,不影响数据库服务器性能,不用苦口婆心的劝数据库管理员安装监 ...

  3. Oracle 数据库SQL审计

    在我们日常的工作中,一些安全性的要求高的数据库需要增加审计操作,哪个用户什么时间做了什么操作. 1.打开数据库的审计 alter system set audit_sys_operations=TRU ...

  4. oracle表ddl审计

    ============= 表ddl 审计============== 1.table信息 SQL> select * from test; ID CUST_CREDIT_LIMIT TIME ...

  5. 数据库DDL、DML、DCL、DQL、DPL、CCL的全称和使用

    数据库DDL.DML.DCL.DQL.DPL.CCL的全称和使用 简介: SQL (Structure Query Language):结构化查询语言,一种特殊目的的编程语言,一种数据库查询和程序设计 ...

  6. SQLServer 创建服务器和数据库级别审计

    概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...

  7. SQL Server 创建服务器和数据库级别审计

    一.概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 二.常用的审核对象 2.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit ...

  8. 数据库DDL操作

    DDL1. 数据库* 查看所有数据库:SHOW DATABASES* 切换(选择要操作的)数据库:USE 数据库名* 创建数据库:CREATE DATABASE [IF NOT EXISTS] myd ...

  9. 数据库DDL

    自己对数据库的整理,也是对自己知识的梳理 SQL ( Structure query language ) 结构化查询语言 SQL语言分为4个部分 1.DDL(Data Definition Lang ...

随机推荐

  1. url编码

    url编码 情况1:网址路径中包含汉字 打开IE,输入网址”http://zh.wikipedia.org/wiki/春节”.注意,”春节”这两个字此时是网址路径的一部分. 查看HTTP请求的头信息, ...

  2. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  3. FastJson转换自定义枚举类

    在项目中有些状态需要采用枚举类型,在数据库中保存的是name(英文),而前台需要显示的是text(中文). 所以这就需要自己去实现序列. 例如对象: import java.util.Date; im ...

  4. C# Winform中DataGridView绑定后DataGridViewCheckBoxColumn无法显示的问题

    在控件DataGridView绑定数据源后,发现DataGridViewCheckBoxColumn不能显示当前的check值.经过一番努力,现将完整代码奉献出来,仅供参考. 错误代码: /*禁止自动 ...

  5. 如何将util.Date转化为sql.Date

    通过查看API可以很容易知道,util.Date类时sql.Date的父类,所以根据向上转型的原理可以很简单的知道时可行的,不用做转换都可以. 但是如果想要将util.Date转化为sql.Date, ...

  6. Topcoder SRM 683 Div2 B

    贪心的题,从左向右推过去即可 #include <vector> #include <list> #include <map> #include <set&g ...

  7. WebForm基础

    客户端与网页端: C/S(客户端): 两种方式:winform WPF 数据是存在其它的电脑上或服务器上 运行时需要从服务器上下载相应的数据 数据加工的过程是在用户电脑上执行 好处是数据请求速度比较快 ...

  8. kali安装java1.8

    0x01 下载 首先,去官方网站下载JDK1.8对应的版本 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads ...

  9. python 生成器生成杨辉三角

    用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...

  10. -/bin/sh: ./led: not found的解决办法

    环境介绍: 开发板:qq2440 交叉编译器:arm-linux-gcc 3.4.1 内核版本:2.6.13 一.针对该类问题从两个方面入手: 1.从权限出发,权限不够会出现此问题 2.从库文件出发, ...