all about Oracle 10g,11g flashback

  

2014年1月8日 16:21:22

今天遇到在drop table purge 后如何回复表的问题,如果你的数据库开启了闪回,可以闪回到drop前的一个时间点,open read only 数据库,导出数据后再recover database,期间不需要resetlogs,闪回数据库只是其中的一个方法,如果是在11.2你打开了闪回归档,那么更简单了,直接可以闪回ddl 前的表(我想很少有人会用吧)。以下是对Oracle 10g,11g flashback 技术的一点终结。

 

Flashback技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。

在Oracle 11g里又出了一个新特性:Oracle Flashback Data Archive. FDA通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。

 

在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query 三种) 和Flashback Table。

 

2.4.1闪回恢复区(Flashback Recovery Area)

在oracle 9i中引入flashback查询,以便能在需要的时候查到过去某个时刻的一致性数据,依赖于undo表空间存储的信息来闪回查询以前的版本,当然这个受限于undo表空间的大小,以及保留策略。如果undo 被覆盖了就不能进行查询。

oracle10g中增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的。flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将数据库往后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area),这个区域默认创建在oracle_base目录下。可以将所有恢复相关的文件,比如flashback log,archive log,backup set等,放到这个区域集中管理。

 

2.4.1.1.设置闪回恢复区

闪回恢复区主要通过3个初始化参数来设置和管理:

db_recovery_file_dest:指定闪回恢复区的位置

db_recovery_file_dest_size:指定闪回恢复区的可用空间大小

db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash log。所以这个参数要和db_recovery_file_dest_size配合修改。

SQL>ALTER SYSTEM SET db_recovery_file_dest_size=3g SCOPE=BOTH;

Systemaltered.

SQL>ALTER SYSTEM SET db_recovery_file_dest='D:/app/Administrator/flash_recovery_area ' SCOPE=BOTH;

Systemaltered.

SQL>show parameter db_recovery_file_dest

NAME                      TYPE            VALUE

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

db_recovery_file_dest     string           D:/app/Administrator/flash_recovery_area

db_recovery_file_dest_sizebig integer      3852M

SQL>show parameter db_flashback

我们看到db_flashback_retention_target默认是1440分钟,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。

修改该参数:

SQL>altersystem set db_flashback_retention_target=2880 scope=both;

 

2.4.1.2  取消闪回恢复区

将db_recovery_file_dest参数设置为空,可以停用闪回恢复区。如果已经启用flashback database,则不能取消闪回恢复区。

SQL>alter system set db_recovery_file_dest='';

 alter system set db_recovery_file_dest=''

*

第 1 行出现错误:

ORA-02097:无法修改参数, 因为指定的值无效

ORA-38775:无法禁用恢复区 - 闪回数据库已启用

 

SQL>shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE例程已经关闭。

SQL>startup mount;

ORACLE例程已经启动。

TotalSystem Global Area  849530880 bytes

FixedSize                  1377896 bytes

VariableSize             637536664 bytes

DatabaseBuffers          205520896 bytes

RedoBuffers                5095424 bytes

数据库装载完毕。

SQL>alter database flashback off;

数据库已更改。

SQL>alter database open;

数据库已更改。

SQL>alter system set db_recovery_file_dest='';

系统已更改。

SQL>show parameter db_recovery_file_dest

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string

db_recovery_file_dest_size           big integer 3852M

SQL>

注意:

(1)DB_RECOVERY_FILE_DEST_SIZE 只有在DB_RECOVERY_FILE_DEST 清空之后才可以清空。

(2)初始化参数 db_recovery_file_dest_size 的设定有一点点需要注意的地方:

文件的第0块和操作系统数据块头的空间大小不包含在内,该参数并不代表实际占用的空间大小。如果空间被压缩、镜像、RAID 的话,该参数的值意义是不一样的

 

2.4.1.3  闪回恢复区的内容

所有和恢复相关的文件都可以存放到闪回恢复区

SQL>select file_type from v$flash_recovery_area_usage;

FILE_TYPE

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

CONTROLFILE

REDOLOG

ARCHIVEDLOG

BACKUPPIECE

IMAGECOPY

FLASHBACKLOG

FOREIGNARCHIVED LOG

已选择7行。

上面视图中查询的结果列出的所有类型的文件,都可以利用闪回恢复区来存放、管理。

在一些 10g 的动态视图里( V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY 等 )的新的列 IS_RECOVERY_DEST_FILE ,指明相关的文件是否在恢复区内。

/*Formatted on 2010/8/13 0:04:22 (QP5 v5.115.810.9015) */

SELECT   recid, blocks, is_recovery_dest_file

  FROM  v$archived_log

 WHERE  recid < 5;

     RECID    BLOCKS IS_

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

         1     14141 NO

         2         52 NO

         3          7 NO

         4        138 NO

 

2.4.1.4  闪回恢复区的一些限制

如果设置了闪回恢复区,则log_archive_dest和log_archive_duplex_dest将不可用。

SQL>alter system set log_archive_dest='e:/' ;

altersystem set log_archive_dest='e:/'

*

第 1 行出现错误:

ORA-02097:无法修改参数, 因为指定的值无效

ORA-16018:无法将 LOG_ARCHIVE_DEST 与LOG_ARCHIVE_DEST_n 或

DB_RECOVERY_FILE_DEST一起使用

SQL>alter system set log_archive_duplex_dest='e:/';

altersystem set log_archive_duplex_dest='e:/'

*

第 1 行出现错误:

ORA-02097:无法修改参数, 因为指定的值无效

ORA-16018:无法将 LOG_ARCHIVE_DUPLEX_DEST 与 LOG_ARCHIVE_DEST_n 或

DB_RECOVERY_FILE_DEST一起使用

说明:

设置闪回恢复区后,如果没有设置过log_archive_dest_n参数,则归档日志默认是保存到该区域的。实际上,oracle是通过隐式的设置log_archive_dest_10='location=USE_DB_RECOVERY_FILE_DEST'来实现的。所以,如果修改过log_archive_dest_n将归档日志保存到其他位置,也可以修改该参数继续使用闪回恢复区。

SQL>alter system set log_archive_dest_10='location=USE_DB_RECOVERY_FILE_DEST';

多个数据库的闪回恢复区可以指定到同一个位置,但是db_name不能一样,或者db_unique_name不一样。RAC的闪回恢复区必须位于共享磁盘上,能被所有实例访问。

 

2.4.1.5  闪回恢复区的空间管理

闪回恢复区中添加或删除文件等变化都将记录在数据库的 alert 日志中,Oracle 10g 也针对该新特性提供了一个新的视图, DBA_OUTSTANDING_ALERTS,通过该视图可以得到相关的信息。

SQL>  DESC dba_outstanding_alerts

 名称                                      是否为空? 类型

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

 SEQUENCE_ID                                        NUMBER

 REASON_ID                                 NOT NULLNUMBER

 OWNER                                             VARCHAR2(30)

 OBJECT_NAME                                       VARCHAR2(513)

 SUBOBJECT_NAME                                    VARCHAR2(30)

 OBJECT_TYPE                                       VARCHAR2(64)

 REASON                                            VARCHAR2(4000)

 TIME_SUGGESTED                                    TIMESTAMP(6) WITH TIME ZONE

 CREATION_TIME                                     TIMESTAMP(6) WITH TIME ZONE

 SUGGESTED_ACTION                                  VARCHAR2(4000)

 ADVISOR_NAME                                       VARCHAR2(30)

 METRIC_VALUE                                       NUMBER

 MESSAGE_TYPE                                      VARCHAR2(12)

 MESSAGE_GROUP                                     VARCHAR2(64)

 MESSAGE_LEVEL                                      NUMBER

 HOSTING_CLIENT_ID                                  VARCHAR2(64)

 MODULE_ID                                         VARCHAR2(64)

 PROCESS_ID                                        VARCHAR2(128)

 HOST_ID                                            VARCHAR2(256)

 HOST_NW_ADDR                                      VARCHAR2(256)

 INSTANCE_NAME                                     VARCHAR2(16)

 INSTANCE_NUMBER                                    NUMBER

 USER_ID                                            VARCHAR2(30)

 EXECUTION_CONTEXT_ID                               VARCHAR2(128)

 ERROR_INSTANCE_ID                                  VARCHAR2(142)

 

在闪回恢复区中的空间使用超过 85% 的时候,数据库将会向 alert 文件中写入告警信息。而当超过 97% 的时候将会写入严重告警信息。当闪回恢复区空间不够的时候,Oracle将报告如下类似的错误:

ORA-19809:limit exceeded for recovery files

ORA-19804:cannot reclaim 52428800 bytes disk space from 1258291200 limit

这个时候查询dba_outstanding_alerts:

SQL>select reason,object_type,suggested_action from dba_outstanding_alerts;

REASON                         OBJECT_TYPE          SUGGESTED_ACTION

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

db_recovery_file_dest_sizeof  RECOVERY AREA        Add disk space and increasedb_recovery_

1258291200bytes is 88.20% use                     file_dest_size, backup files to tertiary

dand has 148509184 remaining                        device, delete filesfrom recovery area

bytesavailable.                                    using RMAN, consider changing RMAN rete

                                                   ntion policy or consider changing RMAN a

                                                   rchivelog deletion policy.

同时,oracle在alert中还会给出解决该问题的建议

************************************************************************

Youhave following choices to free up space from flash recovery area:

1.Consider changing RMAN RETENTION POLICY. If you are using Data Guard,thenconsider changing RMAN ARCHIVELOG DELETION POLICY.

2.Back up files to tertiary device such as tape using RMANB ACKUP RECOVERY AREAcommand.

3.Add disk space and increase db_recovery_file_dest_size parameter to reflect thenew space.

4.Delete unnecessary files using RMAN DELETE command. If an operating systemcommand was used to delete files, then use RMAN CROSSCHECK and DELETE EXPIREDcommands.

************************************************************************

V$RECOVERY_FILE_DEST视图 包含闪回恢复区的相关信息:

SQL>desc V$RECOVERY_FILE_DEST

 名称                                      是否为空? 类型

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

 NAME                                              VARCHAR2(513)

 SPACE_LIMIT                                        NUMBER

 SPACE_USED                                         NUMBER

 SPACE_RECLAIMABLE                                  NUMBER

 NUMBER_OF_FILES                                    NUMBER

SQL>select * from v$recovery_file_dest;

NAME  SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLENUMBER_OF_FILES

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

    4039114752          0                 0               0

通过查询视图v$flash_recovery_area_usage,可以获得当前闪回恢复区的空间使用情况,并且可以知道是哪些文件占中了空间,据此可以做出相应的处理,或者加大闪回恢复区,或者移走相应的文件。

SQL>select * from v$flash_recovery_area_usage;

FILE_TYPE     PERCENT_SPACE_USEDPERCENT_SPACE_RECLAIMABLE

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

CONTROLFILE           0                         0

REDOLOG               0                         0

ARCHIVEDLOG          0                         0

BACKUPPIECE           0                         0

IMAGECOPY             0                         0

FLASHBACKLOG        0                         0

FOREIGNARCHIVED LOG     0                         0

如果闪回恢复区空间耗尽,且归档路径设置到了闪回恢复区中,则由于日志无法归档,数据库会hang住。所以,对于生产库,如果将归档放到闪回恢复区中,需要密切关注闪回恢复区的空间使用情况,否则一旦闪回恢复区的空间用尽,将导致数据库无法提供服务。

 

2.4.1.6  Flash Recovery Area空间不足导致DB不能打开或hang住处理方法

            在上面讲到,当归档目录设置在闪回恢复区,并且闪回恢复区又满了的情况下, DB 就会无法归档而hang住或者无法打开。

这种情况下打开数据库会遇到如下错误信息:

SQL>select status from v$instance;

STATUS

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

MOUNTED

SQL>alter database open;

alterdatabase open

*

第 1 行出现错误:

ORA-16014:日志 2 的序列号 27 未归档, 没有可用的目的地

ORA-00312:联机日志 2 线程 1:

'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

SQL>show parameter db_recovery_file

NAME                                 TYPE        VALUE

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

db_recovery_file_dest    string     D:/oracle/product/10.2.0/flash_recovery_area

db_recovery_file_dest_size        big integer 2G

SQL>shutdown immediate;

SQL>startup

ORACLE例程已经启动。

TotalSystem Global Area  201326592 bytes

FixedSize                  1248092 bytes

VariableSize              88081572 bytes

DatabaseBuffers          109051904 bytes

RedoBuffers                2945024 bytes

数据库装载完毕。

ORA-16038:日志 2 序列号 27 无法归档

ORA-19809:超出了恢复文件数的限制

ORA-00312:联机日志 2 线程 1:

'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

SQL>alter database open;

alterdatabase open

*

第 1 行出现错误:

ORA-16014:日志 2 的序列号 27 未归档, 没有可用的目的地

ORA-00312:联机日志 2 线程 1:

'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

通过增加闪回恢复区大小,我们可以正常打开数据库

SQL>show parameter db_recovery

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string      D:/oracle/product/10.2.0/flash_recovery_area

db_recovery_file_dest_size           big integer 2G

SQL>alter system set db_recovery_file_dest_size=3G scope=both;

系统已更改。

SQL>alter database open;

数据库已更改。

检查一下flashrecovery area的使用情况:

SQL>select * from v$flash_recovery_area_usage;

FILE_TYPE    PERCENT_SPACE_USEDPERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

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

CONTROLFILE          0                         0               0

ONLINELOG           0                         0               0

ARCHIVELOG        6.36                         0               4

BACKUPPIECE       .22                         0               1

IMAGECOPY        63.68                         0               5

FLASHBACKLOG    .51                       .25               2

已选择6行。

SQL>

计算flashrecovery area已经占用的空间:

SQL>select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;

SUM(PERCENT_SPACE_USED)*3/100

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

                       2.1231

可以看到,这里已经有2.1231G使用了,这说明我们刚开始设置的db_recovery_file_dest_size=2G不足,导致onlineredo log无法归档,在这里,我们通过设置db_recovery_file_dest_size参数,增大了flash recovery area来解决这个问题。

增加Flashrecovery area 是一种解决方法,也可以将归档指定到其他的目录来解决这个问题。 或者备份数据库,在删除一些归档文件,来释放Flash recovery area。 都可以解决问题。

 

2.4.1.7  Flash Recovery Area 的备份

备份命令是Flashrecovery Area,该命令是Oracle 10g以后才有的。10g引进了flash recovery area,同时在rman备份中支持对该区域的备份。

在9i中oracle引入flashback查询,依赖于undo表空间存储的信息来闪回查询以前的版本,当然这个受限于undo表空间的大小,以及保留策略。

在10g中oracle又引入了新的flashback功能,使用了flash recovery area来存储flashback 1og等等。这个区域默认创建在oracle_base目录下。在其中可以存放备份集、镜像拷贝、归档日志、自动备份的控制文件以及spfile和flashback logs。存放位置和大小由参数db_recovery_file_dest和db_recovery_file_dest_size决定。

默认情况数据库的flashbackdatabase是关闭,可以在mount exclusive状态下打开。

看一下Oracle 官方文档上的几段文字:

Tofree space in the FRA we could do take a backup of the Flash Recovery Areausing the command BACKUP RECOVERY AREA.This command will take the backup of allthe files in the FRA to tape only. After this the space occupied by the filesin the FRA will be marked as reclaimable。

thelarger the fast recovery area, the more useful it is. Ideally, the fastrecovery area should be large enough for copies of the data files, controlfiles, online redo log files, and archived redo log files needed to recover thedatabase, and also the copies of these backup files that are kept based on theretention policy.

TheFlash Recovery Area is a unified storage location for all recovery-relatedfiles and activities in an Oracle Database. It includes Control File, ArchivedLog Files, Flashback Logs, Control File Autobackups, Data Files, and RMANfiles.

 

从上面的几段话,我们可以得到一下信息:

(1)BACKUP RECOVERY AREA 命令只能备份到磁带上。 在磁盘上备份会报如下错误:

RMAN>BACKUP RECOVERY AREA;

启动 backup 于 12-8月 -10

使用目标数据库控制文件替代恢复目录

分配的通道:ORA_DISK_1

通道ORA_DISK_1: SID=15 设备类型=DISK

说明与资料档案库中的任何归档日志都不匹配

说明与资料档案库中的任何数据文件副本都不匹配

RMAN-00571:===========================================================

RMAN-00569:=============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571:===========================================================

RMAN-03002:backup 命令 (在 08/12/201013:50:10 上) 失败

RMAN-06603:必须在磁盘设备上使用 RECOVERY AREA, RECOVERY FILES 或 DB_RECOVERY_FILE_DEST 指定 TO DESTINATION 选项

 

(2)Flash recovery area 包含内容:控制文件,归档文件,flashbacklogs, 控制文件,自动备份的控制文件,数据文件,数据文件拷贝,RMAN 文件(包括备份集,镜像备份)。

 

(3)BACKUP RECOVERY AREA 将备份所有Flash recoveryarea中的内容。

 

2.4.2Flashback Database

2.4.2.1Flashback Database 说明

FlashbackDatabase 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态,这个功能依赖于Flashback log 日志。比RMAN更快速和高效。因此Flashback Database 可以看作是不完全恢复的替代技术。 但它也有某些限制:

(1)Flashback Database 不能解决Media Failure,这种错误RMAN恢复仍是唯一选择。

(2)如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来,然后利用Flashback Database 执行剩下的Flashback Datbase。

(3)如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。

(4)使用Flashback Database锁能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN。

 

2.4.2.2Flashback Database 架构

FlashbackDatabase 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志 和Flash RecoveryArea。一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log, 这些日志包括的是数据块的"前镜像(before image)",这也是Flashback Database 技术不完全恢复块的原因。

[oracle@dba~]$ ps -ef|grep rvw

oracle   12620 12589 0 13:21 pts/1    00:00:00 grep rvw

 

2.4.2.3启用Flashback Database 步骤

数据库的FlashbackDatabase功能缺省是关闭的,要想启用这个功能,就需要做如下配置。

 

2.4.2.3.1.配置Flash Recovery Area

这个参考2.4.1.1 节的配置。

 

2.4.2.3.2.启动flashback database

默认情况数据库的flashbackdatabase是关闭,可以在mount exclusive状态下打开。在设置了闪回恢复区后,可以启动闪回数据库功能。

SQL>alter database noarchivelog;

alterdatabase noarchivelog

*

ERRORat line 1:

ORA-38774:cannot disable media recovery - flashback database is enabledSQL> alterdatabase flashback on;

数据库已更改。

SQL>alter database open;

数据库已更改。

SQL>select flashback_on from v$database;

FLASHBACK_ON

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

YES

 

2.4.2.4Flashback Database操作示例

做操作前先备份数据库:RMAN> backup database;

2.4.2.4.1.检查是否启动了flash recovery area

SQL>show parameter db_recovery_file

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                tring      D:/oracle/flash_recovery_area

db_recovery_file_dest_size          big integer 1G

2.4.2.4.2.检查是否启用了归档

SQL>archive log list;

数据库日志模式      存档模式

自动存档            启用

存档终点            USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列  9

下一个存档日志序列  11

当前日志序列        11

 

2.4.2.4.3.检查是否启用了flashback database

SQL>select flashback_on from v$database;

FLASHBACK_ON

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

YES

 

2.4.2.4.4.查询当前的scn

SQL>SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN

-----------

947921

2.4.2.4.5.查询当前的时间

SQL>select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;

TIME

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

09-10-1414:37:05

 

2.4.2.4.6.删除表A

SQL>select * from A;

ID         NAME

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

1          foo

2          tom

SQL>drop table A;

表已删除。

 

2.4.2.4.7.重启DB 到mount

FlashbackDatabase 实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态

SQL>shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE例程已经关闭。

SQL>startup mount

ORACLE例程已经启动。

TotalSystem Global Area  209715200 bytes

FixedSize                1248116 bytes

VariableSize             79692940 bytes

DatabaseBuffers          121634816 bytes

RedoBuffers                7139328 bytes

数据库装载完毕。

 

2.4.2.4.8.执行恢复:分timestamp 或者SCN两种

SQL> Flashback database to timestampto_timestamp('09-10-14 14:37:05','yy-mm-dd hh24:mi:ss');

闪回完成。

或者:

SQL>Flashback database to scn 947921;

闪回完成。

 

2.4.2.4.9.打开数据库

在执行完flashbackdatabase 命令之后,oracle 提供了两种方式让你修复数据库:

1).直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。

2).先执行alter database open read only命令,以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

这里演示,就以resetlogs方式打开:

SQL>alter database open resetlogs;

数据库已更改。

验证数据:

SQL>select * from A;

        ID NAME

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

         1 foo

         2 tom

 

2.4.2.5和Flashback Database 相关的3个视图

2.4.2.5.1.V$database

这个视图可以查看是否启用了Flashback database功能

SQL>select flashback_on from v$database;

FLASHBACK_ON

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

YES

 

2.4.2.5.2.V$flashback_database_log

FlashbackDatabase 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少,该视图就可以查看许多有用的信息。

Oldest_flashback_scn/ Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点

Flashback_size:  记录了当前使用的FlashRecovery Area 空间的大小

Retention_target:系统定义的策略

Estimated_flashback_size:根据策略对需要的空间大小的估计值

SQL>select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss')ot, retention_target rt,flashback_size fs, estimated_flashback_size es fromv$flashback_database_log;

        OS OT                        RT         FS         ES

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

1.0737E+1313-12-31 20:52:16       1440    8192000          0

 

2.4.2.5.3.V$flashback_database_stat

这个视图用来对Flashbacklog 空间情况进行更细粒度的记录和估计。这个视图以小时为单位记录单位时间内数据库的活动量:

Flashback_Data代表Flashback log产生数量,DB_Date代表数据改变数量,Redo_Date代表日志数量,通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求

SQL>alter session set nls_date_format='hh24:mi:ss';

会话已更改。

SQL>select *from v$flashback_database_stat;

BEGIN_TIEND_TIME FLASHBACK_DATA    DB_DATA  REDO_DATA ESTIMATED_FLASHBACK_SIZE

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

21:17:3521:25:36        1146880    1671168     97280                        0

 

2.4.3Flashback Drop

FlashbackDrop 是从Oracle 10g 开始出现的,用于恢复用户误删除的对象(包括表,索引等),这个技术依赖于TablespaceRecycle Bin(表空间回收站),这个功能和windows的回收站非常类似。

Flashback不支持sys用户。system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时,showrecyclebin 为空。

FlashbackDrop 是基于Tablespace RecycleBin 来实现恢复的。它只支持闪回与table 相关连的对象,比如表,索引,约束,触发器等。如果是函数或者存储过程等,就需要使用Flashback Query来实现。

 

2.4.3.1.Tablespace Recycle Bin

从Oracle 10g 开始,每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引,约束,触发器,LOB段,LOB index 段) 不会被物理删除,这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。

Whenyou drop a table, the database does not immediately remove the space associatedwith the table. The database renames the table and places it and any associatedobjects in a recycle bin, where, in case the table was dropped in error, it canbe recovered at a later time. This feature is called Flashback Drop, and theFLASHBACK TABLE statement is used to restore the table. Before discussing theuse of the FLASHBACK TABLE statement for this purpose, it is important tounderstand how the recycle bin works, and how you manage its contents.

Therecycle bin is actually a data dictionary table containing information aboutdropped objects. Dropped tables and any associated objects such as indexes,constraints, nested tables, and the likes are not removed and still occupyspace. They continue to count against user space quotas, until specificallypurged from the recycle bin or the unlikely situation where they must be purgedby the database because of tablespace space constraints.

From:

http://download.oracle.com/docs/cd/E11882_01/server.112/e17120/tables011.htm#ADMIN11679

初始化参数recyclebin用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。

禁用该功能:

SQL>alter system set recyclebin=off;

SQL>alter system set recyclebin=on;

SQL>alter session set recyclebin=off;

SQL>alter session set recyclebin=on;

禁用后删除的对象将直接删除,不会写到Recycle中,当然在删除时,指定purge参数,表也将直接删除,不会写到recyclebin中。

查看recyclebin中的对象列表:

SQL>show recyclebin

ORIGINALNAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

LOB_TEST         BIN$7tFn25vw2LTgQKjAXWNPFQ==$0TABLE        2013-12-31:16:32:49

查看recyclebin中对象:

SQL>  select original_name,object_name, TYPE,OPERATION, TS_NAME  from recyclebin;

ORIGINAL_NAME                    OBJECT_NAME                    TYPE       OPERATION TS_NAME

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

SYS_IL0000077688C00003$$         SYS_IL0000077688C00003$$       LOB INDEX  DROP     USERS

SYS_IL0000077688C00004$$         SYS_IL0000077688C00004$$       LOB INDEX  DROP     USERS

SYS_LOB0000077688C00003$$        SYS_LOB0000077688C00003$$      LOB       DROP      USERS

SYS_LOB0000077688C00004$$        SYS_LOB0000077688C00004$$      LOB        DROP     USERS

LOB_TEST                        BIN$7tFn25vw2LTgQKjAXWNPFQ==$0 TABLE     DROP      USERS

 

查看recyblebin对象里的内容:

SQL>select * from "BIN$7tFn25vw2LTgQKjAXWNPFQ==$0";

表空间的RecycleBin 区域只是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,因此Recycle Bin是和普通对象共用表空间的存储区域,或者说是Recycle Bin的对象要和普通对象抢夺存储空间。当发生空间不够时,Oracle会按照先入先出的顺序覆盖Recycle Bin中的对象。

 

也可以手动的删除RecycleBin占用的空间:

1).Purge tablespace tablespace_name: 用于清空表空间的RecycleBin

2).Purge tablespace tablespace_name user user_name: 清空指定表空间的RecycleBin中指定用户的对象

3).Purge recyclebin: 删除当前用户的Recycle Bin中的对象

4).Purge dba_recyclebin: 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限

5).Drop table table_name purge:  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。但可以用flashback database 恢复。

6).Purge index recycle_bin_object_name: 当想释放Recyclebin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。

 

2.4.3.2.Flashback Drop 实例操作

SQL>select original_name,object_name from recyclebin;

ORIGINAL_NAME         OBJECT_NAME

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

A                       BIN$RWXQQcTPRde0ws4h9ewJcg==$0

 

SQL> flashback table lob_test tobefore drop;

Flashbackcomplete.

 

当我们删除表A后,在新建表A,这时在恢复的时候就会报错,此时我们在闪回时,对表重命名就可以了:

SQL> flashback table a to beforedrop rename to B;

 

当我们删除表A,在新建表A,在删除它,这是在Recycle Bin中就会有2个相同的表明,此时恢复我们就要指定object_name才行.

 

SQL>select * from B;

ID

----------

1

2

3

SQL>drop table B;

表已删除。

SQL>create table B(name varchar(20));

表已创建。

SQL>drop table B;

表已删除。

SQL>select original_name, object_name from recyclebin;

ORIGINAL_NAME                    OBJECT_NAME

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

B                               BIN$vYuv+g9fTi2exYP9X2048Q==$0

B                               BIN$geQ9+NekSjuRvzG+TqDVWw==$0

 

SQL>flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop;

闪回完成。

SQL>select * from B;

ID

----------

1

2

3

一旦完成闪回恢复,RecycleBin中的对象就消失了.

如果表上索引或者约束等信息,这些信息也会被恢复,但是这些对象会使用Oracle自动的命名。我们需要查看这些对象,然后对这些对象重新命名:如:

SQL>selectindex_name from user_indexes where table_name = 'job_history';

INDEX_NAME

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

BIN$DBo9UChwZSbgQFeMiAdCcQ==$0

BIN$DBo9UChtZSbgQFeMiAdCcQ==$0

BIN$DBo9UChuZSbgQFeMiAdCcQ==$0

BIN$DBo9UChvZSbgQFeMiAdCcQ==$0

重命名:

SQL>alterindex "bin$dbo9uchtzsbgqfemiadccq==$0" rename to jhist_job_ix;

FlashbackDrop 需要注意的地方:

1).只能用于非系统表空间和本地管理的表空间

2).对象的参考约束不会被恢复,指向该对象的外键约束需要重建。

3).对象能否恢复成功,取决与对象空间是否被覆盖重用。

4).当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recyclebin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。

5).对于Recycle Bin中的对象,只支持查询.

 

2.4.4Flashback Query

Flashback是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。

FlashbackQuery分Flashback Query,FlashbackVersion Query,Flashback Transaction Query 三种。

 

2.4.4.1  Flashback Query

FlashbackQuery 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据。

flashbackquery 对v$tables, x$tables等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。

该特性也完全支持访问远端数据库,比如select * from tbl@dblink as of scn 3600;的形式。

 

2.4.4.1.1  多版本读一致性

不同的事务在写数据时,会将数据的前映像写入undo 表空间,这样如果同时有其它事务查询该表数据,则可以通过undo 表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。

Flashbackquery 有多种方式构建查询记录集,记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在undo 表空间中不同事务时的前映象。用法与标准查询非常类似,要通过flashbackquery 查询undo 中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn(基于scn)即可。

asof timestamp|scn 的语法是自9iR2 后才开始提供支持。

 

2.4.4.1.2  As of timestamp 的示例:

SQL>  alter session set nls_date_format='YYYY-MM-DDhh24:mi:ss';

会话已更改。

SQL>select sysdate from dual;

SYSDATE

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

2009-10-1519:04:16

SQL>select * from A;

ID

----------

2

1

3

4

模拟用户误操作,删除数据

SQL>delete from flashback_test;

1row deleted.

SQL>commit;

SQL>select * from flashback_test as of timestamp sysdate-5/1440;

        ID NAME

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

         1 foo

 

或者:

SQL>select* from flashback_test as of timestamp to_timestamp('2009-10-1519:04:16','YYYY-MM-DD hh24:mi:ss');

 

用FlashbackQuery恢复之前的数据:

SQL>insert into flashback_test select * from flashback_test as of timestampsysdate-5/1440;

1row created.

 

SQL>commit;

Commitcomplete.

 

如上述示例中所表示的,asof timestamp 的确非常易用,但是在某些情况下,我们建议使用as of scn 的方式执行flashback query,比如需要对多个相互有主外键约束的表进行恢复时,如果使用asof timestamp 的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过scn 方式则能够确保记录的约束一致性。

 

2.4.4.1.3.As of scn 示例

SQL>select * from A as of scn 1095782;

 

2.4.4.1.4  SCN 与 timestamp 关系

Oracle在内部都是使用scn,即使你指定的是as oftimestamp,oracle 也会将其转换成scn,系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME

SQL>desc sys.smon_scn_time

 Name                          Null?    Type

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

 THREAD                                 NUMBER

 TIME_MP                                NUMBER

 TIME_DP                                DATE

 SCN_WRP                                NUMBER

 SCN_BAS                                NUMBER

 NUM_MAPPINGS                           NUMBER

 TIM_SCN_MAP                            RAW(1200)

 SCN                                    NUMBER

 ORIG_THREAD                            NUMBER

 

每隔5 分钟,系统产生一次系统时间标记与scn 的匹配并存入sys.smon_scn_time 表,该表中记录了最近1440个系统时间标记与scn 的匹配记录,由于该表只维护了最近的1440 条记录,因此如果使用as of timestamp 的方式则只能flashback 最近5 天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。

 

注意理解系统时间标记与scn的每5 分钟匹配一次这句话,举个例子,比如scn:339988,339989分别匹配08-05-30 13:52:00 和08-05-3013:57:00,则当你通过as of timestamp 查询08-05-30 13:52:00 或08-05-30 13:56:59 这段时间点内的时间时,oracle 都会将其匹配为scn:339988 到undo 表空间中查找,也就说在这个时间内,不管你指定的时间点是什么,查询返回的都将是08-05-3013:52:00 这个时刻的数据。

查看SCN 和 timestamp 之间的对应关系:

SQL>select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

 

 

2.4.4.1.5  Flashback Query 函数,存储过程,包,触发器等对象

FlashbackDrop 可以闪回与表相关联的对象,如果是其他的对象,比如function,procedure,trigger等。 这时候,就需要使用到ALL_SOURCE表来进行Flashback Query。

 

先看联机文档对该表的说明:

ALL_SOURCEdescribes the text source of the stored objects accessible to the current user.

RelatedViews

DBA_SOURCEdescribes the text source of all stored objects in the database.

USER_SOURCEdescribes the text source of the stored objects owned by the current user. Thisview does not display the OWNER column.

如果我们误删除了某些对象,如procedure,就可以使用all_source 表进行恢复。

SQL>desc dba_source

 Name                                     Null?    Type

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

 OWNER                                              VARCHAR2(30)

 NAME                                              VARCHAR2(30)

 TYPE                                              VARCHAR2(12)

 LINE                                              NUMBER

 TEXT                                               VARCHAR2(4000)

 

查看dba_source的所有type

SQL>select type from dba_source group by type;

TYPE

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

PROCEDURE

PACKAGE

PACKAGEBODY

TYPEBODY

TRIGGER

FUNCTION

TYPE

7rows selected.

 

基于timestamp恢复的语句

SQL>SELECTtext

    FROM dba_source

         AS OF TIMESTAMP TO_TIMESTAMP ('XXXXX','YYYY-MM-DD HH24:MI:SS')

   WHERE owner = 'XXXX' AND name = '你删除的对象名'

ORDERBY line;

 

示例:

创建函数:

SQL>CREATE OR REPLACE function getdate return date

as

v_datedate;

begin

   select sysdate into v_date from dual;

   return v_date;

end;

/

Functioncreated.

 

查询函数:

SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Sessionaltered.

SQL>select getdate() from dual;

GETDATE()

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

2011-04-0721:02:09

 

查询dba_source表:

SQL>select text from dba_source where name='GETDATE' order by line;

TEXT

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

functiongetdate return date

as

  v_date date;

begin

   select sysdate into v_date from dual;

   return v_date;

end;

7rows selected.

 

drop函数,在查询,记录不存在

SQL>drop function getdate;

Functiondropped.

SQL>select text from dba_source where name='GETDATE' order by line;

norows selected

 

使用我们的FlashbackQuery 查询:

SQL>select text from dba_source as of timestamp to_timestamp('2011-04-0721:02:09','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;

TEXT

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

functiongetdate return date

as

  v_date date;

begin

   select sysdate into v_date from dual;

   return v_date;

end;

7rows selected.

 

这时候,又查看到了函数的代码,只需要把这些代码重新执行一下就ok了。其他对象和这个类似。 这里就不演示了。

 

2.4.4.2  Flashback Version Query

相对于FlashbackQuery 只能看到某一点的对象状态,Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录是如何发生变化的。根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态。

先看一个伪列ORA_ROWSCN,所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。

最熟悉的伪列就是ROWID,它相当于一个指针,指向记录在磁盘上的位置。ORA_ROWSCN 是Oracle10g新增的,暂且把它看作是记录最后一次被修改时的SCN Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。

 

举个例子:

SQL>select * from A;

ID

----------

2

1

3

4

SQL>insert into A values(5);

已创建 1 行。

SQL>select * from A;

ID

----------

2

1

3

4

5

SQL>commit;

SQL>select ora_rowscn, id from A;

ORA_ROWSCNID

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

   1098443 2

   1098443 1

   1098443 3

   1098443 4

   1098443 5

获取更多的历史信息

SQL>Selectversions_xid, versions_startscn, versions_endscn, DECODE(versions_operation,'I','Insert','U','Update','D','Delete','Original')"Operation", id from A versions between scn minvalue and maxvalue;

VERSIONS_XID    VERSIONS_STARTSCN VERSIONS_ENDSCNOperatio         ID

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

05001A0054020000           1099482                 Update            3

05001A0054020000           1099482                 Delete            3

05001A0054020000           1099482                 Delete            2

05001A0054020000           1099482                 Delete            1

0400150005020000           1098443                 Insert            5

或者

SQL>selectxid,commit_scn,commit_timestamp,operation,undo_sql fromflashback_transaction_query q where q.xid in(select versions_xid from Bversions between scn 413946 and 413959);

 

FlashbackVersion Query 技术其实有很多伪列,但是ORA_ROWSCN是最重要。它记录的是最后一次被修改时的SCN, 注意是被提交的修改。如果没有提交,这个伪列不会发生变化。

ORA_ROWSCN缺省是数据块级别的,也就是一个数据块内的所有记录都是一个ORA_ROWSCN,数据块内任意一条记录被修改,这个数据库块内的所有记录的ORA_ROWSCN都会同时改变。上例的查询结果可以证明。

不过我们可以在建表时使用关键字rowdependencies,可以改变这种缺省行为,使用这个关键字后,每条记录都有自己的ORA_ROWSCN。

 

举例:

SQL>create table B (id number(2)) rowdependencies;

表已创建。

SQL>insert into B values(1);

已创建 1 行。

SQL>insert into B values(2);

已创建 1 行

SQL>insert into B values(3);

已创建 1 行。

SQL>commit;

提交完成。

SQL>select ora_rowscn, id from B;

ORA_ROWSCN         ID

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

   1100560          1

   1100560          2

   1100560          3

 

此处SCN一样,一定很奇怪,这正好说明是最后一次被修改时的SCN,如果没有提交,是不会变的,我们重做一下就清楚了。

SQL>analyze table B compute statistics;

表已分析。

SQL>select ora_rowscn, id from B;

ORA_ROWSCN         ID

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

   1100560          1

   1100560          2

   1100560          3

SQL>delete from B;

已删除4行。

SQL>select ora_rowscn, id from B;

未选定行

SQL>insert into B values(1);

已创建 1 行。

SQL>commit;

提交完成。

SQL>insert into B values(2);

已创建 1 行。

SQL>commit;

提交完成。

SQL>select ora_rowscn, id from B;

ORA_ROWSCN         ID

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

   1100723          1

   1100729          2

 

2.4.4.3  Flashback Transaction Query

FlashbackTransaction Query也是使用UNDO信息来实现。利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query视图,这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。

示例:

SQL>insert into B values(3);

已创建 1 行。

SQL>commit;

提交完成。

SQL>select * from B;

ID

----------

1

2

3

查看视图,每个事务都对应相同的XID

SQL>Selectxid,operation,commit_scn,undo_sql from flashback_transaction_query where xid in(Select versions_xid from B versions between scn minvalue and maxvalue);

XID              OPERATION         COMMIT_SCN  UNDO_SQL

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

03001C006A020000DELETE            1100723     insert into"SYS"."B"("ID") values ('4');

03001C006A020000DELETE            1100723     insert into"SYS"."B"("ID") values ('3');

03001C006A020000DELETE            1100723     insert into"SYS"."B"("ID") values ('2');

 

或者

SQL>selectxid,commit_scn,commit_timestamp,operation,undo_sql fromflashback_transaction_query q where q.xid in(select versions_xid from Bversions between scn 413946 and 413959);

 

2.4.5Flashback Table

注意SYS用户不支持闪回,这点前面已经说明过。

FlashbackTable也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。

 

注意:如果想要对表进行flashback,必须允许表的row movement。

SQL>Altertable table_name row movement;

要查看某表是否启用rowmovement,可以到user_tables中查询(或all_tables,dba_tables)。

例如:

SQL>select row_movement from user_tables where table_name='C';

ROW_MOVE

--------

ENABLED

 

要启用或禁止某表rowmovement,可以通过下列语句:

--启用

SQL>ALTER TABLE table_name ENABLE ROW MOVEMENT;

 

--禁止

SQL>ALTER TABLE table_name DISABLE ROW MOVEMENT;

 

举例:

SQL>create table C (id number(2));

SQL>insert into C values(1);

SQL>insert into C values(2);

SQL>commit;

SQL>select * from c;

        ID

----------

         1

         2

SQL>alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";

SQL>select sysdate from dual;

SYSDATE

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

2009-10-1521:17:47

SQL>select current_scn from v$database;

CURRENT_SCN

-----------

    1103864

SQL>delete from C;

SQL>commit;

SQL>alter table c enable row movement;

SQL>flashback table c to scn 1103864;

或者

SQL>flashback table c to timestamp to_timestamp('2009-10-15 21:17:47','yyyy-mm-ddhh24:mi:ss');

SQL>select * from c;

        ID

----------

         1

         2

 

Flashbacktable 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。

如:

flashbacktable a,b,c to scn 1103864;

 

一些注意事项:

(1)基于undo 的表恢复,需要注意DDL 操作的影响。修改并提交过数据之后,对表做过DDL 操作,包括:drop/modify 列, move 表, drop 分区(如果有的话),truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。

ORA-01466:unable to read data - table definition has changed

 

另外一些表结构修改语句虽然并不会影响到undo表空间中的撤销记录,但有可能因表结构修改导致undo中重做记录无法应用的情况,比如对于增加了约束,而flashback query查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。

(2)基于undo的表恢复,flashback table实际上做的也是dml操作(会在被操作的表上加dml锁),因此还需要注意triggers对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable掉与其操作表相关的triggers,如果你希望在此期间trigger能够继续发挥做用,可以在flashback table 后附加 ENABLE TRIGGERS 子句。

 

2.4.6 Oracle Flashback Data Archive

在Oracle 11g里又出了一个新特性:Oracle Flashback Data Archive。在11g的官方文档里搜到了相关内容说明,参考:

UsingOracle Flashback Technology

                  --Using Flashback DataArchive (Oracle Total Recall)

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17125/adfns_flashback.htm#BJFIEJGG

 

2.4.6.1  Flashback Data Archive 说明

官网的定义如下:

FlashbackData Archive provides the ability to track and store transactional changes to atable over its lifetime. A Flashback Data Archive is useful for compliance withrecord stage policies and audit reports.

--FlashbackData Archive 在它的有效期内将保存事务改变的信息。

AFlashback Data Archive consists of one or more tablespaces or parts thereof.You can have multiple Flashback Data Archives. If you are logged on as SYSDBA,you can specify a default Flashback Data Archive for the system. A FlashbackData Archive is configured with retention time. Data archived in the FlashbackData Archive is retained for the retention time.

--FDA 包含一个或者多个表空间,我们可以创建多个FDA。当以sysdba 登陆时,可以指定default FDA。

Bydefault, flashback archiving is off for any table. You can enable flashbackarchiving for a table if all of these conditions are true:

-- 默认情况下,FDA 是关闭的,当具备一下条件时,我们可以启用FDA。

(1).You have the FLASHBACK ARCHIVE object privilege on the FlashbackData Archive to use for that table.

(2).The table is neither nested, clustered, temporary, remote, orexternal.

(3).The table contains neither LONG nor nested columns.

Afterflashback archiving is enabled for a table, you can disable it only if youeither have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are loggedon as SYSDBA.

当FDA 启动以后,只有具有FLASHBACK ARCHIVE ADMINISTER 权限的用户或者用SYSDBA登陆的用户才可以禁用FDA。

Whenchoosing a Flashback Data Archive for a specific table, consider the dataretention requirements for the table and the retention times of the FlashbackData Archives on which you have the FLASHBACK ARCHIVE object privilege.

给用户赋:

SQL>create user foo identified by foo default tablespace users temporary tablespacetemp;

SQL>grant resource,connect to foo;

SQL>grant flashback archive administer to foo;

SQL>select * from dba_sys_privs where grantee='FOO';

GRANTEE        PRIVILEGE                           ADM

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

DVD            FLASHBACK ARCHIVE ADMINISTER        NO

DVD            UNLIMITED TABLESPACE                NO

 

在Oracle 10g中的flashback 包括:flashback version query、flashback transaction query、flashbackdatabase、flashback table和flashbackdrop等特性。

在这些闪回技术当中,除了Flashback Database(依赖于闪回日志)之外,其他的闪回技术都是依赖于Undo撤销数据,都与数据库初始化参数UNDO_RETENTION密切相关。

 

它们是从撤销数据中读取信息来构造旧数据的。这样就有一个限制,就是undo中的信息不能被覆盖。而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过 undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,设置过大,可能导致undotablespace快速膨胀。

 

Oracle11g中flashback得到了增加:Flashback Data Archive特性。该技术与之前的Flashback的实现机制不同,通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大地减少空间需求。

Flashback Data Archive并不是记录数据库的所有变化,而只是记录了指定表的数据变化。所以,Flashback Data Archive是针对对象的保护,是FlashbackDatabase的有力补充。

通过FlashbackData Archive,可以查询指定对象的任何时间点(只要满足保护策略)的数据,而且不需要用到undo,这在有审计需要的环境,或者是安全性特别重要的高可用数据库中,是一个非常好的特性。缺点就是如果该表变化很频繁,对空间的要求可能很高。

 

闪回数据归档区

闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。

每一个闪回数据归档区都可以有一个唯一的名称。同时,每一个闪回数据归档区都对应了一定的数据保留策略。

例如可以配置归档区FLASHBACK_DATA_ARCHIVE_1中的数据保留期为1年,而归档区FLASHBACK_DATA_ARCHIVE_2的数据保留期为2天或者更短。以后如果将表放到对应的闪回数据归档区,则就按照该归档区的保留策略来保存历史数据。

闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对Undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。

 

Flashbackarchive相关数据字典

*_FLASHBACK_ARCHIVE         Displays information about Flashback DataArchive files.

*_FLASHBACK_ARCHIVE_TS      Displays tablespaces of Flashback Data Archivefiles.

*_FLASHBACK_ARCHIVE_TABLES Displays information about tables thatare enabled for Data Flashback Archive files.

* 代表DBA 或者User。

Flashbackarchive的后台进程

Oracle11g为Flashback data archive特性专门引入了一个新的后台进程FBDA,用于将追踪表(traced table,也就是将指定使用flashback data archive的table)的历史变化数据转存到闪回归档区。

SQL> select name, description fromv$bgprocess where name='FBDA';

NAME  DESCRIPTION

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

FBDA  Flashback Data Archiver Process

 

Flashbackarchive 的限制条件

(1)Flashback data archive只能在ASSM的tablespace上创建

(2)Flashback data archive要求必须使用自动undo管理,即 undo_management 参数为auto

 

2.4.6.2  Flashback Data Archive 的相关操作

2.4.6.2.1Creating a Flashback Data Archive

Createa Flashback Data Archive with the CREATE FLASHBACK ARCHIVE statement,specifying:

(1)Name of the Flashback Data Archive

(2)Name of the first tablespace of the Flashback Data Archive

(3)(Optional) Maximum amount of space that the Flashback Data Archivecan use in the first tablespace。The default isunlimited. Unless your space quota on the first tablespace is also unlimited,you must specify this value; otherwise, error ORA-55621 occurs.

(4)Retention time (number of days that Flashback Data Archive data forthe table is guaranteed to be stored)

 

--  创建FDA 时,可以指定以上4个参数,没有指定Flashback Archive的配额,默认为 unlimited。这里的配额,只的是用户对表空间的配额。

Ifyou are logged on as SYSDBA, you can also specify that this is the defaultFlashback Data Archive for the system. If you omit this option, you can stillmake this Flashback Data Archive the default later .

-- 如果以SYSDBA 登陆,还可以指定default Flashback DataArchive。 如果没有指定,也可以通过alter flashback archive 命令来指定。

示例:

(1).先创建几个测试的表空间

SQL>create tablespace FDA1 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA01.dbf'size 100M;

Tablespacecreated.

SQL>create tablespace FDA2 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA02.dbf'size 100M;

Tablespacecreated.

SQL>create tablespace FDA3 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA03.dbf'size 100M;

Tablespacecreated.

SQL>create tablespace FDA4 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA04.dbf'size 100M;

Tablespacecreated.

(2).创建一个默认的Flashback Archive, 配额为10M,数据保留期为1年

SQL>create flashback archive default fla1 tablespace fda1 quota 10M retention 1year;

默认的FlashbackArchive 只能有一个:

SQL>create flashback archive default fla3 tablespace fda1 quota 10M retention 1year;

createflashback archive default fla3 tablespace fda1 quota 10M retention 1 year

                                                *

ERRORat line 1:

ORA-55609:Attempt to create duplicate default Flashback Archive

这里报错了,我们可以是使用alter flashback 来修改默认的Flashback Archive。

(3).创建一个Flashback Archive fla2,使用默认配额unlimited。 retention 为2 年。

SQL>create flashback archive fla2 tablespace fda2 retention 2 year;

Flashbackarchive created.

根据官网的说法,这种情况下,用户对该表空间的配额也必须为ulimited。 否则就会报错ORA-55621。

测试一下:

SQL>conn / as sysdba;

Connected.

SQL>revoke unlimited tablespace from dvd;

Revokesucceeded.

SQL>alter user foo quota 10m on fda4;

Useraltered.

SQL>conn foo/foo;

Connected.

SQL>create flashback archive fla5 tablespace fda4 retention 1 day;

createflashback archive fla5 tablespace fda4 retention 1 day

                                         *

ERRORat line 1:

ORA-55621:User quota on tablespace "FDA4" is not enough for Flashback Archive

报错。

 

修改用户的配合,在创建,成功:

SQL>conn / as sysdba;

Connected.

SQL>grant unlimited tablespace to foo;

Grantsucceeded.

SQL>conn foo/foo;

Connected.

SQL>create flashback archive fla5 tablespace fda4 retention 1 day;

Flashbackarchive created.

 

2.4.6.2.2  Altering a Flashback Data Archive

Withthe ALTER FLASHBACK ARCHIVE statement, you can:

-- 使用alter flashback archive 可以修改如下内容:

(1)Change the retention time of a Flashback Data Archive

(2)Purge some or all of its data

(3)Add, modify, and remove tablespaces

Note:

Removingall tablespaces of a Flashback Data Archive causes an error.

Ifyou are logged on as SYSDBA, you can also use the ALTER FLASHBACK ARCHIVEstatement to make a specific file the default Flashback Data Archive for thesystem.

-- 不能移除Flashback Data Archive里的所有表空间。否则报错。如果用sysdba登陆,可以修改默认的Flashback archive。

 

示例:

2.2.1  将FlashbackData Archive 修改为default FA

先用我们具有flashbackarchive administer 权限的用户试试:

SQL>conn foo/foo;

Connected.

SQL>alter flashback archive fla1 set default;

alterflashback archive fla1 set default

*

ERRORat line 1:

ORA-55611:No privilege to manage default Flashback Archive

报错,没有权限,用sysdba测试成功:

SQL>conn / as sysdba;

Connected.

SQL>alter flashback archive fla1 set default;

Flashbackarchive altered.

注意一点,只能有一个默认的Flashback archive.

 

SQL>select flashback_archive_name name, status from dba_flashback_archive;

NAME       STATUS

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

FLA1       DEFAULT

FLA2

 

当前默认的FlashbackArchive 是FLA1,我们将默认改成FLA2,在查看:

SQL>alter flashback archive fla2 set default;

Flashbackarchive altered.

SQL>select flashback_archive_name name, status from dba_flashback_archive;

NAME       STATUS

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

FLA1

FLA2       DEFAULT

 

2.2.2  为已经存在的FlashbackArchive 添加表空间,并指定配额

SQL>alter flashback archive fla1 add tablespace fda3 quota 20M;

Flashbackarchive altered.

 

 

2.2.3为已经存在的Flashback Archive 添加表空间,不指定配额,即需要多少用多少空间

SQL>  alter flashback archive fla1 add tablespacefda4;

Flashbackarchive altered.

 

2.2.4  修改已经存在的FlashbackArchive的配额

SQL>alter flashback archive fla1 modify tablespace fda1 quota 20m;

Flashbackarchive altered.

 

2.2.5  修改配额不受限制

SQL>alter flashback archive fla1 modify tablespace fda1;

Flashbackarchive altered.

 

2.2.6修改Flashback Archive 的retentiontime

SQL>alter flashback archive fla1 modify retention 2 year;

Flashbackarchive altered.

SQL>alter flashback archive fla1 modify retention 1 month;

Flashbackarchive altered.

SQL>alter flashback archive fla1 modify retention 2 month;

Flashbackarchive altered.

SQL>alter flashback archive fla1 modify retention 2 day;

Flashbackarchive altered.

SQL>alter flashback archive fla1 modify retention 1 day;

Flashbackarchive altered.

 

2.2.7  将表空间从FlashbackArchive中移除

SQL>alter flashback archive fla1 remove tablespace fda4;

Flashbackarchive altered.

-- 注意,这里移除的仅仅是Flashback Archive中的信息,表空间不会被删除。

 

2.2.8  清空FlashbackArchive中的所有历史记录

SQL>alter flashback archive fla1 purge all;

Flashbackarchive altered.

 

2.2.9清空Flashback Archive中超过1天的历史数据

SQL>alter flashback archive fla1 purge before timestamp (systimestamp - interval'1' day);

Flashbackarchive altered.

 

2.2.10  清空FlashbackArchive中指定SCN 之前的所有历史数据

SQL>select current_scn from v$database;

CURRENT_SCN

-----------

 1315755078

SQL>alter flashback archive fla1 purge before scn 1315755078;

Flashbackarchive altered.

我这里只是演示一个SCN。具体要结合自己的情况。

 

2.4.6.2.3  Dropping a Flashback Data Archive

Dropa Flashback Data Archive with the DROP FLASHBACK ARCHIVE statement. Dropping aFlashback Data Archive deletes its historical data, but does not drop itstablespaces.

--  删除FlashbackArchive 不会删除相应的表空间

示例:

SQL>DROP FLASHBACK ARCHIVE fla2;

Flashbackarchive dropped.

SQL>  select flashback_archive_name name,status  from dba_flashback_archive;

NAME       STATUS

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

FLA1

 

2.4.6.2.4  Specifying the Default Flashback Data Archive

Bydefault, the system has no default Flashback Data Archive. If you are logged onas SYSDBA, you can specify default Flashback Data Archive in either of theseways:

默认情况下,没有defaultFlashback Data Archive,当以sysdba 登陆之后,就可以指定它。

 

2.4.1修改已经存在的Flashback Archive 为default

SQL>alter flashback archive fla1 set default;

Flashbackarchive altered.

SQL>alter flashback archive fla10 set default;

alterflashback archive fla10 set default

*

ERRORat line 1:

ORA-55605:Incorrect Flashback Archive is specified

如果指定的Flashback不存在,就报错。

 

2.4.2在创建Flashback Data Archive 时,指定default

SQL>createflashback archive default fla2 tablespace tbs1 quota 10m retention 1 year;

Thedefault Flashback Data Archive for the system is the default Flashback DataArchive for every user who does not have his or her own default Flashback DataArchive.

 

2.4.6.2.5  Enabling and Disabling Flashback Data Archive

Bydefault, flashback archiving is disabled for any table. You can enableflashback archiving for a table if you have the FLASHBACK ARCHIVE objectprivilege on the Flashback Data Archive to use for that table.

默认情况下,所有表都没有启动flashback archive。

Toenable flashback archiving for a table, include the FLASHBACK ARCHIVE clause ineither the CREATE TABLE or ALTER TABLE statement.

Inthe FLASHBACK ARCHIVE clause, you can specify the Flashback Data Archive wherethe historical data for the table are stored. The default is the default FlashbackData Archive for the system. If you specify a nonexistent Flashback DataArchive, an error occurs.

Ifyou enable flashback archiving for a table, but AUM(automatic undo managed) isdisabled, error ORA-55614 occurs when you try to modify the table.

Ifa table has flashback archiving enabled, and you try to enable it again with adifferent Flashback Data Archive, an error occurs

Afterflashback archiving is enabled for a table, you can disable it only if youeither have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are loggedon as SYSDBA.

Todisable flashback archiving for a table, specify NO FLASHBACK ARCHIVE in theALTER TABLE statement. (It is unnecessary to specify NO FLASHBACK ARCHIVE inthe CREATE TABLE statement, because that is the default.)

 

示例:

2.5.1创建table,使用默认的FlashbackData Archive来存储历史数据

SQL> create table table1 (id number)flashback archive;

Tablecreated.

2.5.2创建table,使用指定的FlashbackData Archive 来存储历史数据

SQL> create table table2 (id number)flashback archive fla1;

Tablecreated.

2.5.3对表启用Flashback archive,并使用默认的Flashback archive。

SQL> alter table dave flashbackarchive;

Tablealtered.

2.5.4禁用表的Flashback Archive

SQL> alter table dave no flashbackarchive;

Tablealtered.

2.5.5对table 启用Flashbackarchive,并指定Flashaback Archive区。

SQL> alter table dave flashbackarchive fla1;

Tablealtered.

 

2.4.6.2.6DDL Statements on Tables Enabled for Flashback Data Archive

FlashbackData Archive supports many DDL statements, including some that alter the tabledefinition or move data. For example:

--启动Flashback Data Archive的表支持以下的DDL 操作

(1)ALTER TABLE statement that does any of the following:

1)Adds,drops, renames, or modifies a column

2)Adds,drops, or renames a constraint

3)Drops ortruncates a partition or subpartition operation

(2)TRUNCATE TABLE statement

(3)RENAME statement that renames a table

SomeDDL statements cause error ORA-55610 when used on a table enabled for FlashbackData Archive. For example:

-- 启动Flashback Data Archive的表上的一些DDL 操作可能触发ORA-55610的错误,这些DDL 如下:

(1)ALTER TABLE statement that includes an UPGRADE TABLE clause, with orwithout an INCLUDING DATA clause

(3)ALTER TABLE statement that moves or exchanges a partition orsubpartition operation

(3)DROP TABLE statement

 

Ifyou must use unsupported DDL statements on a table enabled for Flashback DataArchive, use theDBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBAprocedure to disassociate the base table from its Flashback Data Archive.

Toreassociate the Flashback Data Archive with the base table afterward, use theDBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBAprocedure.

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

TheDBMS_FLASHBACK_ARCHIVE package contains two simple procedures fordisassociation and reassociation of a Flashback Data Archive (FDA) enabledtable from/with its underlying FDA respectively.

 

在FlashbackArea中,会有一张历史表记录着我们启动FA表的所有操作。 我们可以通过如下SQL 来查看他们之间的映射关系。

SQL>SELECT table_name,archive_table_name,status from dba_flashback_archive_tables;

TABLE_NAMEARCHIVE_TABLE_NAME   STATUS

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

ANQING     SYS_FBA_HIST_78429   ENABLED

table2     SYS_FBA_HIST_78431   ENABLED

ORA        SYS_FBA_HIST_78448   ENABLED

DVD        SYS_FBA_HIST_78456   ENABLED

HUAINING   SYS_FBA_HIST_78464   ENABLED

QS         SYS_FBA_HIST_78472   ENABLED

FA         SYS_FBA_HIST_78484   ENABLED

7rows selected.

 

我们要执行那些不支持的DDL,就需要用dbms_flashback_archive禁用他们之间的映射关系,在操作,操作完在用该包启用他们。

 

关于dbms_flashback_archive包的使用,参考官网:

DBMS_FLASHBACK_ARCHIVE

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_flashb_archive.htm#ARPLS72464

 

示例:

SQL>drop table table2;

droptable table2

           *

ERRORat line 1:

ORA-55610:Invalid DDL statement on history-tracked table

这个表使我们之前创建的,并启用了Flashback Archive.

表的分离和重新结合:

SQL> execdbms_flashback_archive.disassociate_fba('SYS','table2');

PL/SQLprocedure successfully completed.

SQL>exec dbms_flashback_archive.reassociate_fba('SYS','table2');

PL/SQLprocedure successfully completed.

最后我们在分离,在droptable:

SQL>exec dbms_flashback_archive.disassociate_fba('SYS','table2');

PL/SQLprocedure successfully completed.

SQL>drop table table2;

droptable table2

           *

ERRORat line 1:

ORA-55610:Invalid DDL statement on history-tracked table

drop失败。

表情: - -

猜测:灵异事件。

google一下,说是bug:9650074

9650074ORA-55633 in Flashback data archive DDL support area

结果metalink 又不读开,这个网络啊。先不研究了。

 

2.4.6.3  一个用FlashbackData Archive 恢复数据的测试

这个测试使用之前的FlashbackArchive: fla1.

创建测试表:

SQL>create table fa(id number) flashback archive;

Tablecreated.

插入数据:

SQL>declare

  2  inumber;

  3 begin

  4  fori in 1..100 loop

  5 insert into fa values(i);

  6  endloop;

  7 commit;

  8  end;

  9  /

PL/SQLprocedure successfully completed.

SQL>select count(*) from fa;

  COUNT(*)

----------

  100

查询时间:

SQL>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;

TM

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

2011-05-1115:33:35

在update 一次数据:

SQL>update fa set id=200 where id <50;

49rows updated.

SQL>commit;

在查询一次时间:

SQL>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;

TM

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

2011-05-1115:35:23

使用FlashbackArchive查询1分钟之前的数据:

SQL>select count(*) from fa as of timestamp (systimestamp - interval '1'minute);

  COUNT(*)

----------

       100

使用FlashbackArchive查询10分钟之前的数据:

SQL>select count(*) from fa as of timestamp (systimestamp - interval '10'minute);

  COUNT(*)

----------

     0

这里显示为0. 因为我们还没有做DML 操作。

或者使用时间来查:

SQL>select count(*) from fa as of timestamp to_timestamp('2011-05-1115:35:23','yyyy-mm-dd hh24:mi:ss');

   COUNT(*)

----------

       100

SQL>delete from fa;

100rows deleted

SQL>commit;

Commitcomplete.

SQL>  select count(*) from fa as of timestamp(systimestamp - interval '1'minute);

  COUNT(*)

----------

       100

根据时间的不同,查询的结果也不一样。 下面我们来确认下这个问题:

SQL>SELECT * from dba_flashback_archive_tables;

TABLE_NAMEOWNER_NAME FLASHBACK_ARCHI ARCHIVE_TABLE_NAME  STATUS

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

FA         SYS        FLA1            SYS_FBA_HIST_78484   ENABLED

从这个结果,可以看出,在Flashbackarchive对应的FA表的历史表是SYS_FBA_HIST_78484。

 

该表保存了FA表的所有的操作记录:

SQL>select count(*) from SYS_FBA_HIST_78484;

  COUNT(*)

----------

       149

SQL>desc SYS_FBA_HIST_78484

 Name                                     Null?    Type

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

 RID                                               VARCHAR2(4000)

 STARTSCN                                          NUMBER

 ENDSCN                                            NUMBER

 XID                                               RAW(8)

 OPERATION                                         VARCHAR2(1)

 ID                                                NUMBER

 

注意一点:我们不能对这些历史表做任何修改操作,只能查询。

如果想对这些历史表进行相关的修改操作,和之前的操作一样:使用dbms_flashback_archive分离2个表之间的关系。

如:

sql>exec dbms_flashback_archive.disassociate_fba('scott','emp_test');

sql>exec dbms_flashback_archive.reassociate_fba('scott','emp_test');

 

 

11g r2中对闪回数据归档的增强

11gr1中引入了闪回数据归档新特性,其工作原理是为针对启用了归档方式的表,FBDA进程将创建对应于该表的内部历史表。历史表将拥有原始表的所有列加上某些时间戳列以便跟踪事务处理的变化,具体如下:

SQL>desc SYS_FBA_HIST_75718;

 Name                                     Null?    Type

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

 RID                                               VARCHAR2(4000)

 STARTSCN                                          NUMBER

 ENDSCN                                            NUMBER

 XID                                                RAW(8)

 OPERATION                                         VARCHAR2(1)

 T1                                                NUMBER(38)

 T2                                                VARCHAR2(20)

/* 注意其中T1,T2为原始表上的应用数据列 */

 

当更新或删除被跟踪的原始表的行记录时,FBDA进程将为归档标记事务处理和相应的撤销记录。历史表中将记录所有delete或update事务处理之前的行的前镜像。但如果是insert事务的话则不引起任何记录被添加到历史表中,因为这一新行没有前历史数据。
如同10g中的flashback query一样闪回数据归档依赖于撤销数据,FBDA进程会在系统确定的时间段内被唤醒(默认为5分钟),并将标记了的事务处理的撤销数据复制到历史表中。因此,当一个表发生修改时,变化不会立即体现在历史表中,需要几分钟(>5分钟)时间才能在历史表中看到。当数据库正在产生大量的撤销数据,则它将调整FBDA后台进程的睡眠时间,使用它能够快速地从数据库高速缓冲中读取到撤销数据。在FBDA进程在历史表中完成记录前事务处理(撤销)数据之前,数据库不会重用标记为归档的撤销记录。仅当FBDA进程完成历史记录,这些撤销段才被标示为可再次循环使用。

 

The‘fbda’ process intelligently adjusts its sleep interval based on the systemundo generation
rate. As transaction activity increases, ‘fbda’ automatically reduces its sleepinterval from the
default of 5 minutes. For better performance, ‘fbda’ also adjusts its sleeptime in order to
maximize undo data reads from the buffer cache. In addition, Flashback DataArchive uses an
internal partitioning scheme for all the historical data for better peformance,and it uses table
compression to reduce the storage footprint of the historical data.

 

11gr1中针对启用闪回数据归档的表不能实施truncate,alter table addcolumn等操作,否则会报ORA-55610错误:

55610,00000, "Invalid DDL statement on history-tracked table"

//*Cause: An attempt was made to perform certain DDL statement that is

//         disallowed on tables that are enabledfor Flashback Archive.

//*Action: No action required.

//

在11g r2中闪回数据归档特性得到了加强,现在支持对被跟踪表的部分DDL操作,最有用的可能还是truncate和alter table操作:

SQL>select * from v$version;

 

BANNER

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

OracleDatabase 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production

PL/SQLRelease 11.2.0.2.0 - Production

CORE    11.2.0.2.0      Production

TNSfor Linux: Version 11.2.0.2.0 - Production

NLSRTLVersion 11.2.0.2.0 - Production

 

SQL>  create table orz (t1 int) flashback archivefba;

Tablecreated.

 

SQL>col owner_name for a15;

SQL>col table_name for a10;

SQL>col flashback_archive_name for a15;

SQL>set linesize 200;

 

/* 可以看到这里历史记录表式SYS_FBA_HIST_75744,这些历史记录表默认均采用分区且压缩的特性 */

 

SQL>select * from dba_flashback_archive_tables where table_name = 'ORZ';

TABLE_NAMEOWNER_NAME      FLASHBACK_ARCHIARCHIVE_TABLE_NAME     STATUS

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

ORZ        TABLE3         FBA             SYS_FBA_HIST_75744    ENABLED

 

/* 在正式产生闪回归档前历史表"并不存在"  */

 

SQL>select * from dba_objects where owner='SYS_FBA_HIST_75744';

norows selected

 

SQL>insert into orf values(1);

1row created.

 

SQL>commit;

Commitcomplete.

 

SQL>set timing on;

 

/* 很小的一个表,truncate却花了10s */

SQL>truncate table orz;

Tabletruncated.

Elapsed:00:00:10.02

 

SQL>col object_name for a20;

SQL>select object_name,subobject_name,object_type from dba_objects whereobject_name='SYS_FBA_HIST_75744';

OBJECT_NAME          SUBOBJECT_NAME                 OBJECT_TYPE

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

SYS_FBA_HIST_75744   HIGH_PART                      TABLE PARTITION

SYS_FBA_HIST_75744                                  TABLE

 

SQL>col rid for a25;

SQL>col t1 for 99;

SQL>select * from table3.SYS_FBA_HIST_75744;

RID                         STARTSCN     ENDSCN XID              O T1

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

AAASfgAAEAAAAImAAA           1066139    1066237 08001F0028030000 I   1

 

SQL>insert into orz select object_id from dba_objects;

73064rows created.

 

SQL>commit;

Commitcomplete.

 

SQL>select current_scn from v$database;

 

CURRENT_SCN

-----------

    1072650

 

SQL>truncate table orz;

Tabletruncated.

 

SQL>select count(*) from table3.SYS_FBA_HIST_75744;

  COUNT(*)

----------

     73065

 

SQL>select count(*) from orz;

  COUNT(*)

----------

         0

 

SQL>select count(*) from orz as of scn 1072650;

  COUNT(*)

----------

     73064

 

/*flashback archiver闪回数据归档加强了flashback query闪回查询的功能,这对那些需要检查数据全部历史的应用来说是一个惊喜!*/

 

/* 遗憾的是闪回数据归档并非需要对跟踪表做任意类型的DDL操作,很明显drop就不行;当然针对drop我们可以用到其他的闪回技术 */

 

SQL>drop table orz;

droptable orz

           *

ERRORat line 1:

ORA-55610:Invalid DDL statement on history-tracked table

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值