• 【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可实现数据的删除或归档。

  • 相关阅读:
    Javascript 面向对象编程
    搜狗2013面试题——求页面中所有单词的个数
    jQuery的ready函数需要注意的细节
    js冒泡排序
    jQuery基本框架解析
    数据结构与算法汇总
    唯美的图片网站
    JavaScript中的setInterval用法
    DOCTYPE
    js实现快速排列
  • 原文地址:https://www.cnblogs.com/alen-liu-sz/p/12975535.html
Copyright © 2020-2023  润新知