控制文件(control file)是一个相当小的文件(最多能增长到64M左右),其中包含Oracle需要的其他文件的一个目录。参数文件告知实例控制文件的位置,控制文件则告知示例数据库和在线重做日志文件的位置。控制文件还告知了Oracle其他一些事情,如已发生检查点的有关信息、数据库名(必须和db_name参数匹配)、创建数据库的时间戳、归档重做日志的历史(有时这会让控制文件变大)、RMAN信息等。
控制文件应该通过硬件(RAID)多路保存,如果不支持镜像,则要通过Oracle多路保存。应该有不止一个副本,而且它们应该保存在不同的磁盘上,以防止万一出现磁盘故障而丢失控制文件。丢失控制文件并不是致命的,但是会使恢复变得困难很多。
如果丢失了所有的控制文件并且没有任何的备份,我们可以通过重建控制文件来打开数据库。其中,重建控制文件至少需要以下信息:
1.数据库名
2.字符集
3.数据文件名称
4.初始化参数,包括MAXLOGFILES、MAXLOGMEMBERS、MAXDATAFILES、MAXINSTANCES、MAXLOGHISTORY等;
1.环境准备
数据库版本
我们在Oracle11g中进行测试。
1 SQL> 2 SQL> select * from v$version; 3 4 BANNER 5 -------------------------------------------------------------------------------- 6 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production 7 PL/SQL Release 11.2.0.3.0 - Production 8 CORE 11.2.0.3.0 Production 9 TNS for Linux: Version 11.2.0.3.0 - Production 10 NLSRTL Version 11.2.0.3.0 - Production 11 12 SQL>
模拟丢失删除控制文件
1.通过查询control_files初始化参数,获取控制文件路径;
1 SQL> 2 SQL> show parameter control_files 3 4 NAME TYPE VALUE 5 ------------------------------------ ----------- ------------------------------ 6 control_files string /u01/app/oracle/oradata/HOEGH/ 7 control01.ctl, /u01/app/oracle 8 /oradata/HOEGH/control02.ctl 9 SQL>
2.然后,使用rm命令删除控制文件;
1 [oracle@HOEGH ~]$ rm /u01/app/oracle/oradata/HOEGH/control01.ctl 2 [oracle@HOEGH ~]$ rm /u01/app/oracle/oradata/HOEGH/control02.ctl 3 [oracle@HOEGH ~]$
3.此时,强制关闭数据库,然后重启数据库,报ORA-00205错误。需要注意的是,此时执行shutdown immediate命令,数据库无法正常关闭,只能关闭到mounted状态;需要使用shutdown abort命令强制关闭数据库。
1 SQL> 2 SQL> shutdown immediate 3 Database closed. 4 ORA-00210: cannot open the specified control file 5 ORA-00202: control file: \'/u01/app/oracle/oradata/HOEGH/control01.ctl\' 6 ORA-27041: unable to open file 7 Linux Error: 2: No such file or directory 8 Additional information: 3 9 10 11 SQL> select status from v$instance; 12 13 STATUS 14 ------------ 15 MOUNTED 16 17 SQL> 18 SQL> shutdown abort 19 ORACLE instance shut down. 20 SQL> 21 22 23 24 SQL> 25 SQL> startup 26 ORACLE instance started. 27 28 Total System Global Area 941600768 bytes 29 Fixed Size 1348860 bytes 30 Variable Size 515902212 bytes 31 Database Buffers 419430400 bytes 32 Redo Buffers 4919296 bytes 33 ORA-00205: error in identifying control file, check alert log for more info 34 35 36 SQL>
2.获取数据库名
首先生成文本格式的参数文件;
1 SQL> 2 SQL> create pfile='/backup/tmppfile' from spfile; 3 4 File created.
若不指定路径则创建的文件在这里
\app\bogcmdbadm\product\11.2.0\dbhome_1\database\Initorcl.ora
打开参数文件,查看db_name参数值,即为数据库名称。
1 [oracle@hoegh dbs]$ cat initHOEGH.ora 2 HOEGH.__db_cache_size=419430400 3 HOEGH.__java_pool_size=4194304 4 HOEGH.__large_pool_size=4194304 5 HOEGH.__oracle_base=\'/u01/app/oracle\'#ORACLE_BASE set from environment 6 HOEGH.__pga_aggregate_target=377487360 7 HOEGH.__sga_target=566231040 8 HOEGH.__shared_io_pool_size=0 9 HOEGH.__shared_pool_size=130023424 10 HOEGH.__streams_pool_size=0 11 *.audit_file_dest=\'/u01/app/oracle/admin/HOEGH/adump\' 12 *.audit_trail=\'db\' 13 *.compatible=\'11.2.0.0.0\' 14 *.control_files=\'/u01/app/oracle/oradata/HOEGH/control01.ctl\',\'/u01/app/oracle/oradata/HOEGH/control02.ctl\' 15 *.db_block_size=8192 16 *.db_domain=\'\' 17 *.db_name=\'HOEGH\' 18 *.diagnostic_dest=\'/u01/app/oracle\' 19 *.dispatchers=\'(PROTOCOL=TCP) (SERVICE=HOEGHXDB)\' 20 *.memory_max_target=943718400 21 *.memory_target=943718400 22 *.open_cursors=300 23 *.processes=150 24 *.remote_login_passwordfile=\'EXCLUSIVE\' 25 *.undo_tablespace=\'UNDOTBS1\' 26 [oracle@hoegh dbs]$
3.启动到nomount状态,获取字符集
由于需要执行查询语句select userenv('language') from dual;来获取字符集,因此需要将数据库启动到nomount状态。
1 SQL> 2 SQL> startup nomount 3 ORACLE instance started. 4 5 Total System Global Area 941600768 bytes 6 Fixed Size 1348860 bytes 7 Variable Size 515902212 bytes 8 Database Buffers 419430400 bytes 9 Redo Buffers 4919296 bytes 10 SQL> 11 SQL> select userenv(\'language\') from dual; 12 13 USERENV(\'LANGUAGE\') 14 ---------------------------------------------------- 15 AMERICAN_AMERICA.US7ASCII 16 17 SQL> 18 SQL>
4.获取数据文件名称
通过ls命令获取数据文件列表。注意不要遗漏任何数据文件 redo.log 文件,否则会报错。
[oracle@hoegh HOEGH]$ ls -lh total 1.8G -rw-r----- 1 oracle oinstall 314M May 30 11:07 example01.dbf -rw-r----- 1 oracle oinstall 51M May 30 11:07 redo01.log -rw-r----- 1 oracle oinstall 51M May 30 11:07 redo02.log -rw-r----- 1 oracle oinstall 51M May 30 11:07 redo03.log -rw-r----- 1 oracle oinstall 541M May 30 11:07 sysaux01.dbf -rw-r----- 1 oracle oinstall 721M May 30 11:07 system01.dbf -rw-r----- 1 oracle oinstall 30M Oct 13 2014 temp01.dbf -rw-r----- 1 oracle oinstall 96M May 30 11:07 undotbs01.dbf -rw-r----- 1 oracle oinstall 5.1M May 30 11:07 users01.dbf [oracle@hoegh HOEGH]$
5.生成创建控制文件脚本
这样,创建控制文件所需的基本信息都已经有了,我们来生成创建控制文件脚本。
注意:临时文件只需要创建控制文件后,重构即可,不需要在创建控制文件中创建。代码如下:
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oracle/oradata/orcl/temp01.dbf' SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
1 STARTUP NOMOUNT 2 CREATE CONTROLFILE REUSE DATABASE \"HOEGH\" NORESETLOGS ARCHIVELOG 3 MAXLOGFILES 5 4 MAXLOGMEMBERS 3 5 MAXDATAFILES 100 6 MAXINSTANCES 1 7 MAXLOGHISTORY 226 8 LOGFILE 9 GROUP 1 \'/u01/app/oracle/oradata/HOEGH/redo01.log\' SIZE 50M, 10 GROUP 2 \'/u01/app/oracle/oradata/HOEGH/redo02.log\' SIZE 50M, 11 GROUP 3 \'/u01/app/oracle/oradata/HOEGH/redo03.log\' SIZE 50M 12 DATAFILE 13 \'/u01/app/oracle/oradata/HOEGH/system01.dbf\', 14 \'/u01/app/oracle/oradata/HOEGH/sysaux01.dbf\', 15 \'/u01/app/oracle/oradata/HOEGH/undotbs01.dbf\', 16 \'/u01/app/oracle/oradata/HOEGH/users01.dbf\', 17 \'/u01/app/oracle/oradata/HOEGH/example01.dbf\', 18 \'/u01/app/oracle/oradata/HOEGH/temp01.dbf\' 19 CHARACTER SET US7ASCII 20 ;
6.重建控制文件
需要注意的是,在执行上述创建脚本时会报错,系统提示临时文件不属于数据文件,如下所示:
1 SQL> @/u01/app/oracle/oradata/HOEGH/CreateControlFile.sql 2 ORA-01081: cannot start already-running ORACLE - shut it down first 3 CREATE CONTROLFILE REUSE DATABASE \"HOEGH\" NORESETLOGS ARCHIVELOG 4 * 5 ERROR at line 1: 6 ORA-01503: CREATE CONTROLFILE failed 7 ORA-01160: file is not a data file 8 ORA-01110: data file : \'/u01/app/oracle/oradata/HOEGH/temp01.dbf\' 9 10 11 SQL>
修改脚本并重新执行,重建控制文件后,数据库会打开到mount状态。
1 SQL> 2 SQL> @/u01/app/oracle/oradata/HOEGH/CreateControlFile.sql 3 ORACLE instance started. 4 5 Total System Global Area 941600768 bytes 6 Fixed Size 1348860 bytes 7 Variable Size 515902212 bytes 8 Database Buffers 419430400 bytes 9 Redo Buffers 4919296 bytes 10 11 Control file created. 12 13 SQL> 14 SQL> select status from v$instance; 15 16 STATUS 17 ------------ 18 MOUNTED 19 20 SQL>
7.打开数据库
在打开数据库时,会报错,提示system01数据文件需要执行介质恢复,我们执行recover database即可。
1 SQL> 2 SQL> alater database open; 3 SP2-0734: unknown command beginning \"alater dat...\" - rest of line ignored. 4 SQL> 5 SQL> alter database open; 6 alter database open 7 * 8 ERROR at line 1: 9 ORA-01113: file 1 needs media recovery 10 ORA-01110: data file 1: \'/u01/app/oracle/oradata/HOEGH/system01.dbf\' 11 12 13 SQL> 14 SQL> recover database; 15 Media recovery complete. 16 SQL> 17 SQL> alter database open; 18 19 Database altered. 20 21 SQL> 22 SQL> select * from v$version; 23 24 BANNER 25 -------------------------------------------------------------------------------- 26 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production 27 PL/SQL Release 11.2.0.3.0 - Production 28 CORE 11.2.0.3.0 Production 29 TNS for Linux: Version 11.2.0.3.0 - Production 30 NLSRTL Version 11.2.0.3.0 - Production 31 32 SQL> 33 SQL> select tablespace_name from dba_tablespaces; 34 35 36 TABLESPACE_NAME 37 ------------------------------ 38 SYSTEM 39 SYSAUX 40 UNDOTBS1 41 TEMP 42 USERS 43 EXAMPLE 44 45 46 6 rows selected. 47 48 49 SQL> 50 51
8.总结
下面总结一下重建控制文件的步骤:
1.获取数据库名;
2.获取字符集名;
3.获取数据文件名;
4.重建控制文件;
5.执行介质恢复;
6.打开数据库。