10G支持下列FLASHBACK
flashback database
flashback drop
flashback versions query
flashback transaction query
flashback table
需要注意的是:后面三种还是基于UNDO RETENTION的
[@more@]一、FLASHBACK DATABASE
flashback database作用上相当于不完全恢复,它通过flashback database logs实现
实现机制:当flashback database被起用,后台进程RVWR就被启动,SGA中就会分配flashback buffer,RVWR会把数据从flashback buffer中以循环重用的方式写入到flashback log中。flashback log不被归档。
RVWR进程将数据块的前镜像写入到flashback log,当需要flashback的时候,这些flashback log中的块镜像就会被应用,然而flashback log并不一定是连续的,如果是断裂的,那么将会使用REDO LOG中的镜像填补GAP
flashback database的配置:
SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2880;
SQL> ALTER DATABASE FLASHBACK ON;
SQL> SELECT flashback_on FROM v$database;
几个例子:RMAN> FLASHBACK DATABASE TO TIME = TO_DATE ('2002-12-10 16:00:00', 'YYYY-MM-DD HH24:MI:SS');
RMAN> FLASHBACK DATABASE TO SCN=23565;
RMAN> FLASHBACK DATABASE TO SEQUENCE=223 THREAD=1;
SQL> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24);
SQL> FLASHBACK DATABASE TO SCN 53943;
监控:
SQL> SELECT estimated_flashback_size, flashback_size FROM V$FLASHBACK_DATABASE_LOG;
SQL> SELECT oldest_flashback_scn, oldest_flashback_time FROM V$FLASHBACK_DATABASE_LOG;
SQL> SELECT * FROM V$FLASHBACK_DATABASE_STAT;
每小时记录一次统计值到V$FLASHBACK_DATABASE_STAT
如何在flashback database时排除一个tablespace
ALTER TABLESPACE FLASHBACK {ON|OFF}
SQL> SELECT name, flashback_on FROM v$tablespace;
限制:
flashback database后只能以read only或者resetlogs的方式打开数据库
如果控制文件被还原或重建,那么将不能flashback database
如果表空间被drop,将不能flash database
如果数据文件被shrunk,将不能flash database
不能把数据库flash back到resetlogs之前
FLASHBACK DATABASE TO ... 的前提条件是数据库为归档模式且实例处于MOUNT状态.
二、flashback drop
将表flashback到被drop之前
实现方式:recycle bin,相关视图:dba_recyclebin
命令:FLASHBACK TABLE TO BEFORE DROP [RENAME TO ];
对recycle bin中可能有多个相同original name的对象的情况,ORACLE采用LIFO的方式处理
recycle bin空间的回收问题:
手工回收:purge命令
自动回收:因空间压力导致自动回收。对表空间而言,它会首先使用非recycle bin的空间,然后是recycle bin的空间,最后是如果数据文件可以自动扩展,则扩展空间。
PURGE TABLE回收某个表的空间
PURGE INDEX回收某个索引的空间
PURGE TABLESPACE回收属于某个表空间的RECYCLE BIN的空间
PURGE RECYCLEBIN回收属于某个用户的RECYCLE BIN的空间
PURGE DBA_RECYCLEBIN回收所有RECYCLE BIN的空间
对于purge table/purge index,如果指定的original name对应多个对象,那么将回收最早被DROP的对象的空间,即所谓FIFO
如何跳过recycle bin直接删除对象?DROP TABLE [PURGE] ;
DROP TABLESPACE [INCLUDING CONTENTS] ;
DROP USER [CASCADE] ;
对于在recycle bin的对象,仍然可以在DBA_TABLES,DBA_OBJECTS, DBA_SEGMENTS中查到,比如dba_tables中设置了dropped列用于区分是否是被DROP的对象。这些对象也可以通过select语句查询内容,即flashback queries
通过RECYCLE BIN保护的表:
非系统、以本地管理方式管理的表空间,没有使用FGA或者VPD
不通过RECYCLE BIN保护的对象:
Bitmap-join的索引,MVIEW LOGS,外键完整性约束,在表被DROP之前DROP的索引
被PURGE的表是不能再FLASH BACK的
三、flashback versions query
通过在SELECT语句中指定VERSIONS子句,flashback versions query用于查询两个时间点或者两个SCN之间ROWS的不同VERSIONS数据。
几个伪列:
VERSIONS_STARTTIME
VERSIONS_STARTSCN
VERSIONS_ENDTIME
VERSIONS_ENDSCN
VERSIONS_XID
VERSIONS_OPERATION
如果行的VERSION创建时间早于指定的时间或者在UNDO_RETENTION之前,VERSIONS_STARTTIME和VERSIONS_STARTSCN的值为NULL,如果在查询时间行的VERSION仍然是活动的,或者是一个已经删除的VERSION,那么VERSIONS_ENDTIME和VERSIONS_ENDSCN的值都是NULL
语法:SELECT [Pseudocolumns]…
FROM …
VERSIONS BETWEEN
{SCN|TIMESTAMP {expr|MINVALUE} AND
{expr|MAXVALUE}}
[AS OF {SCN|TIMESTAMP expr}]
WHERE [Pseudocolumns…]…
限制:
flashback versions query不能用于外部表、临时表、视图、FIXED TABLE,不能跨DDL语句,会过滤掉一些SEGMENT SHRINK相关的操作,对IOT表,UPDATE一行意味着删除和插入两个操作。
如果你给表做DML操作,没有COMMIT,那么虽然SCN是变化的,如果你用这个范围内的SCN做上面的查询,是查询不到结果的。
四、Flashback Transaction Query
它可以作为我们的一种诊断工具,从而让我们可以在事务级别看数据库的变化
视图FLASHBACK_TRANSACTION_QUERY可以提供我们进行回退的语句。
对Flashback Transaction Query,需要注意的几点:
a.ddl表现为对数据字典的更新
b.对IOT的UPDATE表现为DELETE和INSERT
c.被DROP的对象和用户显示成对应的ID
d.如果UNDO数据不够,那么FLASHBACK_TRANSACTION_QUERY的OPERATION表现为UNKNOWN
五、Flashback table
在数据库ONLINE的情况下,将表恢复到某个时间点的状态
具体步骤:ALTER TABLE employees ENABLE ROW MOVEMENT;----因为FLASHBACK后可能不能保留现在的ROWID,所以需要进行这步。
FLASHBACK TABLE employees TO TIMESTAMP (SYSDATE-1);
要注意的几点:1、整个FLASHBACK TABLE语句必须在一个事务中完成
2、会给对应表加排它DML锁
3、统计值不会被flash back
4、索引以及其他依赖的对象都会被维护,但是被DROP掉的索引不会重建
5、操作会被记录在警告日志文件中
6、不能超越DDL
7、不能对系统、远程、FIXED TABLE执行这个操作
六、相关的其它几个问题:
1、给UNDO TABLESPACE加RETENTION GUARANTEE属性
2、SCN和时间的映射粒度是3秒,以往是5分钟。而且两者的映射只保持5天,现在通过将UNDO RETENTION设置更大一些,两者的映射可以保持更长的时间:Max(five days, UNDO_RETENTION)
3、两个函数SCN_TO_TIMESTAMP和TIMESTAMP_TO_SCN
七、权限问题:
FLASHBACK DATABASE需要SYSDBA权限
Flashback Table or Flashback Versions Query需要flashback any table权限以及对象的访问权限
Flashback Transaction Query需要SELECT ANY TRANSACTION权限
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/85922/viewspace-989686/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/85922/viewspace-989686/