今天看啥
热点:

简介:

Oracle数据库10g提供了五个新的闪回功能:闪回版本查询,闪回事务查询,闪回删除,闪回表和闪回数据库。Oracle数据库11gR1提供了一个有趣的新的闪回功能:闪回数据存档,它允许一个Oracle数据库管理员维护一个记录,对指定时间范围内对所有表的的改变情况进行记录。

OCP 考试题:

171153890.png

验证:


15:44:05 [email protected] cuug>select flashback_archive_name,status from dba_flashback_archive;


FLASHBACK_ARCHIVE_NA STATUS

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

FBA1 DEFAULT

FBA2

FBA3

FBA4


15:44:09 [email protected] cuug>drop flashback archive fba1;


Flashback archive dropped.


Elapsed: 00:00:00.13

16:13:22 [email protected] cuug>select flashback_archive_name,status from dba_flashback_archive;


FLASHBACK_ARCHIVE_NA STATUS

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

FBA2

FBA3

FBA4


Elapsed: 00:00:00.05

16:13:26 [email protected] cuug>alter table scott.dept flashback archive;

alter table scott.dept flashback archive

*

ERROR at line 1:

ORA-55608: Default Flashback Archive does not exist

Elapsed: 00:00:00.02

16:13:41 [email protected] cuug>


FBDA工作原理:

闪回数据归档(FBDA)是一个新的后台进程,负责跟踪和归档开启了FBDA的表的历史数据,它通过异步处理自动收集和向指定的闪回数据归档写入原始数据。

当开启FBDA的表中任何数据发生变化时,FBDA首先询问存储在数据库缓冲区中的UNDO数据,如果数据仍然在那里,FBDA就会使用它,如果UNDO数据已经从数据库缓冲区中移除,FBDA就会尝试从UNDO表空间中的UNDO段中获取数据发生的变化。

当FBDA捕捉到变化数据时,它会整理开启FBDA的表中的行,然后将这些行写入FBDA中的历史表,这些表数据经过压缩,就和内部分区一样。

有趣的是,FBDA不包括捕获数据的原始索引,当在FBDA中可以对历史数据创建另一个索引。

自动保留策略:按照类似的保留需求,可以将FBDA对象中的历史表数据聚集在一起,Oracle 11g也提供了自动清理FBDA中数据的方法,一旦超出了指定的保留期限就会自动执行清理工作,多个表可以共享同一个数据保留和清理策略,因为FBDA是由一个或多个表空间构成的,所以可以创建多个FBDA,每个FBDA指定不同的保留期限,这样就可以创建多个FBDA满足不同需求的保留策略

配置闪回数据归档

准备一个Oracle 11g数据库使用FBDA功能是相当简单的,只需要经过几个简单的步骤即可:

(1)创建或指定一个或多个表空间用于FBDA保留历史数据

(2)随意指派一个FBDA作为数据库的默认FBDA

(3)指派一个用户账户作为FBDA管理员,授予它FLASHBACK ARCHIVE ADMINISTER系统权限

(4)授予FBDA权限给适合的用户账号

(5)授予FLASHBACK和SELECT权限给合适的FBDA表用户

(6)为FBDA用户授予DBMS_FLASHBACK存储过程EXECUTE权限

具体步骤:

-- 创建FBDA管理员用户账号


CREATE USER fbda_admin IDENTIFIED BY fbda_admin;

GRANT FLASHBACK ARCHIVE ADMINISTER TO fbda_admin;

-- 授予其它用户合适的闪回权限

GRANT FLASHBACK ANY TABLE TO hr;

GRANT EXECUTE ON DBMS_FLASHBACK TO hr;

GRANT FLASHBACK ANY TABLE TO oe;

GRANT EXECUTE ON DBMS_FLASHBACK TO oe;

GRANT FLASHBACK ANY TABLE TO sh;

GRANT EXECUTE ON DBMS_FLASHBACK TO sh;

-- 为闪回数据归档创建表空间

CREATE TABLESPACE fbda

DATAFILE '/u01/app/oracle/oradata/ORCL/tsp_fdba01.dbf'

SIZE 24M;

-- 创建一个闪回数据归档保留5天有价值的历史

CREATE FLASHBACK ARCHIVE fbda_1

TABLESPACE fbda

QUOTA 1M

RETENTION 5 DAY;

GRANT FLASHBACK ARCHIVE ON fbda_1 TO hr;

GRANT FLASHBACK ARCHIVE ON fbda_1 TO oe;

GRANT FLASHBACK ARCHIVE ON fbda_1 TO sh;

-- 创建一个闪回数据归档保留1整年有价值的历史

CREATE FLASHBACK ARCHIVE fbda_2

TABLESPACE fbda

QUOTA 4M

RETENTION 1 YEAR;

GRANT FLASHBACK ARCHIVE ON fbda_2 TO hr;

GRANT FLASHBACK ARCHIVE ON fbda_2 TO oe;

GRANT FLASHBACK ARCHIVE ON fbda_2 TO sh;

-- 创建一个闪回数据归档保留7年有价值的历史

CREATE FLASHBACK ARCHIVE fbda_3

TABLESPACE fbda

QUOTA 20M

RETENTION 7 YEAR;

GRANT FLASHBACK ARCHIVE ON fbda_3 TO hr;

GRANT FLASHBACK ARCHIVE ON fbda_3 TO oe;

GRANT FLASHBACK ARCHIVE ON fbda_3 TO sh;

-- 将闪回数据归档FBDA_2作为默认FBDA

ALTER FLASHBACK ARCHIVE fbda_2 SET DEFAULT;

-- 将FBDA_1改为默认的FBDA

ALTER FLASHBACK ARCHIVE fbda_1 SET DEFAULT;

-- 启用一个现有表使用默认的FBDA(fbda_1)

ALTER TABLE hr.applicants FLASHBACK ARCHIVE;

-- 启用表使用指定的FBDA

ALTER TABLE hr.departments FLASHBACK ARCHIVE fbda_1;

ALTER TABLE hr.job_history FLASHBACK ARCHIVE fbda_2;

ALTER TABLE oe.customers FLASHBACK ARCHIVE fbda_3;

-- 在指定表上禁用闪回数据归档

ALTER TABLE hr.departments NO FLASHBACK ARCHIVE;


删除闪回归档区:

17:04:39 [email protected] cuug>drop flashback archive fbda_1;


Flashback archive dropped.


17:04:39 [email protected] cuug>drop flashback archive fbda_2;


Flashback archive dropped.


Elapsed: 00:00:00.10

17:04:48 [email protected] cuug>drop flashback archive fbda_3;


Flashback archive dropped.


Elapsed: 00:00:00.05

17:04:51 [email protected] cuug>drop flashback archive fbda_4;


Flashback archive dropped.


FBDA元数据:Oracle 11gR1提供了几个关于FBDA元数据的数据字典视图,包括哪个表空间支持可扩展的历史数据存储,以及FBDA中保留了哪个表:

1457211.jpg

使用闪回数据归档:审计和数据修复

至此,闪回数据归档已经建立起来,但有什么用途呢?下面就列举几个情景来说明它的用途:

审计历史事务

现在我们已经在HR.APPLICANTS表上建立起FBDA跟踪了,所有发生变化的数据将会自动保留下来,这样我们就可以向同等雇佣机会委员会(EEOC)证明我们在招聘人员时没有歧视,因为我们最近和美国联邦政府签订了这样一份协议,以后我就可以拿事实数据进行说明了。

数据粉碎

相信大部分对于保留历史数据在法律上的重要性都有深刻的理解,好的记账原则要求至少保留关键财务数据达7年之久,方便国家税务机关审计。Oracle 11g将会自动删除超出保留期限的数据,在数据粉碎期间,只针对历史数据,而不是FBDA自身。

修复丢失的或错误修改的数据

以我过去30年的IT经历来看,很多时候用户、程序开发人员甚至DBA可能不经意错误地修改了关键数据,甚至物理地删除了关键表中的行,更可怕的是,这些错误可能过了很久才被发现,那个时候可能最希望能够如魔法般地重建数据,这放在过去,只能不完全恢复数据,闪回数据当然也支持不完全恢复,但它的粒度是数据库和指定的SCN(但前提是在犯错前已经开启了闪回日志功能),闪回表仍然受限于当前UNDO表空间UNDO保留的数量。

下面给出一段代码显示如何使用闪回数据归档数据和闪回查询来找回丢失的数据的:

DELETE FROM hr.applicants

WHERE application_date <= TO_DATE('11-10-2008','dd-mm-yyyy');

COMMIT;

INSERT INTO hr.applicants

SELECT *

FROM hr.applicants

VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2008-12-04 10:00','yyyy-mm-dd hh24:mi')

AND MAXVALUE

WHERE VERSIONS_OPERATION = 'D';

COMMIT;

虽然闪回数据归档自身可以完成维护,但有时还是需要手动维护,如:维护闪回数据归档

扩大现有FBDA的大小(新的大小不能超过授予FBDA管理用户限额的最大表空间尺寸)。

改变FBDA上历史数据保留策略。

手动清洗FBDA内比指定日期时间还旧的数据。

删除现有FBDA(注意删除FBDA时并没有删除对应的表空间)。

请看下面的代码:

-- 清洗现有FBDA中超过1天的数据

ALTER FLASHBACK ARCHIVE fbda_1

PURGE BEFORE TIMESTAMP(SYSTIMESTAMP - INTERVAL '1' DAY);

-- 修改现有FBDA的空间限额,减小到2M

ALTER FLASHBACK ARCHIVE fbda_1

MODIFY TABLESPACE fbda QUOTA 2M;

-- 减少现有FBDA的保留期限为90天

ALTER FLASHBACK ARCHIVE fbda_3

MODIFY RETENTION 90 DAY;

-- 给现有FBDA增加一个无空间限额的新表空间,这样就允许FBDA使用新增加表空间的所有可用空间

DROP TABLESPACE fbda_extd INCLUDING CONTENTS AND DATAFILES;

CREATE TABLESPACE fbda_extd

DATAFILE '/u01/app/oracle/oradata/ORCL/tsp_fdba_extd01.dbf'

SIZE 16M;

ALTER FLASHBACK ARCHIVE fbda_1

ADD TABLESPACE fbda_extd;

-- 删除一个现有FBDA,注意对应的表空间仍然存在

DROP FLASHBACK ARCHIVE fbda_1;

FBDA空间管理:当一个FBDA用尽了所有可用的空间时,由这个FBDA支持的表如果发生修改操作时,其会话会接收到一个或两个错误消息(下面用fbda_1来解释这两个错误):

ORA-55617: Flashback Archive fbda_1 runs out of space and tracking on fda1 is suspended

这个错误消息指出了哪个FBDA空间几乎用完了,当FBDA达到90%或更高时就会报这个错误。

ORA-55623: Flashback Archive fbda_1 is blocking and tracking on all tables is suspended

这种情况下,FBDA已经完全用完了可用空间。

不管出现哪个错误,DBA都可以手动增加FBDA的限额,或直接增加FBDA所在表空间的大小,注意这些错误也会记录到Alert.log文件中。

闪回数据归档:限制和建议

你可能已经猜到这么强大的功能肯定会有限制条件的,不错,下面就列举出这些限制条件:

DDL限制

如果在开启FBDA的表上应用下面这些DDL命令,Oracle 11g将会产生一个异常:

(1)ALTER TABLE <表名>命令,如

删除一列

重命名列

修改列

执行PARTITION 或SUBPARTITION 操作

将列的数据类型从LONG转换为LOB

调用UPGRADE TABLE操作,不管是否指定了INCLUDING DATA选项

(2)DROP TABLE <表名>;

(3)RENAME TABLE <表明>;

(4)TRUNCATE TABLE <表名>;

最佳实践

最后,我还是列出在Oracle 11g中使用闪回数据归档特性时推荐的最佳实践:

(1)在查询以往数据之前执行一下COMMIT 或ROLLBACK 操作,这样可以确保数据库的一致性。

(2)闪回数据归档进程总是使用当前会话设置,包括NLS设置如NLS_LANGUAGE和NLS_CHARACTERSET,但实际中当历史数据被保留时,这些变量的设置可能并不匹配。

(3)Oracle推荐使用INTERVAL和TIMESTAMP变量转换函数来估算过去的时间,如指定SYSTIMESTAMP – INTERVAL‘20’DAYS 来获得启用FBDA特性的表过去的数据。

(4)为了更精确地查询FBDA中的数据,Oracle推荐使用SCN,记住TIMESTAMP_TO_SCN函数可以用来直接从TIMESTAMP值中获得一个相对准确的SCN值,但它的精确度也只能达到3秒左右。

小结

Oracle 11g新的闪回数据归档特性让DBA有能力将历史数据保留非常长的时间,只要保存历史数据的表空间的容量足够大,因为闪回查询、闪回版本查询和闪回事务查询也受到支持,因此Oracle DBA也可以利用FBDA特性来纠正对数据的错误修改。FBDA安装容易,监控简单,自我维护,相信它会成为Oracle DBA受欢迎的工具。

----------以上内容部分属于转载


本文出自 “天涯客的blog” 博客,请务必保留此出处http://tiany.blog.51cto.com/513694/1301728

www.bkjia.comtruehttp://www.bkjia.com/sjkjc/618634.htmlTechArticle简介: Oracle数据库10g提供了五个新的闪回功能:闪回版本查询,闪回事务查询,闪回删除,闪回表和闪回数据库。Oracle数据库11gR1提供了一...

相关文章

相关搜索: oracle

帮客评论

视觉看点