闪回归档:
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
- 允许添加、删除列
- 不允许删除表所在用户
- 将表归档数据禁用后则可以正常删除