闪回之 Flashback Data Archive

Oracle Flashback Data Archive
介绍Oracle11g中Flashback Data Archive的特性和操作方法,包括创建、管理和使用Flashback Data Archive进行数据恢复的过程。
背景:
Oracle 11g 中 Flashback Data Archive 特性。将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和 undo 区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响 undo 策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,而只是记录了指定表的数据变化。所以,Flashback Data Archive 是针对对象的保护,是 Flashback Database 的有力补充。


闪回数据归档区:
闪回数据归档区是闪回数据归档的历史数据存储区域,每一个闪回数据归档区都可以有一个唯一的名称,对应了一定的数据保留策略。
在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。


Flashback archive 的限制条件:
1)Flashback data archive 只能在 ASSM 的 tablespace 上创建
2)Flashback data archive 要求必须使用自动 undo 管理,即 undo_management 参数为 auto




Flashback archive 的后台进程:
Oracle11g 为 Flashback data archive 特性专门引入了一个新的后台进程FBDA,用于将追踪表(traced table,也就是将指定使用 flashback data archive 的table)的历史变化数据转存到闪回归档区。
-- 查看 FDBA 进程
SQL> select name,description from v$bgprocess where name='FBDA';
NAME DESCRIPTION
----- -----------------------------------------------------------
FBDA Flashback Data Archiver Process


FDA 管理操作:




--创建一个默认的 Flashback Archive, 配额为 10M,数据保留期为 7 天
SQL> create flashback archive default fda01 tablespace fda01 quota 10M retention 7 day;
--创建一个默认的 Flashback Archive,配额 unlimited,数据保留期为 7 天 
SQL> create flashback archive fda02 tablespace fda02 retention 7 day;
(配额 unlimited,用户对该表空间的配额也必须为 ulimited)
若配合不够,则修改用户配额。 -> SQL> grant unlimited tablespace to XXXX;
--用户赋权
SQL> grant flashback archive administer to andy;
--查询 flashback archive 情况
SQL> select flashback_archive_name name, status from dba_flashback_archive;
--修改default flashback archive
SQL> alter flashback archive XXX set default;
--为已经存在的 Flashback Archive 添加表空间,并指定配额
SQL> alter flashback archive XXX add tablespace XXXX quota 100M;
--将表空间从 Flashback Archive 中移除
SQL> alter flashback archive XXX remove tablespace XXX;
--修改已经存在的 Flashback Archive 的配额
SQL> alter flashback archive fla1 modify tablespace XXX quota 30m;
--修改配额不受限制
SQL> alter flashback archive XXX modify tablespace XXX;
--修改 Flashback Archive 的 retention time
SQL> alter flashback archive fla1 modify retention 1 year;
--清空 Flashback Archive 中的所有历史记录
SQL> alter flashback archive XXX purge all;
--清空 Flashback Archive 中超过 1 天的历史数据
SQL> alter flashback archive fla1 purge before timestamp (systimestamp - interval '1'day);
--清空 Flashback Archive 中指定 SCN 之前的所有历史数据
SQL> alter flashback archive fla1 purge before scn XXX;
-- 删除 Flashback Archive 不会删除相应的表空间
SQL> DROP FLASHBACK ARCHIVE XXX;


操作流程:


--创建测试的 FDA 表空间
SQL>
create tablespace fda01 logging  datafile '/home/oracle/app/oradata/orcl/fda01.dbf' 
size 10m  autoextend on  next 1m maxsize 30m  extent management local; 
SQL>
create tablespace fda02 logging  datafile '/home/oracle/app/oradata/orcl/fda02.dbf' 
size 10m  autoextend on  next 1m maxsize 30m  extent management local; 


--创建一个默认的 Flashback Archive, 配额为 10M,数据保留期为 7 天
SQL> create flashback archive default fda01 tablespace fda01 quota 10M retention 7 day;
--创建一个默认的 Flashback Archive,配额 unlimited,数据保留期为 7 天 
SQL> create flashback archive fda02 tablespace fda02 retention 7 day;


--查询 flashback archive 情况
SQL> col name for a40
SQL> select flashback_archive_name name, status from dba_flashback_archive;


NAME                                     STATUS
---------------------------------------- -------
FDA01                                    DEFAULT
FDA02


--创建 table,使用默认的 Flashback Data Archive 来存储历史数据
SQL> create table fad01(id number) flashback archive;


--创建 table,使用指定的 Flashback Data Archive 来存储历史数据
SQL> create table fda02(id number) flashback archive fda02;


在 Flashback Area 中,会有一张历史表记录着我们启动 FA 表的所有操作。 我们可以通过如下 SQL 来查看他们之间的映射关系。
SQL>  SELECT  table_name,archive_table_name,status  from dba_flashback_archive_tables;


--对表启用 Flashback archive,并使用默认的 Flashback archive。
SQL> alter table XXX flashback archive;


--禁用表的 Flashback Archive
SQL> alter table XXX no flashback archive;


--对 table 启用 Flashback archive,并指定 Flashaback Archive 区。
SQL> alter table XXX flashback archive fla1;






针对 FDA 的DDL处理。
启动Flashback Data Archive的表上的一些DDL 操作可能触发ORA-55610的错误,DDL限制:
1)ALTER TABLE statement that includes an UPGRADE TABLE clause, withor without an INCLUDING DATA clause
2)ALTER TABLE statement that moves or exchanges a partition or subpartition operation
3)DROP TABLE statement


说明:
如果必须在已经启用 Flashback Archive 的表上执行这些不支持的 DDL 操作,可以用DBMS_FLASHBACK_ARCHIVE 包将表从Flashback Data Archive 分离出来,待操作结束后在添加进去。


--查询 FDA 的映射关系
SQL>  SELECT  table_name,archive_table_name,status  from dba_flashback_archive_tables;
我们要执行那些不支持的 DDL,就需要用 dbms_flashback_archive 禁用他们之间的映射关系,在操作,操作完在用该包启用他们。
--表的分离和重新结合
SQL> exec dbms_flashback_archive.disassociate_fba('ANDY','FAD01');
SQL> exec dbms_flashback_archive.reassociate_fba('ANDY','FAD01');




Flashback Data Archive   恢复数据的测试流程:
--创建测试的 FDA 表空间
SQL>
create tablespace fda01 logging  datafile '/home/oracle/app/oradata/orcl/fda01.dbf' 
size 10m  autoextend on  next 1m maxsize 30m  extent management local; 
SQL>
create tablespace fda02 logging  datafile '/home/oracle/app/oradata/orcl/fda02.dbf' 
size 10m  autoextend on  next 1m maxsize 30m  extent management local; 


--创建一个默认的 Flashback Archive, 配额为 10M,数据保留期为 7 天
SQL> create flashback archive default fda01 tablespace fda01 quota 10M retention 7 day;
--创建一个默认的 Flashback Archive,配额 unlimited,数据保留期为 7 天 
SQL> create flashback archive fda02 tablespace fda02 retention 7 day;


--查询 flashback archive 情况
SQL> col name for a40
SQL> select flashback_archive_name name, status from dba_flashback_archive;


NAME                                     STATUS
---------------------------------------- -------
FDA01                                    DEFAULT
FDA02
--sys用户赋权
SQL> grant flashback archive administer to andy;
--创建测试表:
SQL> create table fad01(id number) flashback archive;
--插入数据:
SQL> insert into fad01 values(1);
SQL> select count(*) from fad01;


  COUNT(*)
----------
         1
--查询时间:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;
TM
-------------------
2015-03-15 05:35:40
在 update 一次数据:
SQL> update fad01 set id=11 where id =1;
SQL>commit;
查询时间:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;
TM
-------------------
2015-03-15 05:37:25
使用 Flashback Archive 查询 1 分钟之前的数据:
SQL> select count(*) from fad01 as of timestamp (systimestamp - interval '1'minute);
  COUNT(*)
----------
         0
--删除表数据
SQL> delete from fad01;
SQL> commit;
SQL> select count(*) from fad01;
查询表映射关系
SQL> col TABLE_NAME for a10
SQL> col OWNER_NAME for a10
SQL>  col FLASHBACK_ARCHIVE_NAME for a15
SQL> SELECT * from dba_flashback_archive_tables;
TABLE_NAME OWNER_NAME FLASHBACK_ARCHI ARCHIVE_TABLE_NAME                     STATUS
---------- ---------- --------------- ---------------------------------- ---------------
FAD01      ANDY       FDA01           SYS_FBA_HIST_97516                    ENABLED
从这个结果,可以看出,在 Flashback archive 对应的 FAD01 表的历史表是 SYS_FBA_HIST_97516 。
该表保存了 FA 表的所有的操作记录:
SQL> select count(*) from SYS_FBA_HIST_97516;
  COUNT(*)
----------
         2
注意:历史表只能查询,若想修改,必须解除映射关系。
______________________________________________


验证 FDA 与undo无关,新建 UDNO TBS并切换默认 UNDO TBS ,删除旧默认 UNDO TBS
1、创建新的undo表空间undotbs2
create undo tablespace UNDOTBS2  datafile '/home/oracle/app/oradata/orcl/undotbs02.dbf' 
size 50m  autoextend on  next 10m maxsize unlimited  extent management local; 
2、切换系统表空间
alter system set undo_tablespace=UNDOTBS2  scope=both;
3、删除原来undo内容
drop tablespace undotbs1 including contents and datafiles;
______________________________________________


SQL> select * from fad01 as of timestamp  to_timestamp('2015-03-15 05:37:25','YYYY-MM-DD hh24:mi:ss');


        ID
----------
        11
-- 利用不受限于undo时间的,FDA 与 flashback query恢复误操作。
SQL> insert into fad01 select * from fad01 as of timestamp  to_timestamp('2015-03-15 05:37:25','YYYY-MM-DD hh24:mi:ss');


1 row created.


SQL> select * from fad01;


        ID
----------
        11
-- 删除 FDA 表
SQL> alter table fad01 no flashback archive;


Table altered.


SQL> drop table fad01;


Table dropped.



<think>好的,我现在要回答用户关于SQL中FLASHBACK类型或分类的问题。首先,我需要回忆一下Oracle数据库中的闪回技术,因为FLASHBACK主要是Oracle的功能。用户可能是在使用Oracle时遇到了相关问题,所以需要明确不同版本的Oracle支持的闪回类型可能不同。 根据已有的知识,Oracle的闪回技术主要分为几类:查询级别的、表级别的、事务级别的,还有删除恢复和数据库级别的。比如,闪回查询(Flashback Query)允许查询过去某个时间点的数据,这属于查询级别。然后是闪回表(Flashback Table),可以把表恢复到之前的某个时间点,可能需要启用行移动。接着是闪回删除(Flashback Drop),用来恢复被删除的表,类似于回收站功能。还有闪回事务查询(Flashback Transaction Query),可以查看特定事务的历史变化,并结合闪回事务回滚来撤销事务。最后是闪回数据库(Flashback Database),这属于更高级别的恢复,需要配置闪回日志。 不过,我需要检查提供的引用内容是否有相关线索。查看用户提供的引用,引用[1]和[2]是关于子查询和记录类型的,引用[3]是UNION操作,引用[4]提到删除行报错和查询时间,可能和闪回有关联,比如闪回查询可能需要时间点。但引用中没有直接提到FLASHBACK的类型,所以主要依赖现有知识。 需要确保分类正确,可能需要区分不同版本的Oracle支持情况。例如,闪回数据归档(Flashback Data Archive)可能属于历史数据追踪,是否算作一种类型?另外,要确认各个类型的具体技术名称和用途,避免混淆。比如,闪回版本查询(Flashback Version Query)和闪回事务查询是否属于同一类别? 整理思路:将闪回技术分为几个主要类别,每个类别给出简要说明和示例。确保每个分类都有明确的名称和用途,可能包括需要的前提条件,比如闪回数据库需要启用归档和闪回日志。同时,注意引用用户提供的引用中可能相关的部分,比如引用[4]中的时间查询可能与闪回查询中的时间点有关联,可以适当提及。 最后,生成相关问题,需要考虑用户可能进一步想知道的内容,比如如何启用闪回功能,不同闪回类型的应用场景,或者权限要求等。确保问题覆盖分类、使用方法和注意事项等方面。</think>在 Oracle 数据库中,**闪回FLASHBACK)** 属于数据恢复与历史查询技术,主要用于在不依赖传统备份的情况下快速恢复数据或查看历史状态。其分类如下: --- ### 1. **闪回查询(Flashback Query)** - **功能**:查询过去某一时间点的数据状态。 - **语法示例**: ```sql SELECT * FROM table_name AS OF TIMESTAMP TO_TIMESTAMP('2023-10-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS'); ``` - **依赖条件**:需启用撤销表空间(UNDO Tablespace)以保留历史数据[^4]。 --- ### 2. **闪回表(Flashback Table)** - **功能**:将表恢复到特定时间点或系统变更号(SCN)。 - **语法示例**: ```sql FLASHBACK TABLE table_name TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR); ``` - **前提条件**:表需启用行移动(`ALTER TABLE table_name ENABLE ROW MOVEMENT`)[^2]。 --- ### 3. **闪回删除(Flashback Drop)** - **功能**:恢复被意外删除的表(类似回收站功能)。 - **语法示例**: ```sql FLASHBACK TABLE table_name TO BEFORE DROP; ``` - **限制**:仅恢复通过 `DROP TABLE` 删除的表,且依赖表空间未清理。 --- ### 4. **闪回版本查询(Flashback Version Query)** - **功能**:查看表中某一行在特定时间范围内的所有历史版本。 - **语法示例**: ```sql SELECT versions_starttime, column_name FROM table_name VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE; ``` --- ### 5. **闪回事务查询(Flashback Transaction Query)** - **功能**:追踪事务的历史操作,可结合 `UNDO_SQL` 生成回滚语句。 - **依赖视图**:`FLASHBACK_TRANSACTION_QUERY`。 --- ### 6. **闪回数据库(Flashback Database)** - **功能**:将整个数据库回退到过去的时间点。 - **前提条件**:需启用闪回日志(`ALTER DATABASE FLASHBACK ON`)和归档模式[^4]。 - **语法示例**: ```sql FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2023-10-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS'); ``` --- ### 7. **闪回数据归档(Flashback Data Archive)** - **功能**:长期保留历史数据变更,用于审计或合规性需求。 - **实现方式**:通过创建归档区(`CREATE FLASHBACK ARCHIVE`)并关联目标表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值