Flashback Data Archive

Oracle 11g的闪回数据归档Flashback Data Archive(FBDA)技术通过创建一个或多个tablespace保留table数据改变的历史记录。
一旦在关键表上实施了FBDA,所有修改历史都可以查看,这样关键表就有了历史跟踪表/履历表了,确保历史数据被精确跟踪。
实施这个技术有一定的工作量,需要梳理关键表,确定历史数据保留策略,并针对性的实施配置,编制专门的使用文档用以查看跟踪,同时后期需要专门的监控、维护工作。
实施此技术会对数据库形成一定的额外压力,对资源库、流程库的具体影响尚待验证,需要现场测试。
需要对已有的数据库账号做一次全面的安全梳理、配置,确保FBDA对应的设置不会被篡改,以精准跟踪数据履历。
具体对于存储大小的需求尚待确认,因为需要跟踪大量历史记录,但是暂未评估用户数量、操作频次、操作时间等信息。

■■FBDA工作原理
闪回数据归档(FBDA)是一个新的后台进程,负责跟踪和归档开启了FBDA的表的历史数据,它通过异步处理自动收集和向指定的闪回数据归档写入原始数据。
当开启FBDA的表中任何数据发生变化时,FBDA首先询问存储在数据库缓冲区中的UNDO数据,如果数据仍然在那里,FBDA就会使用它,如果UNDO数据已经从数据库缓冲区中移除,FBDA就会尝试从UNDO表空间中的UNDO段中获取数据发生的变化。
当FBDA捕捉到变化数据时,它会整理开启FBDA的表中的行,然后将这些行写入FBDA中的历史表,这些表数据经过压缩,就和内部分区一样。
有趣的是,FBDA不包括捕获数据的原始索引,当在FBDA中可以对历史数据创建另一个索引。

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

■■配置闪回数据归档
(1)创建或指定一个或多个表空间用于FBDA
(2)随意指派一个FBDA作为数据库的默认FBDA
(3)指派一个用户账户作为FBDA管理员,授予它FLASHBACK ARCHIVE ADMINISTER系统权限
(4)授予FBDA权限给适合的用户账号
(5)授予FLASHBACK和SELECT权限给合适的FBDA表用户
(6)为FBDA用户授予DBMS_FLASHBACK存储过程EXECUTE权限
-- 创建FBDA管理员用户账号
DROP USER fbda_admin CASCADE;
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;
-- 为闪回数据归档创建表空间
DROP TABLESPACE fbda INCLUDING CONTENTS AND DATAFILES;
CREATE TABLESPACE fbda DATAFILE '/u01/app/oracle/oradata/ORCL/tsp_fdba01.dbf' SIZE 24M;
-- 创建一个闪回数据归档保留5天有价值的历史
DROP FLASHBACK ARCHIVE fbda_1;
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年有价值的历史
DROP FLASHBACK ARCHIVE fbda_2;
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年有价值的历史
DROP FLASHBACK ARCHIVE fbda_3;
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;
启用和禁用一个表的历史保留能力
ALTER TABLE <表名> FLASHBACK ARCHIVE [FBDA名];
如果没有指定FBDA名,将会使用默认的FBDA。DBA也可以给表指定想要的FBDA。如果不存在默认的FBDA就必须要明确指定FBDA。
使用ALTER TABLE <表名> NO FLASHBACK ARCHIVE; 命令可以在现有表上禁用FBDA。
-- 将闪回数据归档FBDA_2作为默认FBDA
ALTER FLASHBACK ARCHIVE fbda_2 SET DEFAULT;
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;

■■FBDA元数据
dba_flashback_archive
dba_flashback_archive_ts
dba_flashback_archive_tables
select flashback_archive_name,status from dba_flashback_archive;

■■FBDA用途
■审计历史事务
■数据粉碎:根据策略自动粉碎历史数据
■修复丢失的或错误修改的数据
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中超过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文件中。

■■FBDA限制和建议
如果在开启FBDA的表上应用下面这些DDL命令,Oracle 11g将会产生一个异常:
(1)ALTER TABLE <表名>,如
删除一列
重命名列
修改列
执行PARTITION 或SUBPARTITION 操作
将列的数据类型从LONG转换为LOB
调用UPGRADE TABLE操作,不管是否指定了INCLUDING DATA选项
(2)DROP TABLE <表名>;
(3)RENAME TABLE <表名>;
(4)TRUNCATE TABLE <表名>;

■■FBDA最佳实践
(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秒左右。

■■结论
闪回数据归档使得我们有能力将历史数据保留非常长的时间,只要保存历史数据的表空间的容量足够大,同时闪回查询、闪回版本查询和闪回事务查询也受到支持,因此可以利用FBDA特性来纠正对数据的错误修改。

发表评论

电子邮件地址不会被公开。 必填项已用*标注