zoukankan      html  css  js  c++  java
  • Oracle 12c 新特性之 数据库内归档(In-Database Archiving)

    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/andy
    Connected.
    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(*)
    ----------
          7281
    SQL> 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_column
    FROM user_tab_cols
    WHERE table_name = 'IDA'
    ORDER BY column_id;
    COLUMN_ID COLUMN_NAME DATA_TYPE    DATA_LENGTH HID
    ---------- -------------------- -------------------- ----------- ---
    1 OBJECT_NAME VARCHAR2     128 NO
    2 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 ida
    GROUP BY ora_archive_state
    ORDER BY ora_archive_state;
    ORA_ARCHIVE_STATE      COUNT(*)
    -------------------- ----------
    0   7281

    2.   归档(删除)的行
    并非删除不需要的行,而是把ORA_ARCHIVE_STATE系统隐藏列的值更改为‘1’。这将导致应用看不到这些行。
    SQL>
    UPDATE ida
    SET 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;






  • 相关阅读:
    爬虫防止浏览器防止debug处理
    php
    代码日记
    Linux定时任务
    Linux 三剑客(Awk、Sed、Grep)
    golang中使用ETCD
    golang中使用mysql数据库
    golang中使用Redis
    Linux进阶知识和命令
    Linux核心命令使用方法
  • 原文地址:https://www.cnblogs.com/andy6/p/6832249.html
Copyright © 2011-2022 走看看