【12c】新特性:Oracle 12c In-Database Archiving 数据库内归档

通常,在应用程序开发中对表做设计时,不可避免的会对表中的数据做删除处理,如果直接使用硬删除,则不能有效的对已删除的数据进行追踪;如果采用软删除(例如表中增加了删除标记的字段delete_flag),虽然可以对已删除的字段进行追踪,但如果使用未删除的数据时,需要加上delete_flag='N',这种带删除标记的数据对应用来说是可见的,而且占用一定的存储空间。那么,有没有一种更有效的技术,可以让数据的删除或归档更高效呢?

Oracle 12.1.0.1 版本引入了In-Database Archiving(数据库内归档),通过这一新特性,可以将表中的数据行标记为非活动(Inactive)状态来对其进行归档,这些非活动数据行对应用来说不可见的,并且可以通过压缩进行优化。

要管理表的In-Database Archiving(数据库内归档),必须启用表的ROW ARCHIVAL(行归档)并操作表的ORA_ARCHIVE_STATE隐藏列,本篇对In-Database Archiving进行介绍和演示。

1 数据库版本

ALEN@PROD2> select * from v$version;



BANNER CON_ID

-------------------------------------------------------------------------------- ----------

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0

PL/SQL Release 12.1.0.2.0 - Production 0

CORE 12.1.0.2.0 Production 0

TNS for Linux: Version 12.1.0.2.0 - Production 0

NLSRTL Version 12.1.0.2.0 - Production 0

2 启用行归档

ALEN@PROD2> create table alen(id number,name varchar2(200)) row archival;



Table created.

开启行归档后,会在表新增一个隐藏列ORA_ARCHIVE_STATE,该值为0和1,0表示数据是active,1表示数据是inactive的,插入数据时若不指定该列的值,则默认为0。

3 查看表结构

ALEN@PROD2> select column_name,data_type,data_length,column_id,segment_column_id, hidden_column from user_tab_cols where table_name='ALEN';



COLUMN_NAME DATA_TYPE DATA_LENGTH COLUMN_ID SEGMENT_COLUMN_ID HIDDEN_COL

------------------------------ -------------------- ----------- ---------- ----------------- ----------

ORA_ARCHIVE_STATE VARCHAR2 4000 1 YES

ID NUMBER 22 1 2 NO

NAME VARCHAR2 200 2 3 NO

4 创建并查看测试数据

ALEN@PROD2> insert into alen(id,name) values(2,'Lucy');



1 row created.



ALEN@PROD2> commit;



Commit complete.



ALEN@PROD2> select ora_archive_state,id,name from alen;



ORA_ARCHIVE_STATE ID NAME

-------------------- ---------- --------------------

0 1 Alen

0 2 Lucy

5 修改数据使其归档

ALEN@PROD2> update alen set ora_archive_state=2 where id=2;



1 row updated.



ALEN@PROD2> commit;



Commit complete.



ALEN@PROD2> select ora_archive_state,id,name from alen;



ORA_ARCHIVE_STATE ID NAME

-------------------- ---------- --------------------

0 1 Alen

可以看到,将隐藏列置为非0值后,该行记录就不可见了。

6 参数ROW ARCHIVAL VISIBILITY设置

在会话级别设置该参数,可实现对已归档数据行的可见性,该参数有两个值,分别为:

  • ACTIVE:默认值,设置该参数后,执行查询时数据库返回active数据行;
  • ALL:该值该参数后,执行查询时,数据库返回所有数据行;

6.1 设置参数值为ALL

ALEN@PROD2> select ora_archive_state,id,name from alen;



ORA_ARCHIVE_STATE ID NAME

-------------------- ---------- --------------------

0 1 Alen

2 2 Lucy

6.2 设置参数值为ACTIVE

ALEN@PROD2> insert into alen(ora_archive_state,id,name) values(1,3,'Tom');



1 row created.



ALEN@PROD2> commit;



Commit complete.



ALEN@PROD2> alter session set row archival visibility=active;



Session altered.



ALEN@PROD2> select ora_archive_state,id,name from alen;



ORA_ARCHIVE_STATE ID NAME

-------------------- ---------- --------------------

0 1 Alen

7 禁用行归档

ALEN@PROD2> alter table alen no row archival;



Table altered.



ALEN@PROD2> select * from alen;



ID NAME

---------- --------------------

1 Alen

2 Lucy

3 Tom

以上就是Oracle 12c新增特性行归档的使用,通过该特性的隐藏列ora_archive_state可实现数据的删除或归档。

猜你喜欢

转载自blog.csdn.net/Alen_Liu_SZ/article/details/106268792