实验:基于trace的控制文件重建及数据库回复(所有控制文件丢失等)
1.测试数据的构造,创建只读表空间
create tablespace tbs_users datafile
'/u01/app/oracle/oradata/prod/datafile/tbs_users1.dbf' size 5m,
'/u01/app/oracle/oradata/prod/datafile/tbs_users2.dbf' size 5m;
alter tablesapce tbs_users read only;
2.控制文件的转储
select name from v$controlfile;
--查看控制文件状态
转储:
oradebug setmypid;
alter database backup controlfile to trace;
oradebug tracefile_name;
3.删除控制文件
!rm /u01/app/oracle/oradata/prod/control*.ctl
--若闪回区也有控制文件副本,一并删除;
alter system checkpoint;
create tablespace ts1 datafile '/u01/app/oracle/oradata/prod/datafile/ts1.dbf' size 5m;
--触发错误
shutdown immeidate/abort
startup
ora-00205:error in identifying control file;
check alert log for more info;
4.使用转储的跟踪文件进行控制文件重建
查看跟踪文件内容,确定使用noresetlogs进行重建
相关脚本:
-- set #1. noresetlogs case
startup nomount
create controlfile reuse database prod noresetlogs archivelog
maxlogfiles 16
maxlogmembers 3
maxdatafiles 100
maxinstances 8
maxloghistory 292
logfile
group 1 (
'/u01/app/oracle/oradata/prod/onlinelog/o1_mf_1_b395d7z0_.log',
'/u01/app/oracle/fast_recovery_area/prod/onlinelog/o1_mf_1_b395df1j_.log'
) size 50m blocksize 512,
group 2 (
'/u01/app/oracle/oradata/prod/onlinelog/o1_mf_2_b395dlrd_.log',
'/u01/app/oracle/fast_recovery_area/prod/onlinelog/o1_mf_2_b395dqql_.log'
) size 50m blocksize 512,
group 3 (
'/u01/app/oracle/oradata/prod/onlinelog/o1_mf_3_b395dwfk_.log',
'/u01/app/oracle/fast_recovery_area/prod/onlinelog/o1_mf_3_b395f1j7_.log'
) size 50m blocksize 512
datafile
'/u01/app/oracle/oradata/prod/datafile/o1_mf_system_b393xosc_.dbf',
'/u01/app/oracle/oradata/prod/datafile/o1_mf_sysaux_b393xovt_.dbf',
'/u01/app/oracle/oradata/prod/datafile/o1_mf_undotbs1_b393xq2d_.dbf',
'/u01/app/oracle/oradata/prod/datafile/o1_mf_users_b393xqpm_.dbf',
'/u01/app/oracle/oradata/prod/datafile/o1_mf_example_b393xp04_.dbf'
character set al32utf8
;
recover database
--如果数据库非正常关闭,需要恢复数据库;
alter system archive log all;
alter database open;
--如果有创建的测试数据文件需要处理,则可以先跳过(以先打开数据库为准);
alter database datafile file_id offline;
alter database rename file 'missing00006'
to '/u01/app/oracle/oradata/prod/datafile/tbs_users1.dbf';
alter database rename file 'missing00007'
to '/u01/app/oracle/oradata/prod/datafile/tbs_users2.dbf';
alter tablespace tbs_users online;
alter tablespace temp add tempfile '/u01/app/oracle/oradata/prod/datafile/o1_mf_temp_b29o0g6r_.tmp'
size 20971520 reuse autoextend on next 655360 maxsize 32767m;
备注:
1.只读状态的表空间,在利用跟踪文件后,其数据文件名称会发生变化,需要rename操作;
2.临时表空间,在利用trace重建控制文件后,其临时文件会丢失,需要重新添加或重建临时表空间;
3.在转储控制文件之后新创建的临时表空间,当我们重建控制文件后,这些表空间的数据文件,也需要进行处理;
4.可以利用rman中的命令来查看当前数据库数据文件和临时文 report schema
5.odu 数据库恢复工具
具体实验:
5.1. 丢失了所有控制文件副本后进行恢复注 在利用trace备份恢复控制文件的时候,有以下要特别注意:
- 只读表空间
- 临时表空间
- 离线表空间
1) 准备只读表空间环境
sys@ora11gr2>create tablespace ts_users datafile '/u01/app/oracle/oradata/ora11gr2/ts_users01.dbf' size 5m,'/u01/app/oracle/oradata/ora11gr2/ts_users02.dbf' size 5m;
tablespace created.
sys@ora11gr2>col tablespace_name for a15
sys@ora11gr2>select tablespace_name,status from dba_tablespaces;
tablespace_name status
--------------- ---------
system online
sysaux online
undotbs1 online
temp online
users online
example online
ts_users online
7 rows selected.
sys@ora11gr2>
sys@ora11gr2>select file_name,status,online_status from dba_data_files;
file_name status online_
----------------------------------------------- --------- -------
/u01/app/oracle/oradata/ora11gr2/users01.dbf available online
/u01/app/oracle/oradata/ora11gr2/undotbs01.dbf available online
/u01/app/oracle/oradata/ora11gr2/sysaux01.dbf available online
/u01/app/oracle/oradata/ora11gr2/system01.dbf available system
/u01/app/oracle/oradata/ora11gr2/example01.dbf available online
/u01/app/oracle/oradata/ora11gr2/ts_users01.dbf available online
/u01/app/oracle/oradata/ora11gr2/ts_users02.dbf available online
7 rows selected.
sys@ora11gr2>
sys@ora11gr2>alter tablespace ts_users read only;
tablespace altered.
sys@ora11gr2>select tablespace_name,status from dba_tablespaces;
tablespace_name status
--------------- ---------
system online
sysaux online
undotbs1 online
temp online
users online
example online
ts_users read only
7 rows selected.
sys@ora11gr2>select file_name,status,online_status from dba_data_files;
file_name status online_
----------------------------------------------- --------- -------
/u01/app/oracle/oradata/ora11gr2/users01.dbf available online
/u01/app/oracle/oradata/ora11gr2/undotbs01.dbf available online
/u01/app/oracle/oradata/ora11gr2/sysaux01.dbf available online
/u01/app/oracle/oradata/ora11gr2/system01.dbf available system
/u01/app/oracle/oradata/ora11gr2/example01.dbf available online
/u01/app/oracle/oradata/ora11gr2/ts_users01.dbf available online
/u01/app/oracle/oradata/ora11gr2/ts_users02.dbf available online
7 rows selected.
sys@ora11gr2>
2) 查看控制文件位置
sys@ora11gr2>select name from v$controlfile;
name
--------------------------------------------------------------------------
/u01/app/oracle/oradata/ora11gr2/control01.ctl
/u01/app/oracle/oradata/ora11gr2/control02.ctl
sys@ora11gr2>
3) 转储控制文件到trace文件中
sys@ora11gr2>oradebug setmypid
statement processed.
sys@ora11gr2>alter database backup controlfile to trace;
database altered.
sys@ora11gr2>oradebug tracefile_name
/u01/app/oracle/diag/rdbms/ora11gr2/ora11gr2/trace/ora11gr2_ora_30816.trc
sys@ora11gr2>
4) 打开转储后文件,以下为部分内容
[oracle@ocmu ~]$
cat /u01/app/oracle/diag/rdbms/ora11gr2/ora11gr2/trace/ora11gr2_ora
……
-- set #1. noresetlogs case
--
-- the following commands will create a new control file and use it
-- to open the database.
-- data used by recovery manager will be lost.
-- additional logs may be required for media recovery of offline
-- use this only if the current versions of all online logs are
-- available.
-- after mounting the created controlfile, the following sql
-- statement will place the database in the appropriate
-- protection mode:
-- alter database set standby database to maximize performance
startup nomount
create controlfile reuse database ora11gr2 noresetlogs noarchivelog
maxlogfiles 16
maxlogmembers 3
maxdatafiles 100
maxinstances 8
maxloghistory 292
logfile
group 1 '/u01/app/oracle/oradata/ora11gr2/redo01.log' size 50m blocksize 512,
group 2 '/u01/app/oracle/oradata/ora11gr2/redo02.log' size 50m blocksize 512,
group 3 '/u01/app/oracle/oradata/ora11gr2/redo03.log' size 50m blocksize 512
-- standby logfile
datafile
'/u01/app/oracle/oradata/ora11gr2/system01.dbf',
'/u01/app/oracle/oradata/ora11gr2/sysaux01.dbf',
'/u01/app/oracle/oradata/ora11gr2/undotbs01.dbf',
'/u01/app/oracle/oradata/ora11gr2/users01.dbf',
'/u01/app/oracle/oradata/ora11gr2/example01.dbf'
character set al32utf8
;
……
-- alter database register logfile '/u01/app/oracle/product/11.2.0/db_1/dbs/arch1_1_694825248.dbf';
-- alter database register logfile '/u01/app/oracle/product/11.2.0/db_1/dbs/arch1_1_799882343.dbf';
-- recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
recover database
-- database can now be opened normally.
alter database open;
-- files in read-only tablespaces are now named.
alter database rename file 'missing00006'
to '/u01/app/oracle/oradata/ora11gr2/ts_users01.dbf';
alter database rename file 'missing00007'
to '/u01/app/oracle/oradata/ora11gr2/ts_users02.dbf';
-- online the files in read-only tablespaces.
alter tablespace ts_users online;
-- commands to add tempfiles to temporary tablespaces.
-- online tempfiles have complete space information.
-- other tempfiles may require adjustment.
alter tablespace temp add tempfile '/u01/app/oracle/oradata/ora11gr2/temp01.dbf'
size 30408704 reuse autoextend on next 655360 maxsize 32767m;
-- end of tempfile additions.
……
注 在转储的控制文件中,没有只读表空间的内容
本测试,是先生成转储文件,再恢复的,往往在控制文件丢失之前很少会有人转储控制文件的(当然
了,一般情况都会备份控制文件的),如果没有转储控制文件的话,我们也可以在其他数据库中转储
控制文件,按照目标库的情况进行调整,然后再创建。
5) 手工删除控制文件
[oracle@ocmu ora11gr2]$ pwd
/u01/app/oracle/oradata/ora11gr2
[oracle@ocmu ora11gr2]$ ls *.ctl
control01.ctl control02.ctl
[oracle@ocmu ora11gr2]$ rm *.ctl
[oracle@ocmu ora11gr2]$ ls *.ctl
ls: *.ctl: no such file or directory
[oracle@ocmu ora11gr2]$
6) 控制文件删除以后,数据库是可以正常登陆的
[oracle@ocmu ora11gr2]$ sqlplus / as sysdba
sql*plus: release 11.2.0.1.0 production on tue jan 15 16:09:53 2013
copyright (c) 1982, 2009, oracle. all rights reserved.
connected to:
oracle database 11g enterprise edition release 11.2.0.1.0 - production
with the partitioning, olap, data mining and real application testing options
sys@ora11gr2>
7) 当修改结构信息时,会写控制文件,我们创建一个表空间,立即报错
sys@ora11gr2> create tablespace ts_idx datafile '/u01/app/oracle/oradata/
ora11gr2/ts_idx01.dbf' size 10m;
create tablespace ts_idx datafile '/u01/app/oracle/oradata/ora11gr2/ts_idx01.dbf' size 10m
*
error at line 1:
ora-00210: cannot open the specified control file
ora-00202: control file: '/u01/app/oracle/oradata/ora11gr2/control01.ctl'
ora-27041: unable to open file
linux error: 2: no such file or directory
additional information: 3
sys@ora11gr2>
8) 一致性关闭数据库已经不可能了(控制文件丢失,无法同步scn),采取强制手段
sys@ora11gr2>shutdow immediate;
ora-00210: cannot open the specified control file
ora-00202: control file: '/u01/app/oracle/oradata/ora11gr2/control01.ctl'
ora-27041: unable to open file
linux error: 2: no such file or directory
additional information: 3
sys@ora11gr2>
sys@ora11gr2>shutdown abort;
oracle instance shut down.
sys@ora11gr2>
9) 按照转储文件中的步骤恢复控制文件,nomount启动数据库
sys@ora11gr2>startup nomount;
oracle instance started.
total system global area 841162752 bytes
fixed size 1339768 bytes
variable size 494931592 bytes
database buffers 339738624 bytes
redo buffers 5152768 bytes
sys@ora11gr2>
10) 采用noresetlogs创建控制文件
sys@ora11gr2>create controlfile reuse database ora11gr2 noresetlogs noarchivelog
2 maxlogfiles 16
3 maxlogmembers 3
4 maxdatafiles 100
5 maxinstances 8
6 maxloghistory 292
7 logfile
8 group 1 '/u01/app/oracle/oradata/ora11gr2/redo01.log' size 50m blocksize 512,
9 group 2 '/u01/app/oracle/oradata/ora11gr2/redo02.log' size 50m blocksize 512,
10 group 3 '/u01/app/oracle/oradata/ora11gr2/redo03.log' size 50m blocksize 512
11 -- standby logfile
12 datafile
13 '/u01/app/oracle/oradata/ora11gr2/system01.dbf',
14 '/u01/app/oracle/oradata/ora11gr2/sysaux01.dbf',
15 '/u01/app/oracle/oradata/ora11gr2/undotbs01.dbf',
16 '/u01/app/oracle/oradata/ora11gr2/users01.dbf',
17 '/u01/app/oracle/oradata/ora11gr2/example01.dbf'
18 character set al32utf8
19 ;
control file created.
sys@ora11gr2>
11) 因为之前shutdown没有采取一致性关闭,所以,需要recover database,recover后,可正常open数据库
sys@ora11gr2>alter database open;
alter database open
*
error at line 1:
ora-01113: file 1 needs media recovery
ora-01110: data file 1: '/u01/app/oracle/oradata/ora11gr2/system01.dbf'
sys@ora11gr2>recover database;
media recovery complete.
sys@ora11gr2>
sys@ora11gr2>alter database open;
database altered.
sys@ora11gr2>!ls *.ctl
control01.ctl control02.ctl
sys@ora11gr2>
看似已恢复完成,不过,很清晰的看到,转储的控制文件中,还有几步没有完成,我们继续
12) 再次查看表空间和数据文件状态
我们可以看到,只读表空间的状态依然是read only,不过数据文件的路径、名字及状态都有所变化
sys@ora11gr2>select tablespace_name,status from dba_tablespaces;
tablespace_name status
--------------- ---------
system online
sysaux online
undotbs1 online
temp online
users online
example online
ts_users read only
7 rows selected.
sys@ora11gr2>col file_name for a52
sys@ora11gr2>select file_name,status,online_status from dba_data_files;
file_name status online_
---------------------------------------------------- --------- -------
/u01/app/oracle/oradata/ora11gr2/example01.dbf available online
/u01/app/oracle/oradata/ora11gr2/users01.dbf available online
/u01/app/oracle/oradata/ora11gr2/undotbs01.dbf available online
/u01/app/oracle/oradata/ora11gr2/sysaux01.dbf available online
/u01/app/oracle/oradata/ora11gr2/system01.dbf available system
/u01/app/oracle/product/11.2.0/db_1/dbs/missing00006 available offline
/u01/app/oracle/product/11.2.0/db_1/dbs/missing00007 available offline
7 rows selected.
sys@ora11gr2>
13) 按照转储的步骤继续rename数据文件
注:如果不rename数据文件的话,数据文件是没法online的
sys@ora11gr2>alter database rename file 'missing00006'
to '/u01/app/oracle/oradata/ora11gr2/ts_users01.dbf';
database altered.
sys@ora11gr2>alter database rename file 'missing00007'
to '/u01/app/oracle/oradata/ora11gr2/ts_users02.dbf';
database altered.
sys@ora11gr2>
14) 按照转储步骤,修改表空间online
sys@ora11gr2>alter tablespace ts_users online;
tablespace altered.
sys@ora11gr2>
15) 再次查看表空间、数据文件的状态,已经彻底恢复原貌
sys@ora11gr2>select tablespace_name,status from dba_tablespaces;
tablespace_name status
--------------- ---------
system online
sysaux online
undotbs1 online
temp online
users online
example online
ts_users read only
7 rows selected.
sys@ora11gr2>select file_name,status,online_status from dba_data_files;
file_name status online_
---------------------------------------------------- --------- -------
/u01/app/oracle/oradata/ora11gr2/example01.dbf available online
/u01/app/oracle/oradata/ora11gr2/users01.dbf available online
/u01/app/oracle/oradata/ora11gr2/undotbs01.dbf available online
/u01/app/oracle/oradata/ora11gr2/sysaux01.dbf available online
/u01/app/oracle/oradata/ora11gr2/system01.dbf available system
/u01/app/oracle/oradata/ora11gr2/ts_users01.dbf available online
/u01/app/oracle/oradata/ora11gr2/ts_users02.dbf available online
7 rows selected.
sys@ora11gr2>
16) 转储步骤中还涉及到了临时表空间,我们验证一下,重建控制文件后,临时表空间的情况,没有任何数据文件
sys@ora11gr2>select file_name,tablespace_name from dba_temp_files;
no rows selected
sys@ora11gr2>
17) 按照转储中的语句给临时表空间增加数据文件
sys@ora11gr2>alter tablespace temp
add tempfile '/u01/app/oracle/oradata/ora11gr2/temp01.dbf'
size 30408704 reuse autoextend on next 655360 maxsize 32767m;
tablespace altered.
sys@ora11gr2>
18) 临时文件已添加成功
sys@ora11gr2>select file_name,tablespace_name from dba_temp_files;
file_name tablespace_name
---------------------------------------------------- ---------------
/u01/app/oracle/oradata/ora11gr2/temp01.dbf temp
sys@ora11gr2>
至此,控制文件恢复完毕