发新话题
打印

为MySQL添加审计功能[转]

为MySQL添加审计功能[转]

MySQL有Slow Log,可以记录下慢语句的查询,但是对于想记录所有的查询,可能还是有困难(general log 无视)。MySQL 5.1的Slow Log可以精确到0.0001(大概是这个),不过这个我没去试,因为我的系统是MySQL 4.0.26的,而且不打算升级。这样的话,只能自食其力,更改源代码了。

我浏览了下源代码,发现其实,现在的问题在于,4.0 MySQL最少只能记录2秒的语句,哪怕你设置为0,默认最少还是1秒(〉1)。

第一步 vi mysqld.cc
找到如下:struct my_option my_long_options[]
这个就是MySQL读取配置文件的结构,默认值也是在这里设置的。找到long_query_time,把倒数第5个值,由1改为0,就是把最小可设置值设为0
至于my_option这个结构的定义在my_getopt.h文件中,我这里贴出来
struct my_option
{
  const char *name;                     /* Name of the option */
  int        id;                        /* unique id or short option */
  const char *comment;                  /* option comment, for autom. --help */
  gptr       *value;                    /* The variable value */
  gptr       *u_max_value;              /* The user def. max variable value */
  const char **str_values;              /* Pointer to possible values */
  ulong     var_type;
  enum get_opt_arg_type arg_type;
  longlong   def_value;                 /* Default value */
  longlong   min_value;                 /* Min allowed value */
  longlong   max_value;                 /* Max allowed value */
  longlong   sub_size;                  /* Subtract this from given value */
  long       block_size;                /* Value should be a mult. of this */
  int        app_type;                  /* To be used by an application */
};


第二步 vi sql_parse.cc 搜索mysql_slow_log
找到如下
  if (!slow_command && !thd->user_time) // do not log 'slow_command' queries
  {
    thd->proc_info="logging slow query";

    if ((ulong) (thd->start_time - thd->time_after_lock) >
        thd->variables.long_query_time ||
        ((thd->lex.select_lex.options &
          (QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED)) &&
         (specialflag & SPECIAL_LONG_LOG_FORMAT)))
    {
      long_query_count++;
      mysql_slow_log.write(thd, thd->query, thd->query_length, start_of_query);
    }
  }
这是记录Slow Log的,将〉号改为>=,这样就能记录0秒的语句了
    if ((ulong) (thd->start_time - thd->time_after_lock) >=

OK,接下去编译MySQL,将MySQL的配置文件中long-query-time设为0,就能记录下所有的SQL,有IP,USER,耗时

这套系统,在我的生产环境中已经用了半年,十分稳定,并没有带来什么特别的影响。当然审计功能消耗磁盘,建议磁盘至少RAID0,看了下5.1的代码,其实也可以这么做。不过5.1已经精确到毫秒了,是否有必要大家看着办吧。

当然这个审计功能十分简单,并不能对指定用户或者IP进行记录,其实大同小异,相信动手能力强的兄弟,定能自己解决。但是这套系统,对于我来说,已经够用了。

广告时间:如果大家喜欢这篇文章的话,也请多多支持本人开发的MySQL客户端,iMySQL-Front,主页 code.google.com/p/imysql-front



作者:qlks      
附件: 您所在的用户组无法下载或查看附件
this message will self-destruct in 5 seconds......
我们的目标--------消灭蛀.....................零回复

TOP

老大的贴要顶      

TOP

好帖一定要顶!      
i love RH5

TOP

发新话题