• 数据库DDL审计


    一、为什么需要数据库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 ddleventG
    *************************** 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违规事件

    五、欢迎提出宝贵意见

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

    MySQL限时解答,24小时内友哥专业解答
    http://www.yougemysqldba.com
    如有进一步需要请联系微信onesoft007
    微博账号@友哥一指
  • 相关阅读:
    第十三周课程总结
    第十二周总结
    第十一周课程总结
    python 调用c++ dll 动态库
    c++代码覆盖率工具使用
    基于互联网的高校学生工作管理系统--文献随笔(十八)
    中职学生工作管理系统的研究与实现--文献随笔(十七)
    学生工作管理系统的设计与实现--文献随笔(十六)
    山东青年政治学院学生工作管理信息系统的设计与实现--文献随笔(十五)
    四川职业技术学院辅导员工作管理信息系统的设计与开发--文献随笔(十四)
  • 原文地址:https://www.cnblogs.com/youge-OneSQL/p/6209633.html
Copyright © 2020-2023  润新知