大家都知道,数据库启动有几个阶段:closed → nomount → mount → open。每个阶段都用到了不同的文件,其中:
从closed →nomount 读取的是spfile或pfile参数文件,在此过程中,分配SGA和后台进程。
从nomount → mount 读取的是control file控制文件,在mount状态,可以调整数据库的归档模式,并能做备份和恢复动作。
从mount → open 读取的是联机数据文件和redo 文件。
所以当control file出现问题时,数据库启动会遇到什么问题,接下来做个试验:
一、模拟control file丢失环境
(关闭数据库拷贝控制文件,开启数据库执行DML操作后关闭数据库,备份最新的控制文件,并将旧的控制文件覆盖到新的控制文件中)
1.1 本数据库控制文件指定了两个镜像,现仅覆盖其中一个控制文件:
1.1.1 关闭数据库:
SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> exitDisconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options
1.1.2 备份控制文件为control01.ctl.bak、control02.ctl.bak:
[oracle@localhost ~]$ cd /oracle/app/oracle/oradata/[oracle@localhost oradata]$ lsmydb[oracle@localhost oradata]$ cd mydb/[oracle@localhost mydb]$ lscontrol01.ctl example01.dbf redo01.log redo02.log redo04.log system01.dbf temp02.dbf test1.dbf users01.dbfcontrol02.ctl example02.dbf redo0201.log redo03.log sysaux01.dbf temp01.dbf temp03.dbf undotbs02.dbf users02.dbf[oracle@localhost mydb]$ cp control01.ctl control01.ctl.bak[oracle@localhost mydb]$ cp control02.ctl control02.ctl.bak[oracle@localhost mydb]$ lscontrol01.ctl control02.ctl example01.dbf redo01.log redo02.log redo04.log system01.dbf temp02.dbf test1.dbf users01.dbfcontrol01.ctl.bak control02.ctl.bak example02.dbf redo0201.log redo03.log sysaux01.dbf temp01.dbf temp03.dbf undotbs02.dbf users02.dbf[oracle@localhost mydb]$ cd ~
1.1.3 打开数据库,进行DML操作:
[oracle@localhost ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 23 18:19:14 2018Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to an idle instance.SQL> startupORACLE instance started.Total System Global Area 830930944 bytesFixed Size 2257800 bytesVariable Size 503319672 bytesDatabase Buffers 318767104 bytesRedo Buffers 6586368 bytesDatabase mounted.Database opened.SQL> create table hr.test033002 (test varchar2(10),num int);Table created.SQL> insert into hr.test033002 values('ubin',1);1 row created.SQL> commit;Commit complete.SQL> update hr.test033002 set test='dftugyoi' where num=1;1 row updated.SQL> commit;Commit complete.
1.1.4 关闭数据库:
SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> exitDisconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options
1.1.5 备份最新的控制文件为 control01.ctl.bak1、control02.ctl.bak1:
[oracle@localhost ~]$ cd $ORACLE_BASE/oradata/mydb/[oracle@localhost mydb]$ lscontrol01.ctl control02.ctl example01.dbf redo01.log redo02.log redo04.log system01.dbf temp02.dbf test1.dbf users01.dbfcontrol01.ctl.bak control02.ctl.bak example02.dbf redo0201.log redo03.log sysaux01.dbf temp01.dbf temp03.dbf undotbs02.dbf users02.dbf[oracle@localhost mydb]$ cp control01.ctl control01.ctl.bak1[oracle@localhost mydb]$ cp control02.ctl control02.ctl.bak1[oracle@localhost mydb]$ lscontrol01.ctl control01.ctl.bak1 control02.ctl.bak example01.dbf redo01.log redo02.log redo04.log system01.dbf temp02.dbf test1.dbf users01.dbfcontrol01.ctl.bak control02.ctl control02.ctl.bak1 example02.dbf redo0201.log redo03.log sysaux01.dbf temp01.dbf temp03.dbf undotbs02.dbf users02.dbf
1.1.6 将第一次备份的控制文件覆盖,仅覆盖control.ctl:
[oracle@localhost mydb]$ rm control01.ctl[oracle@localhost mydb]$ cp control01.ctl.bak control01.ctl[oracle@localhost mydb]$ cd ~
1.1.7 此时,登录sys用户,执行startup,观察:
[oracle@localhost mydb]$ cd ~[oracle@localhost ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 23 18:21:58 2018Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to an idle instance.SQL> startupORACLE instance started.Total System Global Area 830930944 bytesFixed Size 2257800 bytesVariable Size 503319672 bytesDatabase Buffers 318767104 bytesRedo Buffers 6586368 bytesORA-00214: control file '/oracle/app/oracle/oradata/mydb/control02.ctl' version2642138 inconsistent with file '/oracle/app/oracle/oradata/mydb/control01.ctl'version 2642121SQL> select open_mode from v$database;select open_mode from v$database*ERROR at line 1:ORA-01507: database not mounted
发现在启动数据库时,抛出ora-00214报错,控制文件版本不一致问题,且数据库状态为nomount。
1.2 本数据库控制文件指定了两个镜像,现全部覆盖控制文件:
1.2.1 基于1.1全部操作后续,继续覆盖control02.ctl
SQL> shutdown immediateORA-01507: database not mountedORACLE instance shut down.SQL> exitDisconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options[oracle@localhost ~]$ cd $ORACLE_BASE/oradata/mydb[oracle@localhost mydb]$ lscontrol01.ctl control01.ctl.bak1 control02.ctl.bak example01.dbf redo01.log redo02.log redo04.log system01.dbf temp02.dbf test1.dbf users01.dbfcontrol01.ctl.bak control02.ctl control02.ctl.bak1 example02.dbf redo0201.log redo03.log sysaux01.dbf temp01.dbf temp03.dbf undotbs02.dbf users02.dbf[oracle@localhost mydb]$ rm control02.ctl[oracle@localhost mydb]$ cp control02.ctl.bak control02.ctl[oracle@localhost mydb]$ lscontrol01.ctl control01.ctl.bak1 control02.ctl.bak example01.dbf redo01.log redo02.log redo04.log system01.dbf temp02.dbf test1.dbf users01.dbfcontrol01.ctl.bak control02.ctl control02.ctl.bak1 example02.dbf redo0201.log redo03.log sysaux01.dbf temp01.dbf temp03.dbf undotbs02.dbf users02.dbf[oracle@localhost mydb]$ cd ~
1.2.2 登录sys用户,执行startup 观察结果:
[oracle@localhost ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 23 18:23:10 2018Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to an idle instance.SQL> startupORACLE instance started.Total System Global Area 830930944 bytesFixed Size 2257800 bytesVariable Size 503319672 bytesDatabase Buffers 318767104 bytesRedo Buffers 6586368 bytesDatabase mounted.ORA-01122: database file 1 failed verification checkORA-01110: data file 1: '/oracle/app/oracle/oradata/mydb/system01.dbf'ORA-01207: file is more recent than control file - old control fileSQL> select status from v$instance;STATUS------------------------MOUNTED
发现在启动数据库时,抛出 ORA-01122,ORA-01110,ORA-01207错误,且此时数据库状态为mount。
二、进行恢复control 控制文件,开启数据库
通过mos文档,可参考文档:
ORA-1122, ORA-1110, ORA-1207 while open the database after crash (文档 ID 283927.1)
How to Recreate a Controlfile (文档 ID 735106.1)
第一步:将数据库打开至mount状态
[oracle@localhost ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 23 18:52:50 2018Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to an idle instance.SQL> startup mountORACLE instance started.Total System Global Area 830930944 bytesFixed Size 2257800 bytesVariable Size 503319672 bytesDatabase Buffers 318767104 bytesRedo Buffers 6586368 bytesDatabase mounted.
第二步:将控制文件的创建语句放在trace里:
SQL> alter database backup controlfile to trace;
Database altered.
SQL> oradebug setmypid;
Statement processed.SQL> oradebug tracefile_name;/oracle/app/oracle/diag/rdbms/mydb/mydb/trace/mydb_ora_7350.trc第三步:查看trace文件,提取语句
[oracle@localhost ~]$ more /oracle/app/oracle/diag/rdbms/mydb/mydb/trace/mydb_ora_7350.trcTrace file /oracle/app/oracle/diag/rdbms/mydb/mydb/trace/mydb_ora_7350.trcOracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsORACLE_HOME = /oracle/app/oracle/product/11.2.0/dbhome_1System name: LinuxNode name: localhost.localdomainRelease: 2.6.32-504.el6.x86_64Version: #1 SMP Tue Sep 16 01:56:35 EDT 2014Machine: x86_64VM name: VMWare Version: 6Instance name: mydbRedo thread mounted by this instance: 1Oracle process number: 19Unix process pid: 7350, image: oracle@localhost.localdomain (TNS V1-V3)*** 2018-02-23 18:57:48.660*** SESSION ID:(125.3) 2018-02-23 18:57:48.660*** CLIENT ID:() 2018-02-23 18:57:48.660*** SERVICE NAME:() 2018-02-23 18:57:48.660*** MODULE NAME:(sqlplus@localhost.localdomain (TNS V1-V3)) 2018-02-23 18:57:48.660*** ACTION NAME:() 2018-02-23 18:57:48.660 -- The following are current System-scope REDO Log Archival related-- parameters and can be included in the database initialization file.---- LOG_ARCHIVE_DEST=''-- LOG_ARCHIVE_DUPLEX_DEST=''---- LOG_ARCHIVE_FORMAT=%t_%s_%r.dbf---- DB_UNIQUE_NAME="mydb"---- LOG_ARCHIVE_CONFIG='SEND, RECEIVE, NODG_CONFIG'-- LOG_ARCHIVE_MAX_PROCESSES=4-- STANDBY_FILE_MANAGEMENT=MANUAL-- STANDBY_ARCHIVE_DEST=?/dbs/arch-- FAL_CLIENT=''-- FAL_SERVER=''---- LOG_ARCHIVE_DEST_1='LOCATION=/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/arch'-- LOG_ARCHIVE_DEST_1='MANDATORY NOREOPEN NODELAY'-- LOG_ARCHIVE_DEST_1='ARCH NOAFFIRM EXPEDITE NOVERIFY SYNC'-- LOG_ARCHIVE_DEST_1='NOREGISTER NOALTERNATE NODEPENDENCY'-- LOG_ARCHIVE_DEST_1='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED NODB_UNIQUE_NAME'-- LOG_ARCHIVE_DEST_1='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)'-- LOG_ARCHIVE_DEST_STATE_1=ENABLE---- Below are two sets of SQL statements, each of which creates a new-- control file and uses it to open the database. The first set opens-- the database with the NORESETLOGS option and should be used only if-- the current versions of all online logs are available. The second-- set opens the database with the RESETLOGS option and should be used-- if online logs are unavailable.-- The appropriate set of statements can be copied from the trace into-- a script file, edited as necessary, and executed when there is a-- need to re-create the control file.---- 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 PERFORMANCESTARTUP NOMOUNTCREATE CONTROLFILE REUSE DATABASE "MYDB" NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 584LOGFILE GROUP 1 '/oracle/app/oracle/oradata/mydb/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/oracle/app/oracle/oradata/mydb/redo02.log' SIZE 100M BLOCKSIZE 512, GROUP 3 '/oracle/app/oracle/oradata/mydb/redo03.log' SIZE 50M BLOCKSIZE 512, GROUP 4 '/oracle/app/oracle/oradata/mydb/redo04.log' SIZE 100M BLOCKSIZE 512-- STANDBY LOGFILEDATAFILE '/oracle/app/oracle/oradata/mydb/system01.dbf', '/oracle/app/oracle/oradata/mydb/sysaux01.dbf', '/oracle/app/oracle/oradata/mydb/users02.dbf', '/oracle/app/oracle/oradata/mydb/users01.dbf', '/oracle/app/oracle/oradata/mydb/example01.dbf', '/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/bigtbs_f2.dbf', '/oracle/app/oracle/oradata/mydb/example02.dbf', '/oracle/app/oracle/oradata/mydb/test1.dbf', '/oracle/app/oracle/oradata/mydb/undotbs02.dbf'CHARACTER SET WE8MSWIN1252;-- Commands to re-create incarnation table-- Below log names MUST be changed to existing filenames
第四步:创建生成控制文件的脚本:
[oracle@localhost ~]$ vi control.sqlCREATE CONTROLFILE REUSE DATABASE "MYDB" NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 584LOGFILE GROUP 1 '/oracle/app/oracle/oradata/mydb/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/oracle/app/oracle/oradata/mydb/redo02.log' SIZE 100M BLOCKSIZE 512, GROUP 3 '/oracle/app/oracle/oradata/mydb/redo03.log' SIZE 50M BLOCKSIZE 512, GROUP 4 '/oracle/app/oracle/oradata/mydb/redo04.log' SIZE 100M BLOCKSIZE 512-- STANDBY LOGFILEDATAFILE '/oracle/app/oracle/oradata/mydb/system01.dbf', '/oracle/app/oracle/oradata/mydb/sysaux01.dbf', '/oracle/app/oracle/oradata/mydb/users02.dbf', '/oracle/app/oracle/oradata/mydb/users01.dbf', '/oracle/app/oracle/oradata/mydb/example01.dbf', '/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/bigtbs_f2.dbf', '/oracle/app/oracle/oradata/mydb/example02.dbf', '/oracle/app/oracle/oradata/mydb/test1.dbf', '/oracle/app/oracle/oradata/mydb/undotbs02.dbf'CHARACTER SET WE8MSWIN1252;~~"control.sql" [New] 24L, 1015C written
第五步:将数据库打开到nomount状态,并执行生成控制文件的脚本:
SQL> startup nomount;ORACLE instance started.Total System Global Area 830930944 bytesFixed Size 2257800 bytesVariable Size 503319672 bytesDatabase Buffers 318767104 bytesRedo Buffers 6586368 bytesSQL> @control.sqlControl file created
第六步:更改数据库状态为open,并查看数据库状态和表空间状态信息:
SQL> alter database open;Database altered.SQL> select status from v$instance;STATUS------------------------OPENSQL> select open_mode from v$database; OPEN_MODE----------------------------------------READ WRITESQL> col TABLESPACE_NAME for a20SQL> select TABLESPACE_NAME,STATUS,CONTENTS from dba_tablespaces;TABLESPACE_NAME STATUS CONTENTS-------------------- ------------------ ------------------SYSTEM ONLINE PERMANENTSYSAUX ONLINE PERMANENTTEMP ONLINE TEMPORARYUSERS ONLINE PERMANENTUNDOTBS2 ONLINE UNDOEXAMPLE ONLINE PERMANENTBIGTBS_02 ONLINE PERMANENTTBS_TEMP_02 ONLINE TEMPORARYTEMP_DEMO ONLINE TEMPORARYTEST ONLINE PERMANENT10 rows selected.
此时,数据库已恢复正常。
其中、mos文档中还指出,需要创建临时表空间
ALTER TABLESPACE TEMP_TEST ADD TEMPFILE '/oradata/V11/temp01.dbf' reuse;
这个应该是因情况不同,本次实验不需要。
暂时记录到这里啦,接下来可以研究下数据文件丢失时如何恢复。