Oracle In-Database Archiving演示

在Oracle LiveSQL中的演示见这里

本文用的是Oracle By Examples的示例

概述

数据库内归档是12c特性。

本教程展示了如何使用数据库内归档将所有行存储在数据库中,但对应用程序隐藏特定行。实验约15分钟。

数据库内归档使您能够通过将表中的行标记为不可见来归档这些行。 这些不可见的行在数据库中并使用压缩是自动的吗?)进行了优化,但对应用程序不可见。 如果需要,可通过设置会话参数将这些行中的数据用于合规性目的。

通过数据库内归档,您可以在单个数据库中存储更多数据更长时间,而不会影响应用程序性能。 可以压缩存档数据以帮助提高备份性能,并且可以在应用程序升级期间推迟对存档数据的更新以提高升级性能。

要管理表的数据库内归档,必须为表启用 ROW ARCHIVAL,操作表的 ORA_ARCHIVE_STATE 隐藏列,并为 ROW ARCHIVAL VISIBILITY 会话参数指定 ACTIVE 或 ALL。

创建表并启用行归档

connect hr/****@orclpdb1;

create table emp_arch
as select employee_id, first_name from employees where rownum <= 4;

alter table emp_arch row archival;

-- 不显示隐藏列
desc emp_arch;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPLOYEE_ID                                        NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)

-- 显示隐藏列
col ORA_ARCHIVE_STATE for a10
select employee_id, first_name, ora_archive_state from emp_arch;

EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0
        102 Lex                  0
        103 Alexander            0

select * from emp_arch;
EMPLOYEE_ID FIRST_NAME
----------- --------------------
        100 Steven
        101 Neena
        102 Lex
        103 Alexander

为某些行设置归档状态

-- 修改归档状态,直接修改为'1'也可以
update emp_arch
set ora_archive_state=dbms_ilm.archivestatename(1)
where employee_id in (102, 103);

commit;

-- 看不到已归档的行
select employee_id, first_name, ora_archive_state from emp_arch;
EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0

归档行显示的会话设置

-- 看到所有行
alter session set row archival visibility = all;

select employee_id, first_name, ora_archive_state from emp_arch;
EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0
        102 Lex                  1
        103 Alexander            1

-- 看到未归档的行
alter session set row archival visibility = active;

select employee_id, first_name, ora_archive_state from emp_arch;

EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0

确定拷贝归档行的表不会拷贝归档状态

注意,虽然不会拷贝归档状态虚拟列,但会话设置会影响拷贝的行数。

-- all会拷贝所有行,而active只会拷贝可见(非归档)的行
alter session set row archival visibility = all;
create table emp_arch_copy as select * from emp_arch;

select employee_id, first_name, ora_archive_state from emp_arch_copy;
select employee_id, first_name, ora_archive_state from emp_arch_copy
                                *
ERROR at line 1:
ORA-00904: "ORA_ARCHIVE_STATE": invalid identifier

select employee_id, first_name from emp_arch_copy;
EMPLOYEE_ID FIRST_NAME
----------- --------------------
        100 Steven
        101 Neena
        102 Lex
        103 Alexander


alter table emp_arch_copy row archival;
select employee_id, first_name, ora_archive_state from emp_arch_copy;
EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0
        102 Lex                  0
        103 Alexander            0

update emp_arch_copy
set ora_archive_state=dbms_ilm.archivestatename(1)
where employee_id in (102, 103);

commit;

select employee_id, first_name, ora_archive_state from emp_arch_copy;

EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0
        102 Lex                  1
        103 Alexander            1

select employee_id, first_name, ora_archive_state from emp_arch;

EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0
        102 Lex                  1
        103 Alexander            1

insert into emp_arch_copy select employee_id, first_name || '_New' from emp_arch;

commit;

select employee_id, first_name, ora_archive_state from emp_arch_copy;

EMPLOYEE_ID FIRST_NAME           ORA_ARCHIV
----------- -------------------- ----------
        100 Steven               0
        101 Neena                0
        102 Lex                  1
        103 Alexander            1
        100 Steven_New           0
        101 Neena_New            0
        102 Lex_New              0
        103 Alexander_New        0

最后一个命令可以看出,归档状态并没有拷贝过来。

重置环境

drop table emp_arch purge;

drop table emp_arch_copy purge;

参考

  • https://oracle-base.com/articles/12c/in-database-archiving-12cr1
  • https://www.youtube.com/watch?v=fvGkKJeQFTs

猜你喜欢

转载自blog.csdn.net/stevensxiao/article/details/128598075
今日推荐