概览
闪回数据归档是一种历史记录数据存储。Oracle Database 11g通过新的闪回数据归档后台进程FBDA自动跟踪和归档启用了闪回数据归档的表中的数据。使用此功能可满足超过还原保留期的长期保留要求。闪回数据归档可确保闪回查询能够获得对数据库对象版本的SQL 级别访问权限,而不会出现快照太旧的错误。
闪回数据归档由一个或多个表空间(或其中的几部分)组成。您可以拥有多个闪回数据归档。每个闪回数据归档都具有特定的保留持续时间。您应根据保留持续时间的要求创建不同的闪回数据归档,例如,为必须保留一年的所有记录创建一个闪回数据归档,为必须保留两年的所有记录创建另一个闪回数据归档等。
FBDA将异步收集原始数据并将其写入闪回数据归档。它并不包括原始索引,因为检索历史记录信息的模式与检索当前信息的模式可能大不相同。
注:可能需要针对历史记录查询持续时间创建适合的索引。
闪回数据归档比较
闪回数据归档技术与闪回数据库的比较:
• 使用闪回数据归档可以访问任意时间点的数据,而不会实际更改当前数据。这与闪回
数据库相反,闪回数据库会使数据库实际返回到某个时间点。
• 必须启用跟踪才能访问历史记录,而闪回数据库需要预配置。闪回数据库属于脱机操
作,需要资源。闪回数据归档属于联机操作(历史记录访问与当前访问无缝共存)。
由于使用了新的后台进程,所以它对现有的进程几乎没有影响。
• 闪回数据归档在表级别启用,而闪回数据库只能在数据库级别运行。
• 使用闪回数据归档,可以返回到一个表的不同行或多个不同表的多个不同时间点,而
使用闪回数据库则只能返回到特定调用的一个时间点。
闪回数据归档:
体系结构
闪回数据归档后台进程(FBDA) 随数据库启动。
1.FBDA首先对缓冲区高速缓存中的还原数据执行操作。
2.如果还原数据已不在缓冲区高速缓存中,FBDA也可以从还原段读取所需值。
3.FBDA将合并启用了闪回归档的表中的修改行,并将其写入相应的历史记录表,这些表将组成闪回数据归档。
可以通过查询*_FLASHBACK_ARCHIVE_TABLES视图查找历史记录表的内部分配名称。历史记录表是压缩的数据,并已在内部进行了分区。
数据库将在保留期到期后的第一天自动清除所有历史记录信息(删除数据,而不破坏闪回数据归档)。例如,如果保留期为10 天,则会在每10 天后的第一天删除最旧的信息,在归档中仅保留10 天的信息。这是实现数字粉碎的一种方法。
准备数据库
要启用闪回数据归档,执行下列任务:
为数据归档创建一个或多个表空间,并对“归档管理员”授予访问权限和适合的限额。
同时,为归档管理员授予FLASHBACK ARCHIVE ADMINISTER系统权限,允许其执行下列语句:
• CREATE FLASHBACK ARCHIVE
• ALTER FLASHBACK ARCHIVE
• DROP FLASHBACK ARCHIVE
要允许特定用户使用特定闪回数据归档,请为归档用户授予对该闪回数据归档的FLASHBACK ARCHIVE对象权限。这样,归档用户可以使用特定闪回数据归档对表启用闪回归档。
以归档管理员身份执行以下示例:
GRANT FLASHBACK ARCHIVE ON FLA1 TO HR;
用户很有可能会使用其它闪回功能。要允许在查询期间访问特定对象,授予对查询涉及的所有对象的FLASHBACK和SELECT权限。
如果用户需要访问DBMS_FLASHBACK程序包,则需要为他们授予对此程序包的SELECT权限。这样,用户就可以使DBMS_FLASHBACK.ENABLE和DBMS_FLASHBACK.DISABLE过程来启用或禁用闪回数据归档。
配置还原:
– 创建还原表空间(默认设置为:可自动扩展的表空间)
– 启用自动还原管理(11g的默认设置)
– 了解还原的自动优化:
— 固定大小的表空间:可获得最佳保留期的自动优化
— 可自动扩展的还原表空间:可获得运行时间最长的查询的自动优化
– 建议对闪回使用以下设置:固定大小的还原表空间
Oracle Database 11g使用下列默认数据库初始化参数:
• UNDO_MANAGEMENT='AUTO'
• UNDO_TABLESPACE='UNDOTBS1'
• UNDO_RETENTION=900
换句话说,默认情况下启用自动还原管理。可自动扩展的还原表空间基于数据库安装而创建。
• 对于固定大小的还原表空间,Oracle DB 会自动优化系统,以便为还原表空间提供可能的最佳还原保留期。
• 对于可自动扩展的还原表空间(默认),Oracle DB 会保留还原数据,其保留时间至少满足运行时间最长的查询所需的保留期,以及UNDO_RETENTION参数指定的还原保留期阈值。
使用固定大小的还原表空间,自动优化还原保留期通常会产生较好的结果。如果由于此原因或其它原因而希望将还原表空间更改为固定大小,还原指导可帮助您确定要分配的正确固定大小。
如果不能确定空间要求或者无法访问还原指导,请执行以下步骤:
1.以可自动扩展的还原表空间开始。
2.在一个业务循环(例如,1 天或2 天或更长时间)中观察它。
3.使用V$UNDO_STAT视图收集还原块信息,计算空间要求,并使用它们创建大小适合的固定还原表空间(《Oracle 数据库管理员指南》中提供了计算公式)。
4.查询V$UNDOSTAT.TUNED_UNDORETENTION以确定对于当前还原表空间还原数据的保留持续时间。设置UNDO_RETENTION参数并不能保证未到期的还原数据不会被覆盖。如果系统需要较多的空间,Oracle DB 可以用最新生成的还原数据覆盖未到期的还原数据。
- 为还原表空间指定RETENTION GUARANTEE子句,以确保不会丢弃未到期的还原数据。
- 为了满足超过还原保留期的长期保留要求,可创建闪回数据归档。
oracle11g 启动闪回功能
1、创建独立的ASSM(自动段空间管理)表空间。
create tablespace fbda datafile'/oracle/oradata/orcl/FBDA.dbf' size 1000M segment space management auto;
2、在独立的ASSM上创建闪回数据归档区。
create flashback archive fda tablespace fbda retention 1 month;
3、对指定的数据表执行闪回数据归档设置。
alter table t flashback archive fda;
4、取消对于表数据的闪回归档设置
alter table table_name no flashback archive;
1.创建表空间
SQL> create tablespace fbda datafile '/Oradatafile/DBData/FBDA.dbf' size 200M segment space management auto;
Tablespace created.
2.启用闪回数据归档,且设置保留时间
SQL> create flashback archive fda tablespace fbda retention 1 month;
Flashback archive created.
3. 为了测试方便,先将UNDO表空间更改为较小,以使得UNDO数据能够尽快老化
SQL> create undo tablespace UNDOTBS2_SMALL datafile '/Oradatafile/DBData/undotbs02.dbf' size 20m autoextend off;
Tablespace created.
SQL> alter system set undo_tablespace= UNDOTBS2_SMALL;
System altered.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 18000
undo_tablespace string UNDOTBS2_SMALL
4. 接下来使用测试用户连接,对测试表执行闪回归档设置
SQL> create user liusm identified by liusm default tablespace fbda;
User created.
SQL> grant dba to liusm;
Grant succeeded.
SQL> conn liusm/liusm
Connected.
SQL> create table liusm as select * from sys.dba_objects;
Table created.
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
LIUSM
SQL> alter table liusm flashback archive fda;
Table altered.
取消对于数据表的闪回归档可以使用如下命令:
alter table table_name no flashback archive;
5. 接下来记录一下SCN,从数据库表中删除部分数据
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
897074
SQL> select count(*) from liusm;
COUNT(*)
----------
74897
SQL> delete from liusm where rownum < 1001;
1000 rows deleted.
SQL> commit;
Commit complete.
6.现在执行闪回查询,并看执行计划,看数据来源在哪
SQL> select count(*) from liusm as of scn 897074;
COUNT(*)
----------
74897
Execution Plan
----------------------------------------------------------
Plan hash value: 1194651440
--------------------------------------------------------------------------------
--------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%
CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------
--------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1113
(1)| 00:00:14 | | |
| 1 | SORT AGGREGATE | | 1 | |
| | | |
| 2 | VIEW | | 5460 | | 1113
(1)| 00:00:14 | | |
| 3 | UNION-ALL | | | |
| | | |
| 4 | PARTITION RANGE SINGLE| | 1000 | 28000 | 14
(0)| 00:00:01 | 1 | 1 |
|* 5 | TABLE ACCESS FULL | SYS_FBA_HIST_76292 | 1000 | 28000 | 14
(0)| 00:00:01 | 1 | 1 |
|* 6 | FILTER | | | |
| | | |
| 7 | MERGE JOIN OUTER | | 4460 | 8885K| 1098
(1)| 00:00:14 | | |
| 8 | SORT JOIN | | 4460 | 53520 | 1095
(1)| 00:00:14 | | |
|* 9 | TABLE ACCESS FULL | LIUSM | 4460 | 53520 | 1094
(1)| 00:00:14 | | |
|* 10 | SORT JOIN | | 1 | 2028 | 3
(34)| 00:00:01 | | |
|* 11 | TABLE ACCESS FULL | SYS_FBA_TCRV_76292 | 1 | 2028 | 2
(0)| 00:00:01 | | |
--------------------------------------------------------------------------------
--------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("ENDSCN">897074 AND "ENDSCN"<=897353 AND ("STARTSCN" IS NULL OR "S
TARTSCN"<=897074) AND
("OPERATION" IS NULL OR "OPERATION"<>'D'))
6 - filter("STARTSCN"<=897074 OR "STARTSCN" IS NULL)
9 - filter("T"."VERSIONS_STARTSCN" IS NULL)
10 - access("RID"(+)=ROWIDTOCHAR("T".ROWID))
filter("RID"(+)=ROWIDTOCHAR("T".ROWID))
11 - filter(("ENDSCN"(+) IS NULL OR "ENDSCN"(+)>897353) AND ("STARTSCN"(+) IS
NULL OR
"STARTSCN"(+)<897353))
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
28 recursive calls
2 db block gets
1202 consistent gets
1063 physical reads
0 redo size
424 bytes sent via SQL*Net to client
415 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
1 rows processed
如果此时在执行计划中只看到了liusm这张表,说明数据来源于回滚段
可以模拟压力测试,把数据挤出去。
如果看到了SYS_FBA_TCRV_76292这样的表,说明数据可能来源于归档
7. 闪回功能生成的字典对象有多个,通过查询USER_TABLES/USER_OBJECTS视图可以获得这些对象的详细信息:
SQL> select table_name,tablespace_name from user_tables where table_name like '%FBA%';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SYS_FBA_FA SYSTEM
SYS_FBA_TSFA SYSTEM
SYS_FBA_BARRIERSCN SYSTEM
SYS_FBA_TRACKEDTABLES SYSTEM
SYS_FBA_PARTITIONS SYSTEM
SYS_FBA_USERS SYSTEM
SYS_FBA_DL SYSTEM
SYS_MFBA_NHIST_76292
SYS_MFBA_NTCRV
SYS_MFBA_NCHANGE
SYS_MFBA_STAGE_RID
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SYS_MFBA_NROW
SYS_MFBA_TRACKED_TXN
13 rows .
8. 可以通过数据字典视图来查看关于闪回归档表的记录
SQL> select table_name from dict where table_name like '%FLASHBACK_ARCHIVE%';
TABLE_NAME
------------------------------
DBA_FLASHBACK_ARCHIVE
DBA_FLASHBACK_ARCHIVE_TABLES
DBA_FLASHBACK_ARCHIVE_TS
USER_FLASHBACK_ARCHIVE
USER_FLASHBACK_ARCHIVE_TABLES
9. 可以通过数据字典视图来查看关于闪回归档表的记录
SQL> conn liusm/liusm
Connected.
SQL> select * from user_flashback_archive_tables;
TABLE_NAME OWNER_NAME
------------------------------ ------------------------------
FLASHBACK_ARCHIVE_NAME
--------------------------------------------------------------------------------
ARCHIVE_TABLE_NAME STATUS
----------------------------------------------------- -------------
LIUSM LIUSM
FDA
SYS_FBA_HIST_76292 ENABLED
总之,闪回数据归档是Oracle 11g提供的重要增强之一,通过合理使用这一增强,可以为数据库提供更为全面的数据生命周期管理,Oracle关于UNDO技术的进化至此又迈进了重要的一步。
扫描二维码关注我的微学堂
搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!