由于控制文件是个二进制文件,无法直接打开查阅,但
是通过上一章介绍的如下命令可以将控制文件内容转储出来便于查看:
alter session set events ‘immediate trace name controlf level 12‘;
以下是来自Oracle Database 11g的转储测试:
SQL> alter session set events ‘immediate trace name controlf level 12‘;
Session altered.
#备份控制文件到trace文件中
SQL> alter database backup controlfile to trace;
Database altered.
SQL> select value from v$diag_info where name=‘Default Trace File‘;
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_4929.trc
注意:从11g 开始,可以通过v$diag_info 获得当前会话转储文件的名称。
四.控制文件检查数据库的一致性:
1.控制文件中记录了数据库系统scn号、数据文件scn号与数据文件头列里的开始scn号,如果这三个scn号一致说明数据库可以启动。如果不一致就要恢复。
#系统scn号
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
469717
#文件scn号
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
469717
469717
469717
469717
开始scn号
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
469717
469717
469717
469717
2.scn号与时间的转换:
#全局检查点
SQL> alter system checkpoint;
System altered.
#创建一个函数
SQL> create or replace
function scn_to_timestamp(query_scn in NUMBER)
return TIMESTAMP
IS EXTERNAL
NAME "ktfexscntot"
WITH CONTEXT
PARAMETERS (context ,query_scn OCINUMBER,RETURN)
LIBRARY DBMS_TRAN_LIB;
/ 2 3 4 5 6 7 8 9
Function created.
#系统scn
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
473363
#scn转成时间
SQL> select scn_to_timestamp(473363) from dual;
SCN_TO_TIMESTAMP(473363)
---------------------------------------------------------------------------
16-JUN-14 06.16.14.000000000 AM
#时间转成scn
SQL> select timestamp_to_scn(‘16-JUN-14 06.16.14.000000000 AM‘) from dual;
TIMESTAMP_TO_SCN(‘16-JUN-1406.16.14.000000000AM‘)
-------------------------------------------------
473362
五.控制文件多元化 (增减控制文件数据量)
1.规划原则: 多例复用,定义多个控制文件,分别放在不同的磁盘上。
2.管理控制文件的个数和位置:
spfile 或pfile 都可以实现对控制文件的个数和位置的管理
spfile步骤:
修改spfile参数control_file
一致性关闭数据库
增加或者减少控制文件
使用spfile启动数据库
验证结果。
例:修改控制文件个数
--减少控制文件
SQL> alter system set control_files=‘/opt/oracle/oradata/orcl/control01.ctl‘ scope=spfile;
SQL> alter system set control_files=‘/opt/oracle/oradata/orcl/control01.ctl‘,
‘/opt/oracle/oradata/orcl/control02.ctl‘,
‘/opt/oracle/oradata/orcl/control03.ctl‘ scope=spfile;
System altered.
--关闭数据库
--copy控制文件到添加目录 或者删除控制文件
[oracle@master disk3]$ cp /u01/app/oracle/oradata/prod/disk3/control01.ctl
/u01/app/oracle/oradata/prod/disk4/control01.ctl
--启动数据库
SQL> startup
ORACLE instance started.
Total System Global Area 418484224 bytes
Fixed Size 1336932 bytes
Variable Size 276826524 bytes
Database Buffers 134217728 bytes
Redo Buffers 6103040 bytes
Database mounted.
Database opened.
3. pfile步骤:
修改pfile参数
一致性关闭数据库
增加或者减少控制文件
使用pfile启动数据库
验证结果。
修改控制文件:
*.control_files=‘/u01/app/oracle/oradata/prod/disk1/control01.ctl‘,‘/u01/app/oracle/oradata/prod/disk2/control01.ctl‘,‘/u01/app/oracle/oradata/prod/disk3/control01.ctl‘,‘/u01/app/oracle/oradata/prod/disk4/control01.ctl‘,‘/u01/app/oracle/oradata/prod/disk5/control01.ctl‘
关闭数据库:
SQL>shutdown immediate
copy文件:
[oracle@master dbs]$cp /u01/app/oracle/oradata/prod/disk4/control01.ctl /u01/app/oracle/oradata/prod/disk5/control01.ctl
启动数据库:
SQL> startup
ORACLE instance started.
Total System Global Area 418484224 bytes
Fixed Size 1336932 bytes
Variable Size 276826524 bytes
Database Buffers 134217728 bytes
Redo Buffers 6103040 bytes
Database mounted.
Database opened.
六.控制文件的恢复:(控制文件全丢了要重建控制文件)
1.有多个控制文件时,丢了其中一个控制文件的恢复.
解决:拷贝其他的控制文件到丢失的目录即可。
2.控制文件全部丢失, 但controlfile备份到trace文件中的情况:
执行过alter database backup controlfile to trace;
解决:启动nomount状态,重建控制文件: noresetlogs
例:
①.启动数据库:报错
SQL> startup
ORACLE instance started.
Total System Global Area 418484224 bytes
Fixed Size 1336932 bytes
Variable Size 276826524 bytes
Database Buffers 134217728 bytes
Redo Buffers 6103040 bytes
ORA-00205: error in identifying control file, check alert log for more info
②.查看告警日志:报错
ALTER DATABASE MOUNT
ORA-00210: cannot open the specified control file
ORA-00202: control file: ‘/u01/app/oracle/oradata/prod/disk3/control01.ctl‘
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ORA-00210: cannot open the specified control file
ORA-00202: control file: ‘/u01/app/oracle/oradata/prod/disk2/control01.ctl‘
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ORA-00210: cannot open the specified control file
ORA-00202: control file: ‘/u01/app/oracle/oradata/prod/disk1/control01.ctl‘
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Mon Jun 16 15:16:04 2014
Checker run found 2 new persistent data failures
ORA-205 signalled during: ALTER DATABASE MOUNT...
③.找trace 文件中的一句话(在trace 文件的最后),进行重建控制文件。 注意:这里的PROD是db_name .
CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 2
MAXDATAFILES 30
MAXINSTANCES 1
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
‘/u01/app/oracle/oradata/prod/disk1/redo01.log‘,
‘/u01/app/oracle/oradata/prod/disk2/redo01.log‘
) SIZE 100M BLOCKSIZE 512,
GROUP 2 (
‘/u01/app/oracle/oradata/prod/disk1/redo02.log‘,
‘/u01/app/oracle/oradata/prod/disk2/redo02.log‘
) SIZE 100M BLOCKSIZE 512,
GROUP 3 (
‘/u01/app/oracle/oradata/prod/disk1/redo03.log‘,
‘/u01/app/oracle/oradata/prod/disk2/redo03.log‘
) SIZE 100M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
‘/u01/app/oracle/oradata/prod/disk3/system01.dbf‘,
‘/u01/app/oracle/oradata/prod/disk3/sysaux01.dbf‘,
‘/u01/app/oracle/oradata/prod/disk3/undotbs01.dbf‘,
‘/u01/app/oracle/oradata/prod/disk3/users01.dbf‘
CHARACTER SET AL32UTF8
;
在nomount执行上面的重建控制文件语句。
③.启动数据库到open状态,
SQL> alter database open;
Database altered.
查看表空间的信息
SQL> select tablespace_name ,contents from dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------ ---------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS UNDO
TEMPTS1 TEMPORARY
USERS PERMANENT
确认下临时表空间的数据文件是否存在
SQL> select file#,name from v$tempfile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/prod/disk3/temp01.dbf
3.控制文件全部丢失,有控制文件的备份:(实验未成功)
解决: 启动到nomount 状态,copy旧的控制文件,控制文件相应的目录,
启动到mount,执行alter database backup controlfile to trace;
关闭数据库,删除旧的控制文件,
在trace中找到重建控制文件语句,重建控制文件,
启动数据库到open,检查临时表空间的数据文件是否存在(一般临时表空间不存在,重新创建一个临时表空间,设置为默认临时表空间)。
创建临时表空间
SQL> create temporary tablespace tempts2 tempfile ‘/u01/app/oracle/oradata/prod/disk5/temp01.dbf‘ size 50m;
Tablespace created.
设置为默认临时表空间
SQL> alter database default temporary tablespace tempts2;
Database altered.
查看
SQL> select file#,name from v$tempfile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/prod/disk5/temp01.dbf
4. 如果没有控制文件的备份和backup to trace,只要能找到建库语句,修改(日志文件,数据文件的路径要与数据库的一致)后执行就可。
5.恢复控制文件的各种情况
重建控制文件不一定需要用resetlogs开库。
先尝试
alter database open;
情况1:顺利开库
情况2:需要不完全恢复,恢复后正常开库
recover database;
alter database open;
情况3:不完全恢复后,只能resetlogs开库
如果刚刚是shutdown abort的,使用recover database until cancel;
如果需要做不完全恢复,系统会提示你用 using backup controlfile;
SQL> recover database using backup controlfile;
执行上面的一句话后,要输入日志文件的。