使用闪回数据归档:审计和数据修复
至此,闪回数据归档已经建立起来,但有什么用途呢?下面就列举几个情景来说明它的用途:
审计历史事务
现在我们已经在HR.APPLICANTS表上建立起FBDA跟踪了,所有发生变化的数据将会自动保留下来,这样我们就可以向同等雇佣机会委员会(EEOC)证明我们在招聘人员时没有歧视,因为我们最近和美国联邦政府签订了这样一份协议,以后我就可以拿事实数据进行说明了。
数据粉碎
相信大部分对于保留历史数据在法律上的重要性都有深刻的理解,好的记账原则要求至少保留关键财务数据达7年之久,方便国家税务机关审计。Oracle 11g将会自动删除超出保留期限的数据,在数据粉碎期间,只针对历史数据,而不是FBDA自身。
修复丢失的或错误修改的数据
以我过去30年的IT经历来看,很多时候用户、程序开发人员甚至DBA可能不经意错误地修改了关键数据,甚至物理地删除了关键表中的行,更可怕的是,这些错误可能过了很久才被发现,那个时候可能最希望能够如魔法般地重建数据,这放在过去,只能不完全恢复数据,闪回数据当然也支持不完全恢复,但它的粒度是数据库和指定的SCN(但前提是在犯错前已经开启了闪回日志功能),闪回表仍然受限于当前UNDO表空间UNDO保留的数量。下面给出一段代码显示如何使用闪回数据归档数据和闪回查询来找回丢失的数据的:
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时并没有删除对应的表空间)。
请看下面的代码:
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受欢迎的工具。