oracle11g重建控制文件-关闭状态控制文件丢失--markdown格式

实验环境:centos7+11.2.0.4+单实例
这个实验的目的是在没有使用DG、RAC、RMAN的情况下,丢失了控制文件,
总结分为几种情况:
开机状态
1.noresetlog模式;
2.resetlog模式

关机状态
有备份:直接还原备份的控制文件
无备份:1.noresetlog模式;2.resetlog模式

验证结果:
1.数据库能够正常启动
2.表中的数据正常

实验前步骤:
1.创建两个表空间:test1
2.在表空间test1中创建表 users并添加数据,设置为只读变空间
3.备份控制文件

创建表空间test1

create tablespace test1
datafile '/u01/app/oracle/oradata/orcl/test1.dbf' 
size 10M
autoextend on
next 5M maxsize 100M;

创建表users1并添加数据

create table users1(id int,name varchar(200)) tablespace test1;
insert into users1(id,name) values(1,'张三');
insert into users1(id,name) values(1,'李四');
insert into users1(id,name) values(1,'王五');
commit

修改test1表空间为只读表空间

alter tablespace test1 read only;

创建表空间test2并创建表users2

SQL> create tablespace test2                                         
datafile '/u01/app/oracle/oradata/orcl/test2.dbf'
size 10M
autoextend on
next 5M maxsize 100M;

SQL> create table users2(id int,name varchar(200)) tablespace test2;
insert into users2(id,name) values(1,'张三');
insert into users2(id,name) values(2,'李四');
insert into users2(id,name) values(3,'王五');
commit;

备份控制文件

alter database backup controlfile to '/oracle/backup/control.bkp';

删除所有控制文件

1.noresetlog 方式
启动数据库到nomount状态,这里直接启动会报错的,也只会启动到nomount状态

SQL> startup nomount

执行创建控制文件语句。

CREATE CONTROLFILE REUSEDATABASE orcl 
   LOGFILE
          #原数据库所有的日志文件组
           GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log', 
           GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log', 
           GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' 
   NORESETLOGS
   DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf',
            '/u01/app/oracle/oradata/orcl/sysaux01.dbf',
             '/u01/app/oracle/oradata/orcl/users01.dbf',
             '/u01/app/oracle/oradata/orcl/undotbs01.dbf',
            '/u01/app/oracle/oradata/orcl/test2.dbf' 
            #这里需要把除了临时表空间和只读表空间的数据文件都添加进来
   MAXLOGFILES 50
   MAXLOGMEMBERS 3
   MAXLOGHISTORY 400
   MAXDATAFILES 200
   MAXINSTANCES 6
   ARCHIVELOG
   #数据库字符集
character set ZHS16GBK;

恢复数据,并打开数据库

SQL> recover database
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required

SQL> alter system archive log all;

SQL> alter database open;

恢复只读表空间

SQL> alter database rename file 'MISSING00005'
  2  to '/u01/app/oracle/oradata/orcl/test1.dbf';

SQL> alter tablespace "TEST1" online;

2.resetlog方式
启动数据库到nomount状态,这里直接启动会报错的,也只会启动到nomount状态

SQL> startup nomount

执行创建控制文件语句。需要把除了只读表空间和临时表空间的所有数据文件写入进来


CREATE CONTROLFILE REUSEDATABASE orcl 
   LOGFILE
       #使用resetlog模式在创建日志文件参数这里必须加上原日志文件大小
           GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' size 50m, 
           GROUP 2  '/u01/app/oracle/oradata/orcl/redo02.log' size 50m, 
           GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' size 50m 
   RESETLOGS
   DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf',
            '/u01/app/oracle/oradata/orcl/sysaux01.dbf',
             '/u01/app/oracle/oradata/orcl/users01.dbf',
           '/u01/app/oracle/oradata/orcl/undotbs01.dbf',
            '/u01/app/oracle/oradata/orcl/test2.dbf'
   MAXLOGFILES 50
   MAXLOGMEMBERS 3
   MAXLOGHISTORY 400
   MAXDATAFILES 200
   MAXINSTANCES 6
   ARCHIVELOG
character set ZHS16GBK;

恢复数据需要指定日志文件,默认找最新的归档日志,不存在需要指定最新的redo_log。(同样的路径打了两次第一次失败,第二次成功。。。)

SQL> recover database using backup controlfile;
ORA-00279: change 1006901 generated at 09/23/2017 19:23:06 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ORCL/archivelog/2017_09_23/o1_mf_1_1_%u_.arc
ORA-00280: change 1006901 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/redo01.log
ORA-00308: cannot open archived log '/u01/app/oracle/oradata/redo01.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl/redo01.log
Log applied.
Media recovery complete.

使用resetlog打开数据库,恢复只读表空间和临时表空间

SQL>alter database open resetlogs;

SQL> ALTER DATABASE RENAME FILE 'MISSING00005'
  TO '/u01/app/oracle/oradata/orcl/test1.dbf';

SQL> ALTER TABLESPACE "TEST1" ONLINE;

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf'
     SIZE 30408704  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

这样就创建完成了,数据库正常启动了。数据也正常

创建控制文件的语句参考官方文档

重建控制文件参数介绍(借助google网页翻译)

控制文件创建句法

CREATE CONTROLFILE
  [ REUSE ] [ SET ] DATABASE database
  [ logfile_clause ]
  { RESETLOGS | NORESETLOGS }
  [ DATAFILE file_specification
             [, file_specification ]... ]
  [ MAXLOGFILES integer
  | MAXLOGMEMBERS integer
  | MAXLOGHISTORY integer
  | MAXDATAFILES integer
  | MAXINSTANCES integer
  | { ARCHIVELOG | NOARCHIVELOG }
  | FORCE LOGGING
  ]...
  [ character_set_clause ] ;


LOGFILE
[ GROUP integer ] file_specification
  [, [ GROUP integer ] file_specification ]...

CHARACTER SET character_set

REUSE:指定ruse表示由初始化参数识别现有控制文件control_files可以重复使用,覆盖其当前可能包含的任何信息。如果省略此子句,并且任一控制文件已存在,则Oracle数据库将返回错误

DATABASE Clause:
指定数据库的名称。此参数的值必须是由先前CREATE DATABASE语句或CREATECONTROLFILE语句建立的现有数据库名称。

SET DATABASE Clause:
使用SET DATABASE更改数据库的名称。数据库的名称可以长达八个字节。
指定此子句时,还必须指定RESETLOGS。如果要重命名数据库并保留现有日志文件,则在发出此CREATE CONTROLFILE语句后,必须使用ALTER DATABASE RECOVER USING BACKUPCONTROLFILE语句完成完整的数据库恢复。

logfile_clause
使用logfile_clause指定的重做日志文件的数据库。您必须列出所有重做日志文件组的所有成员。
GROUP INT:
指定日志文件组号。如果指定GROUP值,则Oracle数据库将GROUP在数据库上次打开时使用值验证这些值。
如果省略此子句,则数据库将使用系统默认值创建日志文件。另外,如果已经设置了DB_CREATE_ONLINE_LOG_DEST_n或者DB_CREATE_FILE_DEST初始化参数,并且如果你已经指定了RESETLOGS,那么数据库在DB_CREATE_ONLINE_LOG_DEST_n参数中指定的默认logfile目标中创建两个日志,如果没有设置,那么在DB_CREATE_FILE_DEST参数中。
RESETLOGS 指定RESETLOGS是否希望Oracle数据库忽略LOGFILE子句中列出的文件的内容。这些文件不必存在。如果指定了该子句,则必须指定此SET DATABASE子句。

每个redo_log_file_spec中LOGFILE子句都必须指定的SIZE参数。数据库将所有在线重做日志文件组分配给线程1,并使此线程可以由任何实例公开使用。使用此子句后,必须使用语句的RESETLOGS子句打开数据库ALTER DATABASE。

NORESETLOGS 指定NORESETLOGS是否希望Oracle数据库在LOGFILE子句中使用数据库上次打开时的所有文件。这些文件必须存在,并且必须是当前联机重做日志文件,而不是恢复的备份。数据库将重做日志文件组重新分配给先前分配给它们的线程,并重新启用线程,因为它们先前已启用。

DATAFILE Clause
指定数据库的数据文件。您必须列出所有数据文件。这些文件必须全部存在,尽管它们可能是还原需要介质恢复的备份。
在DATAFILE子句中不要包含只读表空间和临时表空间。稍后可以将这些类型的文件添加到数据库。

MAXLOGFILES Clause
指定可以为数据库创建的联机重做日志文件组的最大数量。Oracle数据库使用此值来确定在控制文件中为重做日志文件的名称分配多少空间。默认值和最大值取决于您的操作系统。指定的值不应小于GROUP任何重做日志文件组的最大值。

MAXLOGMEMBERS Clause
为重做日志文件组指定最大成员数或相同副本。Oracle数据库使用此值来确定在控制文件中为重做日志文件的名称分配多少空间。最小值为1

MAXLOGHISTORY Clause
仅当您使用Oracle数据库ARCHIVELOG模式时,此参数才有用。指定当前对数据库自动介质恢复所需的归档重做日志文件组的最大数量的估计。数据库使用此值来确定在控制文件中为归档重做日志文件的名称分配多少空间。

MAXDATAFILES Clause
在CREATE DATABASE或指定控制文件的数据文件部分的初始大小CREATE CONTROLFILE。尝试添加数字大于MAXDATAFILES但小于等于DB_FILES的文件会导致控制文件自动扩展,以便数据文件部分可以容纳更多的文件。
您的实例可访问的数据文件数也受到初始化参数的限制DB_FILES。

MAXINSTANCES Clause
指定可以同时使数据库装载和打开的最大实例数。该值优先于初始化参数的值INSTANCES。最小值为1.最大值和默认值取决于您的操作系统。

ARCHIVELOG | NOARCHIVELOG
指定ARCHIVELOG重新使用重做日志文件的内容进行存档。本节准备介质恢复以及实例或系统故障恢复的可能性。
如果省略了ARCHIVELOG子句和NOARCHIVELOG子句,则Oracle数据库NOARCHIVELOG默认选择模式。创建控制文件后,您可以使用语句在ARCHIVELOG模式和NOARCHIVELOG模式之间切换ALTER DATABASE。

FORCE LOGGING
FORCE LOGGING在创建控制文件后,使用此子句将数据库置于模式。当数据库处于此模式时,Oracle数据库将记录数据库中的所有更改,除了临时表空间和临时段的更改。此设置优先于并独立于为单个表空间指定的任何NOLOGGING或FORCE LOGGING设置以及NOLOGGING为单个数据库对象指定的任何设置。如果省略此子句,则在FORCE LOGGING创建控制文件后,数据库将不会处于模式。

character_set_clause
如果指定了一个字符集,那么Oracle数据库会重新构建控制文件中的字符集信息。如果随后需要数据库的介质恢复,则在数据库打开之前,此信息将可用,以便在恢复期间可以正确解释表空间名称。仅当您使用除默认值之外的字符集时,才需要此子句,这取决于您的操作系统。Oracle数据库$ORACLE_HOME/log在启动期间将当前数据库字符集打印到警报登录。

备份控制文件
使用以下语句将控制文件备份到二进制文件(先有控制文件的副本);
alter database backup controlfile to ‘/oracle/backup/control.bkp’;
生成可以用于重新创建控制文件的SQL的语句;
alter database backup controlfile to trace;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值