oracle控制文件丢失恢复
在学习群里有个同学误删除了控制文件,于是我也把自己数据库的控制文件删除了,看看能不能进行恢复,以下是整个实验的过程~~在做之前,先看看控制文件的备份方式:
1.生成可以重建控制文件的脚本。
2.备份二进制的控制文件。
我们这次着重来看看第1种方式。
查看控制文件,发现我自己只有一个控制文件,记得老师说过,有些数据库有好几个控制文件,每个控制文件的内容都是一样的,如果一个丢了或者坏了,从别的控制文件拷贝复制下就ok,结果我只有一个,不能使用这种方式进行恢复了,只能通过重建控制文件的方式来修复。
如何获得重建控制文件的脚本呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
SQL> select
status from
v$instance; STATUS ------------ OPEN SQL> alter
database
backup controlfile to
trace; 数据库已更改。 SQL> select
d.value||b.bias|| lower (rtrim(i.instance, chr(0)))|| ‘_ora_‘ ||p.spid| | ‘.trc‘
trace_file_name from
( select
p.spid from
sys.v$mystat m,sys.v$session s ,sys.v$process p where
m.statistic# = 1 and
s.sid = m.sid and
p.addr = s.paddr) p, ( select
t.instance from
sys.v$thread t,sys.v$parameter v where
v. name
= ‘thr ead‘
and
(v.value = 0 or
t.thread# = to_number(v.value))) i, ( select
value from sys.v$parameter where
name
= ‘user_dump_dest‘ ) d,( select
DECODE( count (BANNER),0 , ‘/‘ , ‘\‘) bias from v$version where upper(banner) like ‘ %WINDOWS%‘) b; TRACE_FILE_NAME -------------------------------------------------------------------------------- d:\app\fx\diag\rdbms\orcl\orcl\trace\orcl_ora_3800.trc |
以上两个语句,就能获得控制文件的生成语句和该语句所在的位置啦~~我们现在过去看看这个创建语句长什么样?在上述路径下,我们顺利找到了该文件,在文件中,我们发现了以下内容,黑色加粗部分就是我们需要的创建控制文件的语句了~
STARTUP
NOMOUNT
CREATE CONTROLFILE
REUSE DATABASE "ORCL"
NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS
3
MAXDATAFILES 100
MAXINSTANCES
8
MAXLOGHISTORY 292
LOGFILE
GROUP
1 ‘D:\APP\FX\ORADATA\ORCL\REDO01.LOG‘ SIZE 50M BLOCKSIZE
512,
GROUP
2 ‘D:\APP\FX\ORADATA\ORCL\REDO02.LOG‘ SIZE 50M BLOCKSIZE
512,
GROUP
3 ‘D:\APP\FX\ORADATA\ORCL\REDO03.LOG‘ SIZE 50M BLOCKSIZE
512,
GROUP
4 ‘D:\APP\FX\ORADATA\ORCL\REDO04.LOG‘ SIZE 50M BLOCKSIZE
512
-- STANDBY
LOGFILE
DATAFILE
‘D:\APP\FX\ORADATA\ORCL\SYSTEM01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\SYSAUX01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\UNDOTBS01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\EXAMPLE01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\UNDOTBS02.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS02.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS04.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS06.DBF‘
CHARACTER SET ZHS16GBK
;
-- Commands to re-create
incarnation table
-- Below log names MUST be changed to existing
filenames on
-- disk. Any one log file from each branch can be
used to
-- re-create incarnation records.
--
ALTER DATABASE REGISTER LOGFILE
‘D:\APP\FX\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_01_20\O1_MF_1_1_%U_.ARC‘;
--
ALTER DATABASE REGISTER LOGFILE
‘D:\APP\FX\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_01_20\O1_MF_1_1_%U_.ARC‘;
--
Recovery is required if any of the datafiles are restored
backups,
-- or if the last shutdown was not normal or
immediate.
RECOVER DATABASE
-- All logs need
archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG
ALL;
-- Database can now be opened
normally.
ALTER DATABASE OPEN;
现在创建语句已经有了,我们就开始试验吧~~
1、我们先关闭数据库,将控制文件删除,分阶段启动数据库,先是到nomount,这个阶段需要参数文件,不需要控制文件,启动应该没问题:
1
2
3
4
5
6
7
8
9
10
11
12
13 |
SQL> startup nomount; ORACLE 例程已经启动。 Total System Global
Area 535662592 bytes Fixed Size
1375792 bytes Variable Size
285213136 bytes Database
Buffers 243269632 bytes Redo Buffers 5804032 bytes SQL> select
status from
v$instance; STATUS ------------------------ STARTED |
2、接下来,启动到mount状态肯定就不行啦,因为我们已经把控制文件给删除啦~~既然这样,我们就要尝试进行控制文件的重建了~把上文中的创建语句在sys用户下执行一下吧~~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 |
SQL> alter
database
mount; alter
database
mount * 第 1 行出现错误: ORA-00205: ?????????, ??????, ??????? SQL> CREATE
CONTROLFILE REUSE DATABASE
"ORCL"
NORESETLOGS ARCHIVELOG 2 MAXLOGFILES 16 3 MAXLOGMEMBERS 3 4 MAXDATAFILES 100 5 MAXINSTANCES 8 6 MAXLOGHISTORY 292 7 LOGFILE 8 GROUP
1 ‘D:\APP\FX\ORADATA\ORCL\REDO01.LOG‘
SIZE
50M BLOCKSIZE 512, 9 GROUP
2 ‘D:\APP\FX\ORADATA\ORCL\REDO02.LOG‘
SIZE
50M BLOCKSIZE 512, 10 GROUP
3 ‘D:\APP\FX\ORADATA\ORCL\REDO03.LOG‘
SIZE
50M BLOCKSIZE 512, 11 GROUP
4 ‘D:\APP\FX\ORADATA\ORCL\REDO04.LOG‘
SIZE
50M BLOCKSIZE 512 12 DATAFILE 13 ‘D:\APP\FX\ORADATA\ORCL\SYSTEM01.DBF‘ , 14 ‘D:\APP\FX\ORADATA\ORCL\SYSAUX01.DBF‘ , 15 ‘D:\APP\FX\ORADATA\ORCL\UNDOTBS01.DBF‘ , 16 ‘D:\APP\FX\ORADATA\ORCL\USERS01.DBF‘ , 17 ‘D:\APP\FX\ORADATA\ORCL\EXAMPLE01.DBF‘ , 18 ‘D:\APP\FX\ORADATA\ORCL\UNDOTBS02.DBF‘ , 19 ‘D:\APP\FX\ORADATA\ORCL\USERS02.DBF‘ , 20 ‘D:\APP\FX\ORADATA\ORCL\USERS04.DBF‘ , 21 ‘D:\APP\FX\ORADATA\ORCL\USERS06.DBF‘ 22 CHARACTER
SET
ZHS16GBK 23 ; 控制文件已创建。 SQL> |
3、噢耶~~控制文件重建好了~~我们打开数据库试试~
1
2
3 |
SQL> ALTER
DATABASE
OPEN ; 数据库已更改。 |
数据库打开了,我的数据库是归档模式,我重建了控制文件之后,需要再次对数据库进行备份。
如果还没有来得及生成重建控制文件的脚本,控制文件就坏了,那我们可以仿写这个重建语句,把自己数据库的相关信息填进去,一个崭新的重建语句就诞生啦~~~
CREATE CONTROLFILE REUSE DATABASE "ORCL"
NORESETLOGS ARCHIVELOG ----数据库名称
MAXLOGFILES
16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY
292
LOGFILE
GROUP
1 ‘D:\APP\FX\ORADATA\ORCL\REDO01.LOG‘ SIZE 50M BLOCKSIZE
512, -----日志文件组和路径信息
GROUP 2
‘D:\APP\FX\ORADATA\ORCL\REDO02.LOG‘ SIZE 50M BLOCKSIZE
512,
GROUP
3 ‘D:\APP\FX\ORADATA\ORCL\REDO03.LOG‘ SIZE 50M BLOCKSIZE
512,
GROUP
4 ‘D:\APP\FX\ORADATA\ORCL\REDO04.LOG‘ SIZE 50M BLOCKSIZE
512
-- STANDBY
LOGFILE
DATAFILE
‘D:\APP\FX\ORADATA\ORCL\SYSTEM01.DBF‘,
-----数据文件信息
‘D:\APP\FX\ORADATA\ORCL\SYSAUX01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\UNDOTBS01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\EXAMPLE01.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\UNDOTBS02.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS02.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS04.DBF‘,
‘D:\APP\FX\ORADATA\ORCL\USERS06.DBF‘
CHARACTER SET ZHS16GBK
;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。