Oracle DB 12 实时监听全量数据库变更定位软件操作对应更新表列方法问询
针对Oracle数据库操作变更追踪的可行方案
以下两种方案分别适配不同的权限场景,你可以根据实际情况选择:
方案1:使用Oracle原生审计/追踪能力(最准确,无需修改业务软件,需DBA权限)
- 启用统一审计(Unified Auditing,Oracle 12c及以后版本默认支持)
你可以使用DBA权限账号执行以下命令,仅针对你软件使用的数据库账号开启DML操作审计:
在软件端执行操作后,查询统一审计视图即可拿到所有变更记录,包含操作时间、执行的SQL、关联的表名、操作类型:-- 创建审计策略,仅审计指定业务账号的增删改操作 CREATE AUDIT POLICY track_app_dml ACTIONS INSERT, UPDATE, DELETE, MERGE WHEN 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''<替换为软件连接数据库的用户名>''' EVALUATE PER SESSION; -- 启用审计策略 AUDIT POLICY track_app_dml;
测试完成后请及时关闭并删除审计策略,避免占用不必要的存储资源:SELECT DBUSERNAME, SQL_TEXT, OBJECT_NAME, ACTION_NAME, EVENT_TIMESTAMP FROM UNIFIED_AUDIT_TRAIL WHERE DBUSERNAME = '<替换为软件连接数据库的用户名>' ORDER BY EVENT_TIMESTAMP DESC;NOAUDIT POLICY track_app_dml; DROP AUDIT POLICY track_app_dml; - 如果你需要查看具体字段的变更前后值,可以启用LogMiner分析在线重做日志,能解析到每行记录的字段级变更明细。
方案2:JDBC层面拦截(无需DBA权限,适合开发环境调试)
你使用的21.1.0.0.0版本JDBC驱动完全兼容JDBC 4.2规范,支持SQL执行拦截能力:
- 直接开启驱动自带的调试日志即可打印所有执行的SQL,在JDBC连接配置中添加以下参数即可:
oracle.jdbc.Trace=true oracle.jdbc.level=FINE - 如果你可以修改软件的数据源配置,可以使用JDBC代理工具,所有执行的SQL、绑定参数都会被实时输出,你可以直接定位到操作对应的表和字段变更逻辑。
注意:如果在生产环境执行追踪操作,请提前评估审计/日志功能的性能开销,避免影响正常业务运行,测试完成后及时关闭临时开启的配置。
内容的提问来源于stack exchange,提问作者Henry Hargreaves
相关产品推荐
相关产品推荐

