You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询Oracle中近30分钟及Spring Batch作业修改的表与记录

解决方案

一、定位Spring Batch作业修改的表

  • 方案1:开启Spring Batch SQL日志
    在应用配置文件(yml/properties)中添加对应持久层框架的日志配置,打印作业执行的所有SQL语句,直接过滤INSERT/UPDATE/DELETE语句即可快速提取修改的表:
    # 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
    
    运行一次作业后,在日志中搜索DML操作关键词,即可快速汇总所有被修改的表。
  • 方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:00:03