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可以直接拷给审计,哈哈哈哈哈。

最后,

点赞、收藏、关注

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...