博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
控制文件丢失 如何恢复
阅读量:5104 次
发布时间:2019-06-13

本文共 14008 字,大约阅读时间需要 46 分钟。

大家都知道,数据库启动有几个阶段: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;

这个应该是因情况不同,本次实验不需要。

暂时记录到这里啦,接下来可以研究下数据文件丢失时如何恢复。

 

 

转载于:https://www.cnblogs.com/qingora/p/8678961.html

你可能感兴趣的文章
Android-多线程AsyncTask
查看>>
第一个Spring冲刺周期团队进展报告
查看>>
C++函数基础知识
查看>>
红黑树 c++ 实现
查看>>
Android 获取网络链接类型
查看>>
报表服务框架:WEB前端UI
查看>>
5.9UDP客户端服务器-基于OK6410
查看>>
java自学基础、项目实战网站推荐
查看>>
软件包的使用
查看>>
linux中启动与终止lnmp的脚本
查看>>
BZOJ 1304: [CQOI2009]叶子的染色
查看>>
gdb中信号的处理[转]
查看>>
学习Javascript闭包(Closure)
查看>>
LeetCode【709. 转换成小写字母】
查看>>
toString()和toLocaleString()有什么区别
查看>>
【mybatis】学习笔记之conf.xml与mapper.xml配置
查看>>
Python基础学习Day3 数据类型的转换、int、str、bool、字符串的常用方法、for循环...
查看>>
Controller比较两个对象discs、outlets中的元素是否相等。相同则相应的checkbox为checked...
查看>>
Android中在布局中写ViewPager无法渲染出来的问题
查看>>
简单shellcode编写
查看>>