为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......
我们的目标--------消灭蛀.....................零回复