Oracle flashback database的使用有一些限制,其中最主要的是flashback database不支持跨数据文件删除闪回和不支持跨数据文件shrink闪回。对于已经删除的数据文件只能采用恢复机制进行恢复,具体操作方法见以下测试。

1. 测试环境准备

1.1 开启flashback

检查flashback是否开启,如未开启,先开启flashback.
SQL> select flashback_on from v$database; FLASHBACK_ON
------------------
YES 检查当前scn
SQL> select current_scn from v$database; CURRENT_SCN
-----------
1295139 检查当前归档日志
SQL> select max(sequence#) from v$archived_log; MAX(SEQUENCE#)
--------------
56

1.2 创建表空间、用户、表,插入数据

创建测试表空间
SQL> create tablespace testtbs datafile '+DATA/beicenp/datafile/testtbs.dbf' size 10m autoextend on; Tablespace created. SQL> alter system archive log current; System altered. SQL> select max(sequence#) from v$archived_log; MAX(SEQUENCE#)
--------------
57 创建测试用户
SQL> create user test identified by test default tablespace testtbs; User created. SQL> grant connect,resource to test; Grant succeeded. SQL> create table test.testtb (id number); Table created. SQL> insert into test.testtb values (1); 1 row created. SQL> commit; Commit complete. SQL> alter system archive log current; System altered. SQL> select current_scn from v$database; CURRENT_SCN
-----------
1295236

1.3 执行数据库备份

执行以下脚本备份数据库:
run {
allocate channel ch00 type disk;
backup as compressed backupset format '/app/oracle/bk_%s_%p_%t' database;
sql 'alter system archive log current';
backup as compressed backupset format '/app/oracle/arch_%s_%p_%t' archivelog all delete input;
backup format '/app/oracle/cntl_%s_%p_%t' current controlfile;
release channel ch00;
}

1.4 备份后模拟一些数据库操作


模拟一些数据库操作:
SQL> insert into test.testtb values (2); 1 row created. SQL> commit; Commit complete. SQL> alter system archive log current; System altered. SQL> select current_scn from v$database; CURRENT_SCN
-----------
1295364 SQL> insert into test.testtb values (3); 1 row created. SQL> commit; Commit complete. SQL> alter system archive log current; System altered. SQL> select current_scn from v$database; CURRENT_SCN
-----------
1296106 flashback database时闪回到此scn

1.5 删除测试表空间

模拟表空间删除:
SQL> drop tablespace testtbs including contents and datafiles; Tablespace dropped. SQL> select * from test.testtb;
select * from test.testtb
*
ERROR at line 1:
ORA-00942: table or view does not exist SQL> alter system archive log current; System altered.

2. 闪回测试

2.1 执行闪回

关闭数据库,并启动到mount状态:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started. Total System Global Area 1052233728 bytes
Fixed Size 2217704 bytes
Variable Size 805308696 bytes
Database Buffers 239075328 bytes
Redo Buffers 5632000 bytes
Database mounted. 检查数据库是否能够闪回的所需要的SCN:
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. SQL> set lines 120
SQL> select OLDEST_FLASHBACK_SCN,OLDEST_FLASHBACK_TIME,RETENTION_TARGET,FLASHBACK_SIZE/1024/1024/1024 as size_G,ESTIMATED_FLASHBACK_SIZE/1024/1024/1024 as estimate_size_G from v$flashback_database_log; OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET SIZE_G ESTIMATE_SIZE_G
-------------------- ------------------- ---------------- ---------- ---------------
1295593 2014-01-03 10:00:15 1440 .007629395 0 执行闪回操作:
SQL> flashback database to scn 1296106;
flashback database to scn 1296106
*
ERROR at line 1:
ORA-38795: warning: FLASHBACK succeeded but OPEN RESETLOGS would get error below
ORA-01245: offline file 5 will be lost if RESETLOGS is done
ORA-01111: name for data file 5 is unknown - rename to correct file
ORA-01110: data file 5: '/app/oracle/product/10.2/dbs/UNNAMED00005'
闪回时数据库会报错,因为flashback不支持跨数据文件删除操作。

此时alert日志中的闪回信息如下:


Fri Jan  3 10:13:22 2014
flashback database to scn 1296106
Fri Jan 3 10:13:23 2014
Flashback Restore Start
Flashback: created tablespace #6: 'TESTTBS' in the controlfile.
Flashback: created OFFLINE file 'UNNAMED00005' for tablespace #6 in the controlfile.
Filename was:
'+DATA/beicenp/datafile/testtbs.dbf' when dropped.
File will have to be restored from a backup and recovered.
Flashback Restore Complete
Flashback Media Recovery Start
parallel recovery started with 2 processes
Fri Jan 3 10:13:24 2014
Recovery of Online Redo Log: Thread 1 Group 2 Seq 62 Reading mem 0
Mem# 0 errs 0: +DATA/beicenp/onlinelog/group_2.258.798647877
Mem# 1 errs 0: +FLASH/beicenp/onlinelog/group_2.258.798647877
Fri Jan 3 10:13:26 2014
Recovery of Online Redo Log: Thread 1 Group 3 Seq 63 Reading mem 0
Mem# 0 errs 0: +DATA/beicenp/onlinelog/group_3.259.798647879
Mem# 1 errs 0: +FLASH/beicenp/onlinelog/group_3.259.798647881
Fri Jan 3 10:13:26 2014
Incomplete Recovery applied until change 1296111
Flashback Media Recovery Complete
ORA-38795 signalled during: flashback database to scn 1296106... 日志中明确说明被删除的数据文件需要从备份中恢复。

2.2 恢复数据文件

被删除的数据文件需要使用备份的控制文件才能恢复,不能使用当前控制文件进行恢复。

关闭数据库并启动到nomount状态:
SQL> shutdown immediate;
ORA-01109: database not open Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started. Total System Global Area 935329792 bytes
Fixed Size 2025168 bytes
Variable Size 310380848 bytes
Database Buffers 616562688 bytes
Redo Buffers 6361088 bytes 执行以下脚本恢复控制文件、数据文件和归档日志:
run {
allocate channel ch00 type disk;
restore controlfile from '/app/oracle/cntl_8_1_835869096';
sql 'alter database mount';
restore datafile 5;
restore archivelog from sequence 58;
release channel ch00;
} 然后执行database recover:
SQL> recover database using backup controlfile until change 1296106;
ORA-00279: change 1295287 generated at 01/03/2014 09:50:41 needed for thread 1
ORA-00289: suggestion : +ARCH
ORA-00280: change 1295287 for thread 1 is in sequence #59 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 1295313 generated at 01/03/2014 09:51:23 needed for thread 1
ORA-00289: suggestion : +ARCH
ORA-00280: change 1295313 for thread 1 is in sequence #60
ORA-00278: log file
'+ARCH/beicenp/archivelog/2014_01_03/thread_1_seq_59.286.835871009' no longer
needed for this recovery ORA-00279: change 1295318 generated at 01/03/2014 09:51:23 needed for thread 1
ORA-00289: suggestion : +ARCH
ORA-00280: change 1295318 for thread 1 is in sequence #61
ORA-00278: log file
'+ARCH/beicenp/archivelog/2014_01_03/thread_1_seq_60.289.835871011' no longer
needed for this recovery ORA-00279: change 1295363 generated at 01/03/2014 09:52:04 needed for thread 1
ORA-00289: suggestion : +ARCH
ORA-00280: change 1295363 for thread 1 is in sequence #62
ORA-00278: log file
'+ARCH/beicenp/archivelog/2014_01_03/thread_1_seq_61.283.835869125' no longer
needed for this recovery ORA-00279: change 1296104 generated at 01/03/2014 10:00:45 needed for thread 1
ORA-00289: suggestion : +ARCH
ORA-00280: change 1296104 for thread 1 is in sequence #63
ORA-00278: log file
'+ARCH/beicenp/archivelog/2014_01_03/thread_1_seq_62.284.835869645' no longer
needed for this recovery Log applied.
Media recovery complete. recover完成后,以resetlogs方式打开:
SQL> alter database open resetlogs; Database altered. 打开后检查测试数据:
SQL> select * from test.testtb; ID
----------
3
1
2

以下是尝试用当前控制文件恢复数据文件

执行数据库闪回:
SQL> flashback database to scn 1296106;
flashback database to scn 1296106
*
ERROR at line 1:
ORA-38795: warning: FLASHBACK succeeded but OPEN RESETLOGS would get error
below
ORA-01245: offline file 5 will be lost if RESETLOGS is done
ORA-01111: name for data file 5 is unknown - rename to correct file
ORA-01110: data file 5: '/app/oracle/product/10.2/dbs/UNNAMED00005'
因数据文件已经被删除,闪回报错。 创建数据文件:
SQL> alter database create datafile '/app/oracle/product/10.2/dbs/UNNAMED00005' as '+DATA/beicenp/datafile/testtbs.dbf'; Database altered. 执行RMAN脚本,恢复数据文件及归档日志:
run {
allocate channel ch00 type disk;
restore datafile 5;
restore archivelog from sequence 58;
release channel ch00;
} 再次执行闪回:
SQL> flashback database to scn 1296106;
flashback database to scn 1296106
*
ERROR at line 1:
ORA-38795: warning: FLASHBACK succeeded but OPEN RESETLOGS would get error
below
ORA-01245: offline file 5 will be lost if RESETLOGS is done
ORA-01110: data file 5: '+DATA/beicenp/datafile/testtbs.dbf'
闪回依然报错。网上有些测试说在创建文件后再执行闪回,就可以恢复被删除的数据文件。其前提条件是需要有文件创建以来的所有归档日志。很多时候这个条件并不是很容易满足。 测试使用当前控制文件恢复:
SQL> recover database until change 1296106;
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01245: offline file 5 will be lost if RESETLOGS is done
ORA-01110: data file 5: '+DATA/beicenp/datafile/testtbs.dbf'
恢复仍然报错。这说明flashback后是不能使用当前控制文件恢复被删除的数据文件的,必须使用备份的控制文件。如果此时将控制文件替换为备份控制文件,然后再执行恢复,恢复仍然能够成功。

跨数据文件删除flashback database的更多相关文章

  1. 【转】Oracle 表空间与数据文件

    --============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...

  2. Oracle 表空间与数据文件

    -============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或多 ...

  3. ORACLE - 管理表空间和数据文件

    ORACLE表空间是一个逻辑分区,一个数据文件只能属于一个表空间,一个表空间可以拥有多个数据文件. 一般情况下,如果一个实例分配给多个应用使用,需要创建不同的表空间,每个用户使用自己的表空间. 一.表 ...

  4. Oracle数据文件和临时文件的管理

    一.数据文件概述在Oracle数据库中,SYSTEM和SYSAUX表空间至少需要包含一个数据文件,此外还将包含多个其他表空间及与其相关的数据文件和临时文件.Oracle的数据文件和临时文件是操作系统文 ...

  5. 【Oracle】非RMAN恢复数据文件、控制文件

    实验环境:OEL 5.6 oracle 11g(11.2.0.4.0) 注意: system表空间数据文件不能在线recover,需要启动到mount状态再recover: undo表空间数据文件可以 ...

  6. asm下重定向数据文件小例(使用toad工具)

    原创作品,出自 "深蓝的blog" 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46863991 场景 ...

  7. oracle 普通数据文件备份与恢复

    普通数据文件指:非system表空间.undo_tablespace表空间.临时表空间和只读表空间的数据文件.它们损坏导致用户数据不能访问,不会导致db自身异常.实例崩溃.数据库不恢复就无法启动的情况 ...

  8. oracle rm -fr datafile 数据文件被误删的场景恢复(没有rman备份)

    环境: Linux release 7.5 oracle19c (无pdb,从11.2.0.4升级上去的) 一:单个非系统表空间的数据文件被删除 我先备份一下,虽然是测试环境. [oracle@19c ...

  9. 表空间与数据文件Offline,online的区别

    首先明确,表空间与数据文件的关系:Oracle数据库表空间有两种,一种smallfile小文件表空间(默认),另一种bigfile大文件表空间: 默认表空间与数据文件的关系:允许一对多的处理方式,一个 ...

随机推荐

  1. HDFS-文件读取API

    package com.zhen.hdfs; import java.io.IOException; import java.io.InputStream; import java.net.URI; ...

  2. BZOJ 4154 kd-tree dfs序 + 二维空间的区间(矩阵)更新单点查找

    一开始没思路 感觉像是一个树形dp 然而不会 然后看了一眼题解就明白了 一个点的子树 用dfs序表示肯定是一个连续的区间 并且由于有子树的距离限制 可以转化为一个深度的区间 于是每个点都会有一个在二维 ...

  3. Mine_目标

    1. hibernate 有简单的方式 可以用于 DDL操作吗? “ DDL(data definition language)是数据定义语言:DDL比DML要多,主要的命令有CREATE.ALTER ...

  4. java大数字操作:BigInteger,BigDecimal(浮点型)

    java大数字操作: BigInteger:大数字整型的 BigDecimal(浮点型):大数字小数的,也适用大的整数 BigInteger: String num1 = "10038182 ...

  5. Python学习之路day3-文件操作

    一.概述 作为IO操作的重要部分,文件操作需要经常用到,下面简述下python中操作文件的流程: 1. 打开文件,得到一个文件句柄并赋值给一个变量 f = open("test.txt&qu ...

  6. ps6-工具的基础使用

    1.图像的移动与对齐 ctrl+j:复制图层,然后再移动不损坏原来的图像. Ctrl+Z =返回键 Shift+单击最下方图层 选择全部 Alt+鼠标移动 复制并粘贴 2.规则选择工具组 shift键 ...

  7. centos type.h 编译错误问题

    # ifndef __int8_t_defined # define __int8_t_defined __intN_t (, __QI__); __intN_t (, __HI__); __intN ...

  8. mysql中事务隔离级别可重复读说明

    mysql中InnoDB引擎默认为可重复读的(REPEATABLE READ).修改隔离级别的方法,你可以在my.inf文件的[mysqld]中配置: transaction-isolation = ...

  9. 使用zip()并行迭代

  10. HDU4940 Destroy Transportation system(有上下界的最大流)

    Problem Description Tom is a commander, his task is destroying his enemy’s transportation system. Le ...