如何查询Oracle中近30分钟及Spring Batch作业修改的表与记录
解决方案
一、定位Spring Batch作业修改的表
- 方案1:开启Spring Batch SQL日志
在应用配置文件(yml/properties)中添加对应持久层框架的日志配置,打印作业执行的所有SQL语句,直接过滤INSERT/UPDATE/DELETE语句即可快速提取修改的表:
运行一次作业后,在日志中搜索DML操作关键词,即可快速汇总所有被修改的表。# MyBatis 配置 logging.level.com.your.project.mapper=DEBUG # JPA/Hibernate 配置 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true # 全局JDBC操作日志(适配所有持久层框架) logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG - 方案2:Oracle会话级审计
运行作业前先确认作业连接Oracle使用的账号,用DBA权限账号开启该账号的DML操作审计:
作业运行完成后,查询审计视图获取修改的表信息:AUDIT INSERT TABLE, UPDATE TABLE, DELETE TABLE BY <作业使用的Oracle用户名> BY ACCESS;
用完后关闭审计避免占用数据库资源:SELECT DISTINCT OBJ_NAME, ACTION_NAME FROM DBA_AUDIT_TRAIL WHERE USERNAME = '<作业使用的Oracle用户名>' AND TIMESTAMP >= SYSDATE - 1/24 -- 按需调整时间范围,此处为最近1小时 AND ACTION_NAME IN ('INSERT','UPDATE','DELETE');NOAUDIT INSERT TABLE, UPDATE TABLE, DELETE TABLE BY <作业使用的Oracle用户名>;
二、查询Oracle最近30分钟内更新的表和记录
2.1 查询所有被更新的表
如果Oracle开启了闪回查询功能(默认开启,默认闪回数据保留15分钟),可以通过以下两种方式查询:
- 低实时性场景(允许10-30分钟延迟):
SELECT DISTINCT TABLE_NAME FROM ALL_TAB_MODIFICATIONS WHERE TIMESTAMP >= SYSDATE - 30/1440 -- 30分钟换算成天:30/(24*60) AND (INSERTS > 0 OR UPDATES > 0 OR DELETES > 0) ORDER BY TABLE_NAME; - 高实时性场景:
SELECT DISTINCT OBJECT_NAME TABLE_NAME, OPERATION FROM V$FLASHBACK_TRANSACTION_QUERY WHERE START_TIMESTAMP >= SYSDATE - 30/1440 AND OPERATION IN ('INSERT','UPDATE','DELETE') AND TABLE_OWNER = '<业务表所属用户名>' ORDER BY TABLE_NAME;
2.2 查询具体被修改的记录
如果需要查看某张表近30分钟修改的具体数据,可直接使用闪回查询对比:
-- 快速筛选出30分钟内新增、修改的记录 SELECT * FROM <表名> MINUS SELECT * FROM <表名> AS OF TIMESTAMP SYSDATE - 30/1440;
如果需要获取修改前后的完整对比,使用关联查询:
SELECT a.* 当前数据, b.* 30分钟前数据 FROM <表名> a LEFT JOIN <表名> AS OF TIMESTAMP SYSDATE - 30/1440 b ON a.主键字段 = b.主键字段 WHERE b.主键字段 IS NULL -- 新增记录 OR a.非主键字段 <> b.非主键字段 -- 修改记录,需遍历所有非主键字段对比 UNION ALL SELECT a.* 当前数据, b.* 30分钟前数据 FROM <表名> AS OF TIMESTAMP SYSDATE - 30/1440 b LEFT JOIN <表名> a ON a.主键字段 = b.主键字段 WHERE a.主键字段 IS NULL; -- 删除记录
注意:如果闪回保留时间不足30分钟,可提前用DBA权限调整参数:ALTER SYSTEM SET UNDO_RETENTION = 3600 SCOPE=BOTH; 调整为保留1小时闪回数据
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

