mysql下,实现保存指定用户、ip、命令的查询日志
创始人
2024-05-28 13:44:53
0

环境:mysql 8.0.14 社区版

阅读文本需要的背景知识:对数据库的基本概念(触发器、存储过程、事件),mysql下general log的配置指令

背景:因审计需要,对于数据库操作需要留痕。实际访问数据库的有程序及客户端人工,程序化访问会产生大量的垃圾日志。过滤并记录我们指定要的日志,是本文要解决的问题。

调研了解到mysql有多种日志,其中最丰富的是查询日志(general log),其他都不满足要求,但其只有输出到TABLE才有执行sql对应用户的信息。

以下指令都是在mysql库下,用root用户执行。

SET global log_output='TABLE';

设置时间格式与本机一致

set global log_timestamps='SYSTEM';

 开始记录日志

SET global general_log=1;

这时,日志已经写到mysql.general_log表中已经有了日志。

但sql执行量大,该表被认定为系统表,不可附加触发器在他上面(被数据库报错),不能用delete去删除我们不要的数据(被数据库报错,带锁),但是这张表可以truncate。

如果我们不写table,而写入到file又没有我们要的字段。

于是,可以这么做:

1、创建一个自定义表,其结构与系统表相似。

 CREATE TABLE 目标表名 LIKE general_log;

2、将系统表中你要的数据复制到自定义表中。

INSERT INTO 目标表名 (列1,列2,列3,...) SELECT 列1,列2,列3,... 
FROM general_log WHERE 条件;

3、清理系统表,留出空间

truncate table general_log;

4、智能一点,每分钟跑一次

创建一个MySQL事件,用于定时执行(可以将上述几部放到存储过程里)

CREATE EVENT event_nameON SCHEDULE AT EVERY 1 MINITEDOCALL procedure_name();

如果默认没有启动事件,要启用

SET GLOBAL event_scheduler = ON;

对了,完事儿之后,

有/var/lib/mysql/目标表名.csv可以直接拷给审计,哈哈哈哈哈。

最后,

点赞、收藏、关注

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...