暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 归档表数据并在需要时恢复

askTom 2018-08-27
229

问题描述

我们有一个名为DS_AUDIT_ENTRY的表,其中记录了审计日志。它包含多年的数据。
现在,我们只想保留6个月的数据并存档旧数据。另外,如果需要,我们必须在需要时获取旧数据。我如何进行这项活动?

我们尝试的如下:

1.我们在新架构中创建了一个新的空表,名称为 “ds_audit_entry_old1”。
2.将现有表 (ds_audit_entry <> ds_audit_entry_old1) 与上述表交换
3.现在ds_audit_entry_old1填充了最近〜6个月的审核日志
4.存档的ds_audit_entry_old1
5. Ds_audit_entry表现在包含6个月的旧数据

现在,我们希望将表中6个月之前的数据与当前数据一起恢复。
怎么做?
-
表创建:

DS_AUDIT_ENTRY

CREATE TABLE "UCDUSER"."DS_AUDIT_ENTRY" 
   ( "ID" VARCHAR2(36 BYTE) NOT NULL ENABLE, 
 "VERSION" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE, 
 "USER_ID" VARCHAR2(64 BYTE), 
 "USER_NAME" VARCHAR2(255 BYTE), 
 "EVENT_TYPE" VARCHAR2(255 BYTE) NOT NULL ENABLE, 
 "DESCRIPTION" VARCHAR2(255 BYTE), 
 "OBJ_TYPE" VARCHAR2(255 BYTE), 
 "OBJ_NAME" VARCHAR2(255 BYTE), 
 "OBJ_ID" VARCHAR2(255 BYTE), 
 "CREATED_DATE" NUMBER(*,0) NOT NULL ENABLE, 
 "STATUS" VARCHAR2(255 BYTE) NOT NULL ENABLE, 
 "DELETABLE" VARCHAR2(1 BYTE) DEFAULT 'Y', 
 "IP_ADDRESS" VARCHAR2(40 BYTE), 
  PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "UCD_TESTCASE"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "UCD_TESTCASE" ;

DS_AUDIT_ENTRY_OLD1


 CREATE TABLE "ARCIVER"."DS_AUDIT_ENTRY_OLD1" 
   ( "ID" VARCHAR2(36 BYTE) NOT NULL ENABLE, 
 "VERSION" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE, 
 "USER_ID" VARCHAR2(64 BYTE), 
 "USER_NAME" VARCHAR2(255 BYTE), 
 "EVENT_TYPE" VARCHAR2(255 BYTE) NOT NULL ENABLE, 
 "DESCRIPTION" VARCHAR2(255 BYTE), 
 "OBJ_TYPE" VARCHAR2(255 BYTE), 
 "OBJ_NAME" VARCHAR2(255 BYTE), 
 "OBJ_ID" VARCHAR2(255 BYTE), 
 "CREATED_DATE" NUMBER(*,0) NOT NULL ENABLE, 
 "STATUS" VARCHAR2(255 BYTE) NOT NULL ENABLE, 
 "DELETABLE" VARCHAR2(1 BYTE) DEFAULT 'Y', 
 "IP_ADDRESS" VARCHAR2(40 BYTE), 
  PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TEST_ARCHIVAL"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TEST_ARCHIVAL" ;
复制


----------------------------------------------------
交换DS_AUDIT_ENTRY_OLD1中的数据:

插入DS_AUDIT_ENTRY_OLD1
从DS_AUDIT_ENTRY中选择 *;

专家解答

让我们从头开始:

为什么要存档6个月以上的数据?

到底是什么"fetch the old data whenever asked“是吗?

通常归档意味着数据只存在于备份中。所以要得到它,你必须恢复数据库,然后运行查询。如果您很少查询旧数据,并且仅出于合规性原因而需要它,则通常 “足够好”。

如果你经常查询旧的存档行,这个方法是不切实际的。将行转移到存档表是另一种方式 (这是我的猜测,你目前正在做什么)。

通过将两者组合在一起,您可以轻松获得完整的图片:

select * from DS_AUDIT_ENTRY
union all
select * from DS_AUDIT_ENTRY_OLD1
复制


分区也可以在这里提供帮助。这使得将数据从当前表复制到旧表变得容易。并将其从电流中删除,并带有以下内容:

insert into DS_AUDIT_ENTRY_OLD1
  select * from DS_AUDIT_ENTRY partition ( pold );

alter table DS_AUDIT_ENTRY drop partition pold;
复制


当然,通过分区,您可能根本不需要存档旧数据...但是要真正提供帮助,我们需要了解您的目标。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论