Oracle Database 12c中引入了 In-Database Archiving的新特性, 该特性允许用户通过对表上的数据行标记为inactive不活跃的,以归档数据。 这些inactive的数据行可以通过压缩进一部优化,且对应用来说默认不可见。该特性可以对现有代码做最少改动的情况下,实现了这种“标记删除”的功能和需求。
12c之前:有些应用有“标记删除”的概念,即不是删除数据,而是数据依然保留在表中,只是对应用不可见而已。这种需求通常通过如下方法实现:1) 给相关表增加一个另外的列,该列存储标志数据被删除的标记。2) 给每个语句增加一个谓词,检查被删除行的状态,像:“WHERE deleted = 'N'”,以便排除被删除行。 谓词能被硬编码进SQL语句中,或动态应用类似VPD的安全策略。12c之后:1. 开启数据库内归档ROW ARCHIVAL子句被用来开启数据库内归档。该子句可以用在创建表时用在CREATE TABLE中,也可以在表创建后用在ALTER TABLE中。--创建表并开启数据库内归档特性SQL>grant select on dba_objects to c##andy container=all;SQL> conn c##andy/andyConnected.SQL>create table ida as select object_name,object_id from dba_objects where 1=2;SQL>insert into ida select object_name,object_id from dba_objects order by object_id fetch first 10 percent rows only;7281 rows created.SQL> alter table ida ROW ARCHIVAL; 或者在建表的时候指定 create table (XXX) ROWARCHIVAL;Table altered.--检查表内容SQL>SELECT COUNT(*) FROM ida; COUNT(*)---------- 7281SQL> desc ida; Name Null? Type ----------------------------------------- -------- ---------------------------- OBJECT_NAME VARCHAR2(128) OBJECT_ID NUMBER开启数据库内归档特性将会引起表另外增加一个叫做“ORA_ARCHIVE_STATE”系统隐藏列。SQL>COL column_name FORMAT A20;COL data_type FORMAT A20;SELECT column_id,column_name,data_type,data_length,hidden_columnFROM user_tab_colsWHERE table_name = 'IDA'ORDER BY column_id;COLUMN_ID COLUMN_NAME DATA_TYPE DATA_LENGTH HID---------- -------------------- -------------------- ----------- ---1 OBJECT_NAME VARCHAR2 128 NO2 OBJECT_ID NUMBER 22 NO SYS_NC00003$ RAW 126 YES ORA_ARCHIVE_STATEVARCHAR2 4000 YES默认的,该列的每行被填充为‘0’。SQL>COL ora_archive_state FORMAT A20;SELECT ora_archive_state,COUNT(*)FROM idaGROUP BY ora_archive_stateORDER BY ora_archive_state;ORA_ARCHIVE_STATE COUNT(*)-------------------- ----------0 72812. 归档(删除)的行并非删除不需要的行,而是把ORA_ARCHIVE_STATE系统隐藏列的值更改为‘1’。这将导致应用看不到这些行。SQL>UPDATE idaSET ora_archive_state ='1'WHERE object_id>7000;284 rows updated.SQL>COMMIT;SQL>SELECT COUNT(*) FROM ida; COUNT(*)---------- 6997 > 已经出现隐藏列了3. 显示归档行通过将ROW_ARCHIVAL_VISIBILITY设置为ALL,可以使得这些隐藏行对会话可见。将该参数设置回ACTIVE可以再次使这些行不可见。--使归档的行可见SQL>ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;SQL>SELECT COUNT(*) FROM ida; COUNT(*)----------7281 > 隐藏行对会话可见
--使归档行再次不可见
SQL>ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;SQL>SELECT COUNT(*) FROM ida; COUNT(*)---------- 6997 > 隐藏行对会话不可见--禁用并重新开启数据库内归档特性SQL>ALTER TABLE ida NO ROW ARCHIVAL;SQL>ALTER TABLE ida ROW ARCHIVAL;