跨数据文件删除flashback database
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的更多相关文章
- 【转】Oracle 表空间与数据文件
--============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...
- Oracle 表空间与数据文件
-============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或多 ...
- ORACLE - 管理表空间和数据文件
ORACLE表空间是一个逻辑分区,一个数据文件只能属于一个表空间,一个表空间可以拥有多个数据文件. 一般情况下,如果一个实例分配给多个应用使用,需要创建不同的表空间,每个用户使用自己的表空间. 一.表 ...
- Oracle数据文件和临时文件的管理
一.数据文件概述在Oracle数据库中,SYSTEM和SYSAUX表空间至少需要包含一个数据文件,此外还将包含多个其他表空间及与其相关的数据文件和临时文件.Oracle的数据文件和临时文件是操作系统文 ...
- 【Oracle】非RMAN恢复数据文件、控制文件
实验环境:OEL 5.6 oracle 11g(11.2.0.4.0) 注意: system表空间数据文件不能在线recover,需要启动到mount状态再recover: undo表空间数据文件可以 ...
- asm下重定向数据文件小例(使用toad工具)
原创作品,出自 "深蓝的blog" 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46863991 场景 ...
- oracle 普通数据文件备份与恢复
普通数据文件指:非system表空间.undo_tablespace表空间.临时表空间和只读表空间的数据文件.它们损坏导致用户数据不能访问,不会导致db自身异常.实例崩溃.数据库不恢复就无法启动的情况 ...
- oracle rm -fr datafile 数据文件被误删的场景恢复(没有rman备份)
环境: Linux release 7.5 oracle19c (无pdb,从11.2.0.4升级上去的) 一:单个非系统表空间的数据文件被删除 我先备份一下,虽然是测试环境. [oracle@19c ...
- 表空间与数据文件Offline,online的区别
首先明确,表空间与数据文件的关系:Oracle数据库表空间有两种,一种smallfile小文件表空间(默认),另一种bigfile大文件表空间: 默认表空间与数据文件的关系:允许一对多的处理方式,一个 ...
随机推荐
- uva 11752 The Super Powers 素数+大数判断大小
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- dp4--codeVs1043 方格取数
dp4--codeVs1043 方格取数 一.心得 二.题目 1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Dia ...
- 【R】数据导入读取read.table函数详解,如何读取不规则的数据(fill=T)
函数 read.table 是读取矩形格子状数据最为便利的方式.因为实际可能遇到的情况比较多,所以预设了一些函数.这些函数调用了 read.table 但改变了它的一些默认参数. 注意,read.t ...
- 177. Nth Highest Salary
问题描述 解决方案 CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN declare number int; set numbe ...
- LeetCode OJ:Rotate Array(倒置数组)
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- centos 6 简单安装mysql
yum list installed | grep mysql yum -y remove mysql-libs.i686 yum list installed | grep mysql wget d ...
- session 丢失问题
1. 存到memcached中, 十分简单, 在使用session之前, 加入下面两行代码 int_set('session.save_handler', 'memcache'); int_set(' ...
- 3143 codevs 二叉树的序遍历
题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i ...
- mysql开启和使用事件、与服务器重启mysql错误
一.mysql开启事件 首先用SHOW VARIABLES LIKE 'event_scheduler',查看计划事件有没有开启,他的返回值是off和on. 如果没有开启,可以在my.cnf配置文件中 ...
- 神秘常量!用0x077CB531计算末尾0的个数,32位数首位相连
大家或许还记得 Quake III 里面的一段有如天书般的代码,其中用到的神秘常量 0x5F3759DF 究竟是怎么一回事,着实让不少人伤透了脑筋.今天,我见到了一段同样诡异的代码. 下面这个 ...