ORACLE数据库中如何找到过去某个时间某个表被谁修改了

目录

一.问题描述

二.现场环境:

三、Oracle loginer 工具介绍

四、具体分析步骤

4.1. 确定时间 

4.2 确定归档日志文件

4.3.向LogMiner 会话添加 redo 日志文件

4.3.1 添加第一个文件

4.3.2 脚本式添加日志文件

4.3.3 执行添加动作

4.4.启动分析

4.5.创建结果表

4.6.结束分析

4.7.根据情况查找指定的记录:

五、总结一下:


一.问题描述

一张表被修改了,初步估计在2025年11月10日10:10--10:30被修改了,能否帮忙查一下是谁修改的?

类似:
这个字段的值被修改了,我自己没有修改过,帮忙查看一下是谁在哪台机器上修改的?
最近归档日志切换产生太大了,一台都要产生700G,能帮忙分析一下原因吗?

对于这些问题,日常中,可能碰到比较多,有没有办法处理呢?

二.现场环境:


    ORACLE 19C + RAC+ LINUX

当然,对于类似问题,如果有数据库审计系统,可能比较方便查找,但大部分场景下,是没有数据库审计的,那如果没有审计,就不能处理了吗?

答案是肯定的,我们可以利用ORACLE logminer功能来处理。

三、Oracle loginer 工具介绍

Oracle loginer,是Oracle数据库自带的功能,从Oracle 9i后,可以在线分析,步骤相对简单,不需要对数据库做额外设置。如果数据在联机日志文件中,可以直接对REDO LOGFILE进行分析,否则,我们可以针对归档日志进行分析。分析归档日志,如果是很久以前的归档日志,需要从备份中,把归档日志还原出来。然后,在进行分析。这个对归档日志的分析,可以在原主机分析,也可以在其他机器分析。

四、具体分析步骤

下面就这里提到的问题,我们使用 logminer工具来进行分析:

4.1. 确定时间 

  我们这里提到了 11月10日10:10--10:30,那就是业务发生时间在2025年11月10日 10:10-10:30 。

4.2 确定归档日志文件


  由于11月10日,是4天以前的事情了,我们需要确定这个归档日志是否还在磁盘上,否则,需要从备份中还原。
  select thread#,sequence#,name,to_char(first_time,'yyyy-mm-dd hh24:mi:ss')
   from v$archived_log
  where first_time  between to_date('2025-11-10 10:00:00','yyyy-mm-dd hh24:mi:ss') 
                        and to_date('2025-11-10 10:30:00','yyyy-mm-dd hh24:mi:ss')
    and CREATor='ARCH'
  order by 1,2;

     THREAD#  SEQUENCE# NAME                                                                   TO_CHAR(FIRST_TIME,
---------- ---------- ---------------------------------------------------------------------- -------------------
         1     164162 +DATA/HISDB/ARCHIVELOG/2025_11_10/thread_1_seq_164162.12677.1216807805 2025-11-10 10:01:17
         1     164163 +DATA/HISDB/ARCHIVELOG/2025_11_10/thread_1_seq_164163.15814.1216808391 2025-11-10 10:10:05
         1     164164 +DATA/HISDB/ARCHIVELOG/2025_11_10/thread_1_seq_164164.12720.1216809077 2025-11-10 10:19:50
         2     158031 +DATA/HISDB/ARCHIVELOG/2025_11_10/thread_2_seq_158031.12715.1216807881 2025-11-10 10:01:59
         2     158032 +DATA/HISDB/ARCHIVELOG/2025_11_10/thread_2_seq_158032.14602.1216808535 2025-11-10 10:11:20
         2     158033 +DATA/HISDB/ARCHIVELOG/2025_11_10/thread_2_seq_158033.13583.1216809197 2025-11-10 10:22:14

去ASM磁盘组检查一下,这些归档日志是否还在。如果不存在,还需要从备份中还原出来。我们这里,正好还在,就不要从备份中还原。

由于我们这里是ASM,如果你想从ASM磁盘组中取出来,放到其他机器,比如文件系统,还需要通过ASMCMD CP 方式把文件拷出来,我这里本次没有这个需要,可以忽略。

4.3.向LogMiner 会话添加 redo 日志文件


  我们可以使用execute sys.dbms_logmnr.add_logfile()语句添加要分析的归档日志


4.3.1 添加第一个文件

        第一个文件,需要使用 execute sys.dbms_logmnr.add_logfile(归档日志文件,options=>sys.dbms_logmnr.new),

     其他文件,直接
      execute sys.dbms_logmnr.add_logfile(归档日志文件)即可。


4.3.2 脚本式添加日志文件

       这里日志比较少,手工一个个添加即可,但如果归档日志比较多呢(一般要分析的比较少),可以直接生成脚本方式来处理。
  如下:
  select 'execute sys.dbms_logmnr.add_logfile(logfilename=>''' || name || ''''   || decode(rownum,1,',options=>sys.dbms_logmnr.new','') || ');'  as sqlstat
       from v$archived_log
        where first_time between to_date('2025-11-10 10:00:00','yyyy-mm-dd hh24:mi:ss') 
                            and to_date('2025-11-10 10:30:00','yyyy-mm-dd hh24:mi:ss')
       and CREATor='ARCH'
     order by first_time, thread# desc ,sequence#;

  自动产生要分析的归档日志:

  execute sys.dbms_logmnr.add_logfile(logfilename=>'+DATA/HISDB/ARCHIVELOG/2025_11_10/thread_1_seq_164162.12677.1216807805',options=>sys.dbms_logmnr.new);
  execute sys.dbms_logmnr.add_logfile(logfilename=>'+DATA/HISDB/ARCHIVELOG/2025_11_10/thread_2_seq_158031.12715.1216807881');
  execute sys.dbms_logmnr.add_logfile(logfilename=>'+DATA/HISDB/ARCHIVELOG/2025_11_10/thread_1_seq_164163.15814.1216808391');
  execute sys.dbms_logmnr.add_logfile(logfilename=>'+DATA/HISDB/ARCHIVELOG/2025_11_10/thread_2_seq_158032.14602.1216808535');
  execute sys.dbms_logmnr.add_logfile(logfilename=>'+DATA/HISDB/ARCHIVELOG/2025_11_10/thread_1_seq_164164.12720.1216809077');
  execute sys.dbms_logmnr.add_logfile(logfilename=>'+DATA/HISDB/ARCHIVELOG/2025_11_10/thread_2_seq_158033.13583.1216809197');

  执行以上脚本。

  

4.3.3 执行添加动作

 

4.4.启动分析

 execute sys.dbms_logmnr.start_logmnr(options=>sys.dbms_logmnr.DICT_FROM_ONLINE_CATALOG);

4.5.创建结果表


 我们可以直接对 v$logmnr_contents 进行分析,但会占用内存,影响系统。一般我们是对 v$logmnr_contents 创建一个表,后面通过其他工具,比如PLSQL DEVELOPER等图形界面工具慢慢分析。

 create table logmnr_contents_251110  as select * from v$logmnr_contents;

不过,需要注意,如果这个记录比较多,需要考虑一下这个表放到哪个表空间,上面命令默认放到SYSTEM表空间,因此,需要确定SYSTEM表空间剩余空间是否足够。具体步骤略。

4.6.结束分析


 
 exec sys.dbms_logmnr.end_logmnr;


 之后,可以就不影响当前系统。

4.7.根据情况查找指定的记录:


  比如我们这里,想找 谁修改了 PTS.PAI_ADMISSION_NOTICE.
  那么就可以使用下面的语句:
  select SQL_REDO,operation,username,client_info,timestamp 
   from sys.logmnr_contents_251110 
 where seg_owner='PTS' 
   AND SEG_NAME='PAI_ADMISSION_NOTICE'
   and operation='UPDATE'
   order by  timestamp ;

当然,还可以确认一下这个时间段,主要的UPDATE,主要时间段,

数据在手,想怎么分析,看你自己。
至此,我们找到我们想要的结果。

五、总结一下:


   在ORACLE数据中,如果要想查看过去的DML操作,我们直接使用ORACLE原生的LOGMINER工具,直接分析过去的归档日志解决。

<think>首先,用户的问题是:“我想查询Oracle数据库中某个的创建时间 请问Oracle 数据库 查看的创建时间”。这是一个关于如何在Oracle数据库查看特定的创建时间的问题。 根据系统级指令,我需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 在回答中引用的段落末尾自然地添加引用标识。 - 生成相关问题。 - 对于数学达式,使用指定的LaTeX格式,但在这个上下文中,可能没有数学达式,所以可以忽略。 - 独立公式必须使用$$...$$格式并单独成段,但这里可能不需要。 现在,参考提供的引用: - 引用[1]:提到查看Oracle每条记录的创建时间,使用隐含字段ora_rowscn,但这不是的创建时间,而是记录的SCN。 - 引用[2]:关于分区,不直接相关。 - 引用[3]:直接给出查询的创建时间:`select created,last_ddl_time from user_objects where object_name = 'TEST';` - 引用[4]:查看所有的创建时间:`SELECT object_name AS table_name, created FROM dba_objects WHERE object_type = 'TABLE' AND object_name LIKE 'RPTM%' ORDER BY created DESC;` 用户的问题是关于某个特定的创建时间,所以引用[3]最相关:使用`user_objects`视图查询`created`列。 我的回答应该: 1. **结构清晰**:逐步解释如何查询。 2. **使用中文**。 3. **添加引用标识**:在引用内容后添加[^n]。 4. **生成相关问题**:在最后添加§§相关问题§§部分。 关键步骤: - 连接到Oracle数据库。 - 使用SQL查询视图如`user_objects`或`dba_objects`。 - 具体查询:`SELECT created FROM user_objects WHERE object_name = '名' AND object_type = 'TABLE';` - 解释视图:`user_objects`包含当前用户的数据库对象信息,`dba_objects`包含所有对象(需要权限)。 - 提醒用户替换名。 在回答中,自然地引用: - 例如,提到“如引用[3]所示,可以使用`SELECT created FROM user_objects WHERE object_name = '名';`”[^3]。 最终回答结构: - 介绍:简要说明如何查询。 - 步骤:详细步骤。 - 示例:给出SQL示例。 - 注意事项:如权限、视图区别。 - 相关问题:生成3个相关问题。 生成相关问题: 1. 如何查看Oracle数据库的整体创建时间? 2. 如何查看Oracle中记录的创建时间? 3. Oracle数据库对象的DDL时间如何管理? 确保回答真实可靠:基于标准Oracle知识。</think>### 如何查询Oracle数据库中某个的创建时间Oracle数据库中,查看特定的创建时间通常通过查询数据字典视图实现。这些视图存储了数据库对象的元数据信息,包括创建时间(`CREATED`列)。以下是详细步骤和解释,帮助您逐步操作。回答基于Oracle的标准功能和最佳实践,确保可靠性和准确性。 #### 步骤指南 1. **连接到Oracle数据库**: - 使用SQL*Plus、SQL Developer或任何SQL客户端工具登录到您的Oracle数据库实例。 - 确保您具有足够的权限来查询系统视图(如`USER_OBJECTS`或`DBA_OBJECTS`)。普通用户通常可访问`USER_OBJECTS`,而`DBA_OBJECTS`需要DBA权限。 2. **编写SQL查询**: - 核心视图是`USER_OBJECTS`(针对当前用户拥有的对象)或`DBA_OBJECTS`(针对所有对象,需DBA权限)。 - 查询语法: ```sql SELECT created AS "创建时间" FROM user_objects WHERE object_name = '名' -- 替换为您的名,注意大小写敏感 AND object_type = 'TABLE'; ``` - **参数说明**: - `object_name`: 指定名(Oracle默认大写,如果名是小写,需用双引号包裹,如`"my_table"`)。 - `object_type = 'TABLE'`: 确保只查询对象。 - `created`: 列名,示对象的创建时间。 - 如果您想查看所有的创建时间(例如用于批量检查),可以使用`DBA_OBJECTS`视图(需权限): ```sql SELECT object_name AS "名", created AS "创建时间" FROM dba_objects WHERE object_type = 'TABLE' AND owner = '用户名' -- 可选:指定所有者 ORDER BY created DESC; ``` 如引用[4]所示,这可以用于分析的新增情况[^4]。 3. **执行查询**: - 在SQL客户端中运行上述SQL语句。 - 示例输出: ``` 创建时间 ------------------- 2023-10-05 14:30:00 ``` 这的创建时间。 #### 注意事项 - **权限问题**:如果查询`DBA_OBJECTS`时遇到权限不足错误,请联系DBA授予权限,或改用`ALL_OBJECTS`(查看您有权访问的对象)。 - **时间格式**:输出时间基于数据库服务器时区。您可以使用`TO_CHAR(created, 'YYYY-MM-DD HH24:MI:SS')`自定义格式。 - **可靠性说明**:`CREATED`列记录的是对象的初始创建时间。如果被重建或使用`ALTER TABLE`修改,`LAST_DDL_TIME`列会记录最后修改时间(如引用[3]所示)[^3]。但创建时间通常不会变化。 - **常见错误**: - 名错误:确保名正确,Oracle对象名默认大写。如果名包含特殊字符,用双引号包裹。 - 视图限制:`USER_OBJECTS`只显示当前用户的对象。如果属于其他用户,请使用`ALL_OBJECTS`或`DBA_OBJECTS`并添加`owner`条件。 #### 示例 假设您要查询`EMPLOYEES`的创建时间: ```sql SELECT created AS "创建时间" FROM user_objects WHERE object_name = 'EMPLOYEES' AND object_type = 'TABLE'; ``` 如果执行成功,您将看到类似`2024-01-15 09:00:00`的结果。这直接来自Oracle的数据字典,如引用[3]所描述的方法[^3]。 #### 额外提示 - **为什么有效**:Oracle在创建对象时自动在`USER_OBJECTS`等视图中记录时间戳,这是内置的元数据管理机制。 - **备选方法**:如果您需要查看中每条记录的创建时间(而非本身),可以使用隐含字段`ORA_ROWSCN`结合SCN转换(如引用[1]所述),但这适用于行级时间戳,不适用于对象[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值