在数据库日常使用中,误执行删除语句导致数据丢失的情况时有发生,此时查询被删除的SQL记录是定位问题和恢复数据的关键步骤,而数据库审计日志正是追踪这类操作的核心依据。

什么是数据库审计日志
数据库审计日志是数据库系统自动记录的、包含所有数据库操作行为的日志文件,它会详细记录每一条SQL语句的执行时间、执行用户、操作类型、操作涉及的对象以及操作的结果等信息。当发生数据删除操作时,对应的删除SQL语句和相关上下文信息都会被写入审计日志中,这就为我们后续查询被删除的SQL记录提供了原始数据支撑。
主流数据库开启审计日志的方法
MySQL数据库
MySQL可以通过开启通用查询日志或者二进制日志来记录删除操作,其中二进制日志更适合用于操作追溯和数据恢复。开启二进制日志需要修改MySQL的配置文件my.cnf,添加如下配置:
-- 开启二进制日志,设置日志文件前缀为mysql_bin log_bin=mysql_bin -- 设置日志格式为ROW,可记录每行数据的变化细节 binlog_format=ROW -- 开启后需要重启MySQL服务生效
SQL Server数据库
SQL Server可以通过开启SQL Server审计功能来记录删除操作,具体步骤如下:
- 在SQL Server Management Studio中展开服务器对象,右键点击审计,选择新建审计
- 配置审计的存储路径和文件大小限制,点击确定完成审计创建
- 右键点击新建的审计,选择启用审计
- 创建服务器审计规范,选择需要记录的操作类型,勾选DELETE操作对应的事件
- 启用服务器审计规范即可开始记录删除相关的操作
PostgreSQL数据库
PostgreSQL可以通过修改postgresql.conf配置文件开启审计日志,配置内容如下:
-- 开启所有SQL语句的日志记录 log_statement=all -- 设置日志输出方式为文件,也可以配置为csvlog方便后续解析 log_destination=stderr -- 配置日志文件存储目录 log_directory=log -- 重启PostgreSQL服务生效
从审计日志中查询被删除的SQL记录
MySQL二进制日志解析
MySQL的二进制日志需要通过mysqlbinlog工具进行解析,我们可以通过时间范围或者操作类型筛选删除记录,示例命令如下:
-- 解析指定时间范围内的二进制日志,输出为可读的SQL格式 mysqlbinlog --start-datetime="2024-05-01 00:00:00" --stop-datetime="2024-05-01 12:00:00" /var/lib/mysql/mysql_bin.000001 > delete_log.sql -- 从解析后的文件中筛选包含DELETE关键字的记录 grep -i "DELETE" delete_log.sql
如果二进制日志格式设置为ROW,还可以通过添加-v参数查看被删除的具体行数据内容。
SQL Server审计日志查询
SQL Server的审计日志可以通过系统视图进行查询,筛选删除操作的示例SQL如下:
-- 查询审计日志中的删除操作记录
SELECT
event_time AS 操作时间,
server_principal_name AS 操作用户,
object_name AS 操作表名,
statement AS 执行的SQL语句
FROM sys.fn_get_audit_file('C:audit_log*', DEFAULT, DEFAULT)
WHERE statement LIKE '%DELETE%'
ORDER BY event_time DESC;
PostgreSQL审计日志查询
PostgreSQL的审计日志默认存储在数据目录的log文件夹下,我们可以通过如下命令筛选删除操作记录:
-- 在日志文件中筛选包含DELETE的日志记录 grep -i "DELETE" /usr/local/pgsql/data/log/postgresql-2024-05-01.log
如果需要更结构化的查询,可以配置PostgreSQL将日志输出为csv格式,然后导入到数据库表中进行分析。
注意事项
- 审计日志会占用一定的磁盘空间,需要根据实际业务需求设置日志的保留周期和文件大小限制,避免磁盘被占满
- 审计日志中可能会包含敏感信息,需要做好日志文件的权限控制,避免未授权访问
- 如果删除操作发生后没有开启审计日志,那么无法通过审计日志查询到对应的删除记录,因此建议生产环境提前开启审计功能
- 查询到的删除SQL记录仅能作为追溯依据,不能直接用于数据恢复,数据恢复还需要结合备份文件或者二进制日志的回滚操作实现
数据库审计日志是数据库安全运维的重要组成部分,除了用于查询被删除的SQL记录,还可以用于排查异常操作、合规审计等场景,建议运维人员重视审计日志的配置和管理。