确认oracle中表被truncate的具体时间
文档课题:确认oracle中表被truncate的具体时间.
数据库:oracle11.2.0.4
1、场景准备
SYS@orcl>创建表leo.tspitr_emp表空间leo_ts作为从 scott.emp 中选择 *;
表已创建。
SYS@orcl10:19:45> 从 v$log 中选择 *;
组# 线程# 序列# 字节块大小成员 弧状态 FIRST_CHANGE# FIRST_TINEXT_CHANGE# NEXT_TIM
-------------------- ---------- ---------- ---------- ---------- --- ----------------------------- -------- ------------ --------
1 1 74 52428800 512 1 是 活跃3234061 09:45:08 3235739 10:19:30
2 1 72 52428800 512 1 是 非活动 3229699 09:19:29 3234056 09:44:59
3 1 73 52428800 512 1 是 非活动 3234056 09:44:59 3234061 09:45:08
11 1 75 52428800 512 2 无电流 323573910:19:30 2.8147E+14
12 1 68 52428800 512 2 是 非活动 3193114 11:27:02 3200620 14:51:46
13 1 69 52428800 512 2 是 非活动 3200620 14:51:46 3206240 17:16:24
14 1 70 52428800 512 2 是 非活动 3206240 17:16:24 3206704 17:29:54
15 1 71 52428800 512 2 是 非活动 3206704 17:29:54 3229699 09:19:29
已选择 8 行。
SYS@orcl10:19:55> 截断表leo.tspitr_emp;
平板电脑运行。
2、截断时间确认2.1、logminer方案
说明:由于测试库redo较少,从v$log判断truncate操作在75号日志中.此处采用logminer找回truncate误操作的具体时间.生产环境恢复时需确认到准确的时间点,以减少数据的丢失.
--确认该时间段的归档日志,其实此处可以直接分析redo日志,并不一定非要分析归档日志.
SYS@orcl10:47:57> 选择序列#,to_char(first_time,'yyyy-mm-dd hh24:mi:ss') asTIME,round(sum(blocks*block_size)/1024/1024) 作为“Size(M)”,NAME fromv$archived_log 其中first_time介于 to_date('2022-12-24 10','yyyy-mm-ddhh24') 和 to_date('2022-12-24 11','yyyy-mm-dd hh24') 和 dest_id=1 组byfirst_time,名称,序列# 顺序为 1 desc;
未选择任何行
SYS@orcl10:56:34> 更改系统切换日志文件;
系统改变。
SYS@orcl10:57:03> A60 的列名称
SYS@orcl10:57:28> 选择序列#,to_char(first_time,'yyyy-mm-dd hh24:mi:ss') asTIME,round(sum(blocks*block_size)/1024/1024) 作为“Size(M)”,NAME fromv$archived_log 其中first_time介于 to_date('2022-12-24 10','yyyy-mm-ddhh24') 和 to_date('2022-12-24 11','yyyy-mm-dd hh24') 和 dest_id=1 组byfirst_time,名称,序列# 顺序乘以 1 位;
序列# 时间大小 (M) 名称
----------------------------- ----------------------------------------------------------------------
75 2022-12-24 10:19:30 1/u01/app/oracle/oradata/archivelog/1_75_1122831323.dbf
--进行归档日志分析.
SYS@orcl10:57:29> executedbms_logmnr.add_logfile('/u01/app/oracle/oradata/archivelog/1_75_1122831323.dbf',dbms_logmnr.new);
PL/SQL过程成功完成。
SYS@orcl11:03:41> execdbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL过程成功完成。
SYS@orcl11:06:57> sql_redo 为 A50
SYS@orcl11:07:12> 从 v$中选择 a.scn,a.timestamp,a.sql_redo logmnr_contents a wheretable_name='TSPITR_EMP' 和操作='DDL' 顺序由 a.scn;
SCN TIMESTAM SQL_REDO
------------------ --------------------------------------------------
3235800 10:20:54 截断tableleo.tspitr_emp;
说明:由此确认到执行truncate的时间为10:20:54.
2.2、dba_objects方案
也可以通过视图dba_objects中的LAST_DDL_TIME字段来确认截断时间,如下所示:
SYS@orcl10:39:07> 从 dba_objectswhere object_name='TSPITR_EMP'中选择所有者,object_name,object_type,to_char(创建,'yyyy-mm-ddhh24:mi:ss'),to_char(last_ddl_time,'yyyy-mm-dd hh24:mi:ss');
所有者OBJECT_NAME OBJECT_TYPE TO_CHAR(已创建),'YYTO_CHAR(LAST_DDL_TI
------------------------- ------------------- ------------------- -------------------
狮子座TSPITR_EMP表 2022-12-24 09:51:32 2022-12-2410:20:54
2.3、跟踪日志
--也可以在trace日志中查看到具体的截断时间.
周六 12月24日 10:20:54 2022
可截断leo.tspitr_emp
相关视图:
dba_tab_modifications中时间戳字段.