【备份恢复】 闪回技术之闪回归档

闪回归档
UNDO表空间记录的回滚信息虽然可以提供回闪查询,但时间久了,这些信息会被覆盖掉,其实只要事务一提交,他们就变成可覆盖的对象了,所以经常在做回闪查询时,我们会因为找不到undo block而收到1555错误,11G里面引入了Flashback Data Archive ,他用于存储数据的所有改变,时间由你自己设定,消耗的是更多的磁盘空间
闪回数据归档可以只为特定的表服务

1) 创建测试表空间及用户,分配较为基本的角色

SYS@ORA11GR2>create tablespace ts_users datafile '/u01/app/oracle/oradata/ORA11GR2/ts_users.dbf' size 10m;

 

Tablespace created.

 

SYS@ORA11GR2>create user xx identified by oracle default tablespace ts_users;

 

User created.

 

SYS@ORA11GR2>grant connect,resource to xx;

 

Grant succeeded.

 

2) 创建 flashback archive并设置保留策略

SYS@ORA11GR2>create flashback archive fbad_ts_users tablespace ts_users retention 1 day;

 

Flashback archive created.

=================================================================

(创建闪回归档前提,1.开启快速恢复区,即设置快速恢复区的大小及路径。2.设置为归档模式)
1: 创建、删除需要有“flashback archive administer” 系统权限

2:闪回数据归档语法
CREATE FLASHBACK ARCHIVE [DEFAULT] flashback_archive
TABLESPACE tablespace_name
[QUOTA integer {K| M| G| T| P| E}]
RETENTION integer {YEAR | MONTH | DAY};

================================================================================================

 

3) 创建表 t1启用闪回归档数据这个动作需要有“flashback archive” 权限)

SYS@ORA11GR2>conn xx/oracle

Connected.

XX@ORA11GR2>create table t1(x int) flashback archive fbad_ts_users;

create table t1(x int) flashback archive fbad_ts_users

*

ERROR at line 1:

ORA-55620: No privilege to use Flashback Archive

 

XX@ORA11GR2>conn / as sysdba

Connected.

SYS@ORA11GR2>

SYS@ORA11GR2>grant flashback archive on fbad_ts_users to xx;

 

Grant succeeded.

 

SYS@ORA11GR2>conn xx/oracle

Connected.


——对新建的表启动闪回归档

XX@ORA11GR2>create table t1(x int) flashback archive fbad_ts_users;

 

Table created.

 

1)  已存在的表启动闪回归档数据,如下

XX@ORA11GR2>create table t2(x int);

 

Table created.

 

XX@ORA11GR2>alter table t2 flashback archive fbad_ts_users;

 

Table altered.

 

2)  查看已启用闪回归档数据的表(其中: ARCHIVE_TABLE_NAME 为记录闪回数据的表,我们无法查看它

SYS@ORA11GR2>select * from dba_flashback_archive_tables;

 

TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NA ARCHIVE_TABLE_NAME   STATUS

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

T1         XX         FBAD_TS_USERS        SYS_FBA_HIST_89859   ENABLED

T2         XX         FBAD_TS_USERS        SYS_FBA_HIST_89860   ENABLED

 

SYS@ORA11GR2>conn xx/oracle

Connected.


XX@ORA11GR2>select * from dba_flashback_archive_tables;

 

TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NA ARCHIVE_TABLE_NAME   STATUS

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

T1         XX         FBAD_TS_USERS        SYS_FBA_HIST_89859   ENABLED

T2         XX         FBAD_TS_USERS        SYS_FBA_HIST_89860   ENABLED

 

3)  禁用闪回归档数据

使用no flashback archive子句可以 disable flashback archive
(注:需要有
“flashback archive administer”系统权限)

 

XX@ORA11GR2>alter table t2 no flashback archive;

alter table t2 no flashback archive

*

ERROR at line 1:

ORA-55620: No privilege to use Flashback Archive

或者回到sys下授权,或者直接在sys下操作;

 

XX@ORA11GR2>conn / as sysdba

Connected.

SYS@ORA11GR2>

SYS@ORA11GR2>alter table xx.t2 no flashback archive;

 

Table altered.

 

验证:用户xx下的t2表已经禁用了闪回归档:

SYS@ORA11GR2>select * from dba_flashback_archive_tables;

 

TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NA ARCHIVE_TABLE_NAME   STATUS

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

T1         XX         FBAD_TS_USERS        SYS_FBA_HIST_89859   ENABLED

 

4)  插入数据:

XX@ORA11GR2>insert into t1 values (1);

 

1 row created.

 

XX@ORA11GR2>insert into t1 values (2);

 

1 row created.

 

XX@ORA11GR2>insert into t1 values (3);

 

1 row created.

 

XX@ORA11GR2>commit;

 

Commit complete.


XX@ORA11GR2>select * from t1;

 

         X

----------

         1

         2

         3


——查询当前scn:

XX@ORA11GR2>select dbms_flashback.get_system_change_number as scn from dual;

select dbms_flashback.get_system_change_number as scn from dual

       *

ERROR at line 1:

ORA-00904: : invalid identifier

xx用户没有查询scn的权限)

 

转到sys用户查询:

XX@ORA11GR2>conn / as sysdba

Connected.

SYS@ORA11GR2>

SYS@ORA11GR2>select dbms_flashback.get_system_change_number as scn from dual;

 

       SCN

----------

   1786408

 

——删除xx用户下的t1表的数据:

SYS@ORA11GR2>delete xx.t1 where x<=2;

 

2 rows deleted.

 

SYS@ORA11GR2>commit;

 

Commit complete.

 

SYS@ORA11GR2>select * from xx.t1;

 

         X

----------

         3

 

——利用闪回归档进行闪回查询:(闪回归档也只是查询先前的数据,而不能直接修复)

SYS@ORA11GR2>select * from xx.t1 as of scn 1786408;

 

         X

----------

         1

         2

         3

 

5)  删除当前 undo 表空间(为了验证前面操作的闪回信息是从闪回归档里来的,而不是从undo表空间

SYS@ORA11GR2>show parameter undo_tablespace

 

NAME                                 TYPE        VALUE

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

undo_tablespace                      string      UNDOTBS2


SYS@ORA11GR2>create undo tablespace undo1 datafile '/u01/app/oracle/oradata/ORA11GR2/undo1.dbf'  size 100m autoextend on next 10m;

 

Tablespace created.

 

SYS@ORA11GR2>alter system set undo_tablespace=undo1;

 

System altered.

 

SYS@ORA11GR2>show parameter undo

 

NAME                                 TYPE        VALUE

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

undo_management                      string      AUTO

undo_retention                       integer     7200

undo_tablespace                      string      UNDO1


SYS@ORA11GR2>drop tablespace undotbs2 including contents and datafiles;

 

Tablespace dropped.

 

6)  再次通过闪回查询查看删除的数据,此次查询出来的数据就是从闪回归档中查询得出:

SYS@ORA11GR2>select * from xx.t1 as of scn 1786408;

 

         X

----------

         1

         2

         3

 

7)  清除归档 FBAD_TS_USERS 5 分钟之前的数据(闪回归档中的数据时可以删除的),再次利用刚才的闪回查询的 SCN,此时我们发现, 结果与表中实际情况相同。

 

SYS@ORA11GR2>alter flashback archive fbad_ts_users purge before timestamp (sysdate-5/1440);

 

Flashback archive altered.

 

SYS@ORA11GR2>

S

SYS@ORA11GR2>select * from xx.t1 as of scn 1786408;

 

         X

----------

         1

         2

         3

 

SYS@ORA11GR2>

结果与实际情况不相同,则需先清空buffer cache里的内存(alter system flush buffer cache

同理:alter system flush shared pool

11) 清除闪回归档 FBAD_TS_USERS 中所有数据

SYS@ORA11GR2>alter flashback archive fbad_ts_users purge all;

 

Flashback archive altered.

 

SYS@ORA11GR2>

 

12) 再次执行闪回查询,因为可以通过 undo 得到指定 SCN 的数据,测试时, undo 数据并未被覆盖
SYS@ORA11GR2>select * from xx.t1 as of scn 1786408;

 

         X

----------

         3

(因为闪回归档里数据清空了,所以不能再对表进行闪回查询了,所以查到的数据只是DML操作commit之后保存的数据;)

 

小结:
- 启用了闪回归档功能的表不允许 drop
- 启用了闪回归档功能的表允许 truncate
- 允许添加、删除列
- 不允许删除表所在用户
- 将表归档数据禁用后则可以正常删除

请使用浏览器的分享功能分享到微信等