oracle 10g flashback闪回技术的研究及测试
oracle 10g flashback闪回技术的研究及测试
1、设置flashback参数。
SQL> conn /as sysdba;
已连接。
SQL> archive log list
数据库日志模式 非存档模式
自动存档 禁用
存档终点 d:\oracle\product\10.2.0\db_1\RDBMS
最早的联机日志序列 21
当前日志序列 23
SQL> show parameter recove
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big integer 0
recovery_parallelism integer 0
--启用Flash Recovery Area
SQL> alter system set db_recovery_file_dest_size=10g scope=both;
系统已更改。
SQL> alter system set db_recovery_file_dest='D:\oracle\flashdb' scope=both;
系统已更改。
SQL> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:\oracle\flashdb
db_recovery_file_dest_size big integer 10G
recovery_parallelism integer 0
SQL>
--禁用Flash Recovery Area:
SQL>alter system set db_recovery_file_dest='';
--设置初始化参数RETENTION
db_flashback_retention_target 1440
(闪回区至少数据库实际容量的10%,select sum(bytes)/1024/1024/1024 from dba_segments
)
undo_retention 900
##########################################
2、开启归档模式
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 293601280 bytes
Fixed Size 1248600 bytes
Variable Size 113246888 bytes
Database Buffers 171966464 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 21
下一个存档日志序列 23
当前日志序列 23
SQL>
--直接设置归档路径:
alter system set LOG_ARCHIVE_DEST_1='LOCATION=D:\oracle\flashdb';
##############################################
3、检查flash相关运行情况
--检查flashback是否启动
SQL> select name,current_scn,flashback_on from v$database;
NAME CURRENT_SCN FLASHBACK_ON
--------- ----------- ------------------
MYFMIS 1005679 NO
alter database flashback NO/OFF
SQL> ALTER DATABASE FLASHBACK ON;
数据库已更改。
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
--检查flash recovery area的使用情况
select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_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行。
--计算flash recovery area已经占用的空间:
select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)*3/100
-----------------------------
2.1231
可以看到,这里已经有2.1231G使用了
--RMAN中删除flash recovery area中不必要的备份来释放flash recovery area空间:
(1). delete obsolete;
(2). crosscheck backupset;
delete expired backupset;
#######################################################
4、flashback恢复实验之--flashback database
--备份database
RMAN> backup database;
启动 backup 于 09-5月 -10
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=141 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\SYSTEM01.DBF
输入数据文件 fno=00006 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\FMISMAIN.ORA
输入数据文件 fno=00003 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\SYSAUX01.DBF
输入数据文件 fno=00007 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\FMIS0000.ORA
输入数据文件 fno=00008 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\FMIS0001.ORA
输入数据文件 fno=00009 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\RMAN_TBS.DBF
输入数据文件 fno=00002 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\UNDOTBS01.DBF
输入数据文件 fno=00005 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\EXAMPLE01.DBF
输入数据文件 fno=00004 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 09-5月 -10
通道 ORA_DISK_1: 已完成段 1 于 09-5月 -10
段句柄=D:\ORACLE\FLASHDB\MYFMIS\BACKUPSET\2010_05_09\O1_MF_NNNDF_TAG20100509T235043_5YFPGO2G_.BKP 标记=TAG20100509T23504
3 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:02:45
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 09-5月 -10
通道 ORA_DISK_1: 已完成段 1 于 09-5月 -10
段句柄=D:\ORACLE\FLASHDB\MYFMIS\BACKUPSET\2010_05_09\O1_MF_NCSNF_TAG20100509T235043_5YFPMWF5_.BKP 标记=TAG20100509T23504
3 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:05
完成 backup 于 09-5月 -10
RMAN>
RMAN> list backup;
备份集列表
===================
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
41 Full 1.16G DISK 00:02:40 09-5月 -10
BP 关键字: 43 状态: AVAILABLE 已压缩: NO 标记: TAG20100509T235043
段名:D:\ORACLE\FLASHDB\MYFMIS\BACKUPSET\2010_05_09\O1_MF_NNNDF_TAG20100509T235043_5YFPGO2G_.BKP
备份集 41 中的数据文件列表
文件 LV 类型 Ckp SCN Ckp 时间 名称
---- -- ---- ---------- ---------- ----
1 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\SYSTEM01.DBF
2 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\UNDOTBS01.DBF
3 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\SYSAUX01.DBF
4 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\USERS01.DBF
5 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\EXAMPLE01.DBF
6 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\FMISMAIN.ORA
7 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\FMIS0000.ORA
8 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\FMIS0001.ORA
9 Full 1011163 09-5月 -10 D:\ORACLE\PRODUCT\10.2.0\ORADATA\MYFMIS\RMAN_TBS.DBF
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
42 Full 6.80M DISK 00:00:03 09-5月 -10
BP 关键字: 44 状态: AVAILABLE 已压缩: NO 标记: TAG20100509T235043
段名:D:\ORACLE\FLASHDB\MYFMIS\BACKUPSET\2010_05_09\O1_MF_NCSNF_TAG20100509T235043_5YFPMWF5_.BKP
包括的控制文件: Ckp SCN: 1011420 Ckp 时间: 09-5月 -10
包含的 SPFILE: 修改时间: 09-5月 -10
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
10-05-10 15:54:58
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1016413
SQL> select count(*) from fmismain.xtdw;
COUNT(*)
----------
30
SQL> drop table fmismain.xtdw;
表已删除。
SQL> commit;
提交完成。
SQL> select count(*) from fmismain.xtdw;
select count(*) from fmismain.xtdw
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
--重启数据库到mount状态
select * from v$flashback_database_log;
--执行恢复:分timestamp 或者SCN两种
SQL> flashback database to timestamp to_timestamp('10-05-10 15:54:58','yy-mm-dd hh24:mi:ss');
闪回完成。
或者:
SQL> flashback database to scn 1016413;
闪回完成。
--在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
演示第二种:
SQL> create table fmismain.xtdw2 as select * from fmismain.xtdw;
表已创建。
SQL> commit;
提交完成。
SQL> select count(*) from fmismain.xtdw2;
COUNT(*)
----------
30
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
10-05-10 16:07:58
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1017186
SQL>
SQL> create table fmismain.xtdw3 as select * from fmismain.xtdw;
表已创建。
SQL> commit;
提交完成。
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
10-05-10 16:09:42 --闪回到此,导出表。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1017253
SQL>
SQL> drop table fmismain.xtdw;
表已删除。
SQL> drop table fmismain.xtdw3;
表已删除。
SQL> commit;
提交完成。
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
10-05-10 16:10:43 --全库recover database到此。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1017344
闪回后,以只读方式打开,进行exp导入,再启动到mount模式下,进行rman恢复。
rman target /
RMAN> recover database until time "to_date('10-05-10 16:10:43','yy-mm-dd hh24:mi:ss')";
启动 recover 于 10-5月 -10
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=154 devtype=DISK
正在开始介质的恢复
介质恢复完成, 用时: 00:00:03
完成 recover 于 10-5月 -10
RMAN> alter database open resetlogs;
数据库已打开
SQL> select count(*) from fmismain.xtdw3;
select count(*) from fmismain.xtdw3
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select count(*) from fmismain.xtdw2;
COUNT(*)
----------
30
SQL> select count(*) from fmismain.xtdw;
select count(*) from fmismain.xtdw
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
OK,自此flashback database的恢复测试完成。
###############################################################################
5、Flashback Database 相关的2个视图:
1). V$database
这个视图可以查看是否启用了Flashback database功能
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
2). V$flashback_database_log
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少, 该视图就可以查看许多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
Flashback_size: 记录了当前使用的Flash Recovery 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 from v$flashback_database_log;
OS OT RT FS ES
---------- ----------------- ---------- ---------- ----------
1015479 10-05-10 15:41:46 1440 8192000 210272256
3)V$flashback_database_stat
这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量,Flashback_Data 代表Flashback log产生数量,DB_Date 代表数据改变数量,Redo_Date代表日志数量,通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求。
SQL> alter session set nls_date_format='yy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select * from v$flashback_database_stat;
BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
----------------- ----------------- -------------- ---------- ---------- ------------------------
10-05-10 16:15:50 10-05-10 16:44:54 3448832 4964352 1445888 0
4)flashback_transaction_query
可查所有操作的记录
######################################
6、Flashback DROP测试
查看是否启用:
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
禁用该功能:
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中。
SQL> drop table name purge;
1). Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定表空间的Recycle Bin中指定用户的对象
3). Purge recyclebin: 删除当前用户的Recycle Bin中的对象
4). Purge dba_recyclebin: 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限
5). Drop table table_name purge: 删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
6). Purge index recycle_bin_object_name:
当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。
--闪回表flashback table实验:
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
XTDW BIN$ZUJaSOTOQSGSUjFeKDEERg==$0 TABLE 2010-05-10:16:10:05
XTDW BIN$TbPHjVBGRxWsHe4KJnzzkA==$0 TABLE 2010-05-10:14:56:36
XTDW2 BIN$X8yiqskNRo+S9P9gDArqmw==$0 TABLE 2010-05-10:16:56:07
XTDW3 BIN$2UaYhgWHSrWHezQf39P/jw==$0 TABLE 2010-05-10:16:10:14
SQL> flashback table xtdw2 to before drop;
或者flashback table“BIN$2UaYhgWHSrWHezQf39P/jw==$0”to before drop;
闪回完成。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
XTDW BIN$ZUJaSOTOQSGSUjFeKDEERg==$0 TABLE 2010-05-10:16:10:05
XTDW BIN$TbPHjVBGRxWsHe4KJnzzkA==$0 TABLE 2010-05-10:14:56:36
XTDW3 BIN$2UaYhgWHSrWHezQf39P/jw==$0 TABLE 2010-05-10:16:10:14
SQL> select count(*) from fmismain.xtdw2;
COUNT(*)
----------
30
如果原表名已经存在,可以在闪回时更改表名
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
SQL> flashback table xtdw to before drop rename to xtdw4;
######################################
7、Flashback Query
--As of timestamp 的测试:
SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
会话已更改。
SQL> select sysdate from dual;
15:10:03 SQL> delete from xtdw2;
已删除30行。
15:10:16 SQL> commit;
提交完成。
15:10:18 SQL>select dh,mc from xtdw2 as of timestamp sysdate-2/1440;
15:12:23 SQL>
select dh,mc from xtdw2 as of timestamp to_timestamp('2010-05-11 15:08:32','YYYY-MM-DD hh24:mi:ss');
用Flashback Query恢复之前的数据:
SQL>insert into xtdw2 select * from xtdw2 as of timestamp to_timestamp('2010-05-11 15:08:32','YYYY-MM-DD hh24:mi:ss');
SQL>insert into xtdw2 select dh,mc from xtdw2 as of timestamp sysdate-2/1440;
--As of scn 实验
15:14:42 SQL> SELECT dbms_flashback.get_system_change_number FROM dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1022540
15:16:33 SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
1022544
15:16:40 SQL> delete from xtdw2;
已删除30行。
15:17:12 SQL> commit;
提交完成。
15:17:15 SQL> select dh,mc from xtdw2;
未选定行
15:17:24 SQL> select dh,mc from xtdw2 as of scn 1022544;
用Flashback Query恢复之前的数据:
15:19:23 SQL> insert into xtdw2 select * from xtdw2 as of scn 1022544;
已创建30行。
事实上,Oracle 在内部都是使用scn,即使你指定的是as of timestamp,oracle 也会将其转换成scn,系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME
select time_dp,scn from smon_scn_time
15:19:30 SQL> desc sys.smon_scn_time;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
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
查看SCN 和 timestamp 之间的对应关系:
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
######################################
8、Flashback version Query
先看一个伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。
select ora_rowscn,dh,mc from xtdw2
ORA_ROWSCN DH MC
---------- -------- ------------------------------------------------------------
1022492 0301 广本部(哥)
1022492 0300 广电局(哥)
1022492 1500 广局(193接口)
1022492 1501 广部(193接口)
1022492 1600 广局(193接口)
--获取更多的历史信息
Select versions_xid,versions_startscn,versions_endscn,DECODE(versions_operation,'I','Insert','U','Update','D','Delete', 'Original') "Operation", dh from xtdw2 versions between scn minvalue and maxvalue;
VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio DH
---------------- ----------------- --------------- -------- --------
Original 1900
Original 1901
Original 5100
Original 5101
或者:
select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in(select versions_xid from xtdw2 versions between scn 1041463 and 1041463);
SQL> desc flashback_transaction_query
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
XID RAW(8)
START_SCN NUMBER
START_TIMESTAMP DATE
COMMIT_SCN NUMBER
COMMIT_TIMESTAMP DATE
LOGON_USER VARCHAR2(30)
UNDO_CHANGE# NUMBER
OPERATION VARCHAR2(32)
TABLE_NAME VARCHAR2(256)
TABLE_OWNER VARCHAR2(32)
ROW_ID VARCHAR2(19)
UNDO_SQL VARCHAR2(4000)
#############################################################
9、Flashback Transaction Query
Flashback Transaction Query也是使用UNDO信息来实现。利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。
查看视图,每个事务都对应相同的XID
SQL>Select xid,operation,commit_scn,undo_sql from flashback_transaction_query where xid in (Select versions_xid from xtdw2 versions between scn minvalue and maxvalue);
XID OPERATION COMMIT_SCN
---------------- -------------------------------- ----------
UNDO_SQL
--------------------------------------------------------------------------------
02000A0027020000 BEGIN 1041463
0300010028020000 INSERT 1041504
delete from "FMISMAIN"."XTDW2" where ROWID = 'AAAQVkAAAAAAAAAAAA';
0300010028020000 INSERT 1041504
delete from "FMISMAIN"."XTDW2" where ROWID = 'AAAQVkAAAAAAAAAAAA';
XID OPERATION COMMIT_SCN
---------------- -------------------------------- ----------
UNDO_SQL
--------------------------------------------------------------------------------
0300010028020000 BEGIN 1041504
或者:
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in(select versions_xid from xtdw2 versions between scn 1041463 and 1041504);
###########################################
10、Flashback Table
Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。
注意:如果想要对表进行flashback,必须允许表的row movement.
Alter table table_name enable row movement;
要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables),
例如:
SQL> select row_movement from user_tables where table_name='XTDW2';
ROW_MOVE
--------
ENABLED
要启用或禁止某表row movement,可以通过下列语句:
--启用
JSSWEB> ALTER TABLE XTDW2 ENABLE ROW MOVEMENT;
表已更改。
--禁止
JSSWEB> ALTER TABLE XTDW2 DISABLE ROW MOVEMENT;
表已更改。
SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-05-11 16:22:32
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1042979
SQL> alter table XTDW2 enable row movement;
表已更改。
SQL> flashback table XTDW2 to scn 1042979;
闪回完成。
或者:
SQL> flashback table XTDW2 to timestamp to_timestamp('2010-05-11 16:22:32','yyyy-mm-dd hh24:mi:ss');
闪回完成。
Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。
默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加
ENABLE TRIGGERS 子句。
如:
flashback table xtdw,xtdw2 to scn 1103864;
SQL> flashback table xtdw,XTDW2 to scn 1042979;
flashback table xtdw,XTDW2 to scn 1042979
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表
SQL> alter table xtdw enable row movement;
表已更改。
SQL> flashback table xtdw,XTDW2 to scn 1042979;
闪回完成。
SQL> select count(*) from xtdw2;
COUNT(*)
----------
30
SQL> select count(*) from xtdw;
COUNT(*)
----------
30
SQL>
只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,
例如:
SQL> Alter tablespace undotbs1 retention guarantee;
如果想禁止undo 表空间retention guarantee,
例如:
SQL> Alter tablespace undotbs1 retention noguarantee;