ORACLE 新手学习之controlfile

  1. 云栖社区>
  2. 博客>
  3. 正文

ORACLE 新手学习之controlfile

技术小胖子 2017-11-07 19:14:00 浏览881
展开阅读全文

ORACLE 新手学习之controlfile

一:控制文件描述

控制文件是保存数据库结构信息的一个小二进制文件,它在MOUNT阶段被加载。控制文件里保存着数据库名称、检查点信息、最新的SCN、数据库SCN、控制文件SCN、最新的在线日志序列号、控制文件序列号、RMAN备份、归档日志等信息,也由此可以看出数据库控制文件的重要性,如果控制文件的丢失不会造成数据库数据的丢失,但会造成数据库无法启动

1.通过alter database 导出controlfile,对controlfile有更多的了解

先执行命令:

SQL> alter database backup controlfile to trace; 这个是跟踪控制文件

SQL> show parameter dump; ##查看trace文件的路径

user_dump_dest string /opt/oracle/diag/rdbms/orcl/orcl/trace

查看产生的trc文件 cat orcl_ora_12293.trc | more

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 '/opt/oracle/oradata/orcl/redo01.log' SIZE 10M BLOCKSIZE 512,

GROUP 2 '/opt/oracle/oradata/orcl/redo02.log' SIZE 10M BLOCKSIZE 512,

GROUP 3 '/opt/oracle/oradata/orcl/redo03.log' SIZE 10M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

'/opt/oracle/oradata/orcl/system01.dbf',

'/opt/oracle/oradata/orcl/sysaux01.dbf',

'/opt/oracle/oradata/orcl/undotbs01.dbf',

'/opt/oracle/oradata/orcl/users01.dbf',

'/opt/oracle/product/11.2.0/dbhome_1/dbs/H:appbiaooradataorcltest01.dbf'

CHARACTER SET WE8MSWIN1252

上面的这些语句其实是我们重建controlfile的命令语句

先大致解释下5MAX对象

MAXLOGFILES: 在线日志组数量的上限,也是初始化值,是能够自动增长的

MAXLOGMEMBERS: 在线日志组内成员的数量上限,也是初始化值

MAXDATAFILES 数据文件上限,也是初始化值

MAXINSTANCES同时打开数据库实例的数量,RAC环境中此值大于等于RAC节点数

MAXLOGHISTORY:最近产生的日志历史数量上限,初始值,可自动增长

关于NORESETLOGS和 RESETLOGS 简单描述下:

NORESETLOGS方式启动数据库后,所有的在线日志文件都可用,而RESETLOGS启动数据库,将会初始化在线日志文件,这意味着你会丢失所有的日志和所有的备份日志文件,因为它重置了日志的SEQUENCE

使用NORESETLOGS那务必是做完全恢复,使用RESETLOGS也可以实现完全恢复,但做不完全恢复,必须使用RESETLOGS

势必会牵扯到两个概念:完全恢复和不完全恢复

完全恢复:指介质恢复阶段(即执行recover阶段)必须应用所有应该应用的重做记录:他们包括从数据文件头中的检查点RBA所指向的重做记录开始,一直到当前的(CURRENT状态)重做日志的最新一条重做记录结束,不论该记录是在归档日志中还是在online redo log中,recover命令将尽可能的通过通道自动的捡取这些记录,若一切顺利,则最后将返回”media recovery complete“作为完全恢复结束的标志,数据库也恢复到”当前“时间点

不完全恢复:是指介质恢复阶段不需要应用所有的重做记录,而是只需一部分即可:介质恢复的起点必须是数据文件头中的检查点RBA所指向的重做记录,重点是之后的任意一条记录,这些记录可以是在归档日志中,也可以是在online redo log中,不完全恢复的结果是将数据库恢复到”过去“的一个时间点,而不像完全恢复那样将数据库恢复到”当前”时间点

2.controlfile 文件的安全性

因为控制文件的重要性前文已经描述了,保证控制文件的安全重要性也就不言而喻了,oracle建议控制文件多路径保存(一个控制文件也是可以让系统运行的)。

有人可能会说存放在做了RAID 冗余的(5或者10)上,当然,这样的做法,确实是能够防止磁盘故障导致控制文件丢失的问题,但故障未必都是磁盘故障,可能更多的因素都是因为人为错误操作导致的,比如SA不小心删除了一个控制文件,而如果控制文件时唯一的,那就会带来严重的后果,所以,控制文件已经放在跨磁盘或跨存储上,如果没有上述的条件,至少需要将控制文件放在不同的路径下面

SQL> select name,STATUS from v$controlfile;

NAME

--------------------------------------------------------------------------------

STATUS

--------------

/opt/oracle/oradata/orcl/control01.ctl

/opt/oracle/flash_recovery_area/orcl/control02.ctl

一般情况下,oracle在建库的时候会创建两个controlfile,不同路径!也可以对这个参数进行更改

alter system set control_files='FILE1','FILE2' scope=spfile;

FILE1FILE2是两个文件的完整路径,scope=spfile,重启生效

通过哪些视图可以查看到controlfile是信息:

V$controlfile : select * from v$controlfile;

能够查看到controlfile文件的名字,状态,大小等信息

spacer.gif

V$parameter 视图

SQL> select * from v$parameter where name='control_files';

能够查看到controlfile的状态和位置

SQL> select * from v$controlfile_record_section; 能够查看到关于controlfile的记录信息

SQL> show parameter control_files; 能够查看到名字、状态、位置

NAME TYPE

------------------------------------ ----------------------

VALUE

------------------------------

control_files string

/opt/oracle/oradata/orcl/contr

ol01.ctl, /opt/oracle/flash_re

covery_area/orcl/control02.ctl

3. Controlfile 的备份方式

控制文件备份的几种方法及简单说明:

1. 镜像备份:多数系统通过control_files参数(*.control_files PFILE或者SPFILE)指定多路控制文件,在某种意义上也是起到了备份的效果

2. RMAN自动备份: 可以设置configure controlfile autobackup on 来开启自动备份的功能,另外,即使不开启此功能,oracle每当备份数据文件(system表空间)的时候也会把控制文件备份(这个和备份策略有关)

3. RMAN 手动备份:可通过RMAN备份集或者镜像复制(copy)方式会controlfile进行备份

4. SQL * PLUS 手工备份,有二进制文件备份方法和脚本导出方法

5. 控制文件快照,此文件是在第一次RMAN备份控制文件时自动创建,并且以后随着控制文件备份或者CATALOG恢复目录发生同步更新

第一种备份方式不在说明了,也就是执行alter system set control_files='FILE1','FILE2' scope=spfile; 这个SQL语句,多文件控制,这个也是控制文件多元化的体现

第二种备份: RMAN 自动备份(选择这种方式较好)

[oracle@test1 ~]$ rman target /

RMAN> show controlfile autobackup;

##controlfile autobackup 默认是关闭的

using target database control file instead of recovery catalog

RMAN configuration parameters for database with db_unique_name ORCL are:

CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default

RMAN> configure controlfile autobackup on; ###开启autobackup备份

new RMAN configuration parameters:

CONFIGURE CONTROLFILE AUTOBACKUP ON;

new RMAN configuration parameters are successfully stored

开启自动备份功能后,当RMAN进行备份命令的时候,控制文件就会自动备份一个,列如:

RMAN> backup tablespace users format '/opt/oracle/rman/backup/test_%U.bak'; 表空间users

再结尾的时候会发现:Starting Control File and SPFILE Autobackup 这个就是autobackup的相关信息

Starting Control File and SPFILE Autobackup at 29-OCT-13

piece handle=/opt/oracle/flash_recovery_area/ORCL/autobackup/2013_10_29/o1_mf_s_830098881_96yqb3h2_.bkp comment=NONE

Finished Control File and SPFILE Autobackup at 29-OCT-13

自动备份是放在了:/opt/oracle/flash_recovery_area/ORCL/autobackup/2013_10_29/ 路径下

这个路径也可以通过RMAN配置来更改:

RMAN> configure controlfile autobackup format for device type disk to '/opt/oracle/rman/backup/control_%F'; 更改配置命令

new RMAN configuration parameters:

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/opt/oracle/rman/backup/control_%F';

new RMAN configuration parameters are successfully stored

重新执行上面的backup语句之后,发现autobackup 备份的路径已经变更了:

Starting Control File and SPFILE Autobackup at 29-OCT-13

piece handle=/opt/oracle/rman/backup/control_c-1357021989-20131029-01 comment=NONE

Finished Control File and SPFILE Autobackup at 29-OCT-13

需要注意的是:控制文件自动备份在数据库物理结构发生变化时也会进行,比如创建删除表空间,表空间ONLINEOFFLINE,表空间READ ONLY 或者 READ WRITE、表空间删除数据文件等

SQL> DROP TABLESPACE test INCLUDING CONTENTS AND DATAFILES;

SQL> create tablespace anenjoy datafile '/opt/oracle/oradata/orcl/anenjoy01.dbf' size 50M;

ORACLE 11G R2中,当数据库物理结构变化时,并不会立即备份控制文件,大约需要5分钟左右,才可以看到控制文件变化的信息,这个是ORACLE 11G R2的新特性:自动备份延时处理,通过MMON后台完成的,至于延长多久,是有隐含参数_controlfile_autobackup_delay来控制的,默认:300s

可以调整参数:

SQL> alter system set "_controlfile_autobackup_delay"=0;

这时,如果去更改数据的物理结构,autobackup 会立即执行,而在跟踪文件中,MM0N没有日志反应,这时因为:oracle 11G R2使用新特性之后也就不在将数据库物理结构改变记录到告警日志里面,替代MMON的是TRACE进程

[oracle@test1 trace]$ ll -lth | more

total 5.7M

-rw-r----- 1 oracle oinstall 120K Oct 29 15:23 alert_orcl.log

-rw-r----- 1 oracle oinstall 921 Oct 29 15:23 orcl_ora_15689.trc

[oracle@test1 trace]$ cat orcl_ora_15689.trc | more

Starting control autobackup

*** 2013-10-29 15:23:45.391

Control autobackup written to DISK device

这个starting autobackup的时间和通过RMAN 查看到autobackup file的时间相吻合

RMAN> connect target /;

RMAN> list backup of controlfile;

6 Full 9.36M DISK 00:00:00 29-OCT-13 

BP Key: 6 Status: AVAILABLE Compressed: NO Tag: TAG20131029T152344

Piece Name: /opt/oracle/rman/backup/control_c-1357021989-20131029-03

Control File Included: Ckp SCN: 1254967 Ckp time: 29-OCT-13

关闭controlfile autobackup 功能,通过备份system 表空间备份controlfile

RMAN> configure controlfile autobackup off;

RMAN> backup datafile 1 format '/opt/oracle/rman/sys_%U.bak';

会从备份日志中看到:

including current control file in backup set

including current SPFILE in backup set

说明是包含了控制文件和服务器参数文件SPFILE

Datafile 1 就是system 表空间的datafile FILE_ID

SQL 语句等同于: backup tablespace system format '/opt/oracle/rman/sys_%U.bak';

SQL 语句:

select a.tablespace_name,a.status,b.file_name,b.file_id from dba_tablespaces a , dba_data_files b wherea.tablespace_name=b.tablespace_name;

可以查看到表空间和FILE_NAME,FILE_ID的对应关系

第三种备份: RMAN 手动备份

备份的命令和其他备份命令很类似:

RMAN> backup current controlfile format '/opt/oracle/rman/backup/control_%U.bak';

日志中会有提示:

including current control file in backup set

查看备份:

RMAN> list backup of controlfile;

9 Full 9.33M DISK 00:00:01 29-OCT-13 

BP Key: 9 Status: AVAILABLE Compressed: NO Tag: TAG20131029T162955

Piece Name: /opt/oracle/rman/backup/control_0eonkok3_1_1.bak

Control File Included: Ckp SCN: 1257390 Ckp time: 29-OCT-13

手动备份之 镜像COPY 备份

RMAN> backup as copy current controlfile format '/opt/oracle/rman/backup/control_%U.bak';

日志中包含了:

copying current control file

查看备份(COPY) 文件:

RMAN> list copy of controlfile;

List of Control File Copies

===========================

Key S Completion Time Ckp SCN Ckp Time 

------- - --------------- ---------- ---------------

1 A 29-OCT-13 1257533 29-OCT-13 

Name: /opt/oracle/rman/backup/control_cf_D-ORCL_id-1357021989_0fonkoq4.bak

Tag: TAG20131029T163308

两种方法是类似的

第四种备份: SQL * PLUS 手工备份

SQL> alter database backup controlfile to '/home/oracle/control_bak.ctl';

因为SQL*PLUS备份也是镜像备份,所用RMAN下通过list copy 是可以查出相关的信息

RMAN> list copy of controlfile;

List of Control File Copies

===========================

Key S Completion Time Ckp SCN Ckp Time 

------- - --------------- ---------- ---------------

2 A 29-OCT-13 1257605 29-OCT-13 

Name: /home/oracle/control_bak.ctl

Tag: TAG20131029T163645

RMAN下,也可以通过脚本导出controlfile 内容

RMAN> sql ' alter database backup controlfile to trace';

这个命令和我们前文讲的是一样的,可以用来进行controlfile 重构

当然,DBA 也是可以指定文件导出的路径,后面加上一个 AS 关键字 和 路径即可

第五种:控制文件快照

控制文件快照在第一次RMAN备份控制文件(上面几种方法任意一种)时,会自动创建;

生成的路径在:/opt/oracle/product/11.2.0/dbhome_1/dbs

[oracle@test1 dbs]$ ll -lth snapcf_orcl.f

-rw-r----- 1 oracle oinstall 9.3M 10-29 16:33 snapcf_orcl.f

注意:如果当前数据库从来没有备份过时,是不会产生这个快照文件的,此文件随控制文件备份或者CATALOG恢复目录发生同步一起更新,在找不到有效备份的情况下使用此快照也可以进行控制文件的恢复

列如:

[oracle@test1 dbs]$ ll -lth snapcf_orcl.f

-rw-r----- 1 oracle oinstall 9.3M 10-29 16:33 snapcf_orcl.f 当前最后更新时间是16:33

使用rman 进行备份(上述方法中的任意一种)

RMAN> backup datafile 1 format '/opt/oracle/rman/backup/1.bak';

including current control file in backup set

including current SPFILE in backup set

[oracle@test1 dbs]$ ll -lth snapcf_orcl.f

-rw-r----- 1 oracle oinstall 9.3M 10-29 17:14 snapcf_orcl.f

再看快照文件,发现其已更新

三:控制文件恢复

前文第二步讲了许多关于控制文件的备份方法,目的只有一个,就是当数据库出现和控制文件相关故障的时候能够及时的恢复

通过上面介绍的备份方法总结出3中备份文件类型:

1.镜像备份,也就是当前数据库正在使用的控制文件,即是control_files参数指定的文件之一,这个是采用备份方式1进行备份的

2.结构备份采用非方式1进行备份的,最重要的一点是该备份里的结构信息和当前系统物理结构是一致的

3.历史备份:也是采用非方式1进行备份的,该备份里的结构信息和当前系统物理架构不保持一致

针对这三种方式讨论下恢复方法:

1.通过镜像备份恢复,往往需要做这种操作的时候是因为当前控制文件部分文件损坏,恢复也比较简单,拿正常的控制文件替换一下就可以了

2.通过结构备份恢复:这种技术较多发生在没有使用多路技术的系统上,恢复方法:从备份中还原备份文件或者通过脚本重构控制文件,然后利用归档和在线REDO 文件,NORESETLOGS或者RESETLOG打开

3.通过历史备份恢复,方法如通过结构备份恢复

通过一些示列,描述下如果遇到控制文件损坏时,应如何处理

如果是control_files 参数指定的某一个文件损坏,造成的数据库无法启动,只需要拿正常的controlfile文件去覆盖即可,操作比较简单

如果遇到以下几种情况时,我们应该怎样去思考呢:

示列一:控制文件全部损坏,如果有controlfile的备份文件(快照文件也可以)

SQL> show parameter control_files;

NAME TYPE VALUE

------------------------------------ ---------------------- ------------------------------

control_files string /opt/oracle/oradata/orcl/contr

ol01.ctl, /opt/oracle/flash_re covery_area/orcl/control02.ctl

两个controlfile路径

模拟损坏的情况:

oracle@test1 ~]$ echo "123123" > /opt/oracle/oradata/orcl/control01.ctl

[oracle@test1 ~]$ echo "123123" > /opt/oracle/flash_recovery_area/orcl/control02.ctl

此时,正常关闭数据库时,会提示error

SQL> shutdown immediate;

ORA-00227: corrupt block detected in control file: (block 1, # blocks 1)

ORA-00202: control file: '/opt/oracle/oradata/orcl/control01.ctl'

SQL> shutdown abort; ##关闭数据库

ORACLE instance shut down.

在启动数据库的时候,就会提示:

ORA-00205: error in identifying control file, check alert log for more info

如果我们有备份文件,通过RMAN进行还原

RMAN>restore controlfile from '/opt/oracle/rman/backup/control_c-1357021989-20131029-03';

output file name=/opt/oracle/oradata/orcl/control01.ctl

output file name=/opt/oracle/flash_recovery_area/orcl/control02.ctl

Finished restore at 29-OCT-13

RMAN> recover database;

SQL> alter database open resetlogs;

Database altered.

这样,数据库就可以正常访问了,resetlogs之后的数据库,建议做一个完整备份

示列二:如果controlfile 都损坏,且没有controlfile 备份文件时

解决这个问题的办法就是:重构控制文件 就需要前文的命令:

alter database backup controlfile to trace;

先备份下当前的控制文件:

RMAN> backup current controlfile format '/opt/oracle/rman/backup/control.bak';

损坏控制文件:

[oracle@test1 orcl]$ rm /opt/oracle/oradata/orcl/control01.ctl

[oracle@test1 orcl]$ rm /opt/oracle/flash_recovery_area/orcl/control02.ctl

当进行checkpoint或者switch logfile时,因为丢失控制文件,数据库实例就会停止

SQL> shutdown abort; 不正常关闭

当我们启动数据库时,就会有error message

ORA-00205: error in identifying control file, check alert log for more info

此时,没有备份文件,只能通过对oracle告警文件的追踪,重建控制文件

/opt/oracle/diag/rdbms/orcl/orcl/tracealert_orcl.log 所有的对数据库的操作都会被记录

因为控制文件的损坏,并不会造成数据丢失

找到我们之前导出来的控制文件

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 '/opt/oracle/oradata/orcl/redo01.log' SIZE 10M BLOCKSIZE 512,

GROUP 2 '/opt/oracle/oradata/orcl/redo02.log' SIZE 10M BLOCKSIZE 512,

GROUP 3 '/opt/oracle/oradata/orcl/redo03.log' SIZE 10M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

'/opt/oracle/oradata/orcl/system01.dbf',

'/opt/oracle/oradata/orcl/sysaux01.dbf',

'/opt/oracle/oradata/orcl/undotbs01.dbf',

'/opt/oracle/oradata/orcl/users01.dbf',

'/opt/oracle/product/11.2.0/dbhome_1/dbs/H:appbiaooradataorcltest01.dbf'

CHARACTER SET WE8MSWIN1252

;再结合目前/opt/oracle/oradata/orcl 下的文件进行对比,调整为:

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 '/opt/oracle/oradata/orcl/redo01.log' SIZE 10M BLOCKSIZE 512,

GROUP 2 '/opt/oracle/oradata/orcl/redo02.log' SIZE 10M BLOCKSIZE 512,

GROUP 3 '/opt/oracle/oradata/orcl/redo03.log' SIZE 10M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

'/opt/oracle/oradata/orcl/system01.dbf',

'/opt/oracle/oradata/orcl/sysaux01.dbf',

'/opt/oracle/oradata/orcl/undotbs01.dbf',

'/opt/oracle/oradata/orcl/users01.dbf',

'/opt/oracle/oradata/orcl/anenjoy01.dbf',

'/opt/oracle/oradata/orcl/anenjoy02.dbf'

CHARACTER SET WE8MSWIN1252

这个修改要结合oracle的告警日志和/OPT/ORACLE/ORADATA/DB_NAME/下的数据文件结合

;SQL> startup nomount;

SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG

2 MAXLOGFILES 16

3 MAXLOGMEMBERS 3

4 MAXDATAFILES 100

5 MAXINSTANCES 8

6 MAXLOGHISTORY 292

7 LOGFILE

8 GROUP 1 '/opt/oracle/oradata/orcl/redo01.log' SIZE 10M BLOCKSIZE 512,

9 GROUP 2 '/opt/oracle/oradata/orcl/redo02.log' SIZE 10M BLOCKSIZE 512,

10 GROUP 3 '/opt/oracle/oradata/orcl/redo03.log' SIZE 10M BLOCKSIZE 512

11 -- STANDBY LOGFILE

12 DATAFILE

13 '/opt/oracle/oradata/orcl/system01.dbf',

14 '/opt/oracle/oradata/orcl/sysaux01.dbf',

15 '/opt/oracle/oradata/orcl/undotbs01.dbf',

16 '/opt/oracle/oradata/orcl/users01.dbf',

17 '/opt/oracle/oradata/orcl/anenjoy01.dbf',

18 '/opt/oracle/oradata/orcl/anenjoy02.dbf'

19 CHARACTER SET WE8MSWIN1252

20 ;

Control file created

之后关闭数据库:

SQL> shutdown immediate;

将数据库启动到mount状态

SQL> startup mount;

进行数据库恢复

SQL> recover database;

Media recovery complete.

Media Recovery Start

Serial Media Recovery started

Recovery of Online Redo Log: Thread 1 Group 1 Seq 1 Reading mem 0

Mem# 0: /opt/oracle/oradata/orcl/redo01.log

Media Recovery Complete (orcl)

Completed: ALTER DATABASE RECOVER database

恢复完成后,再将数据库打开

SQL> alter database open ;

Database altered.

之后要多数据库进行完全备份


ERROR 一:

ORA-27040: file create error, unable to create file

问题产生的原因:可能是使用root用户进行了某些配置,导致oracle用户无法对目录进行操作,切换到root用户下,执行:chown -R oracle:oinstall /opt/oracle/ 就可以解决

以上是对oracle 控制文件学习的简单整理,如有不足之处,请指出,共同学习 ORACLE 新手交流群:329638713




      本文转自天真花语  51CTO博客,原文链接:http://blog.51cto.com/caibird/1316907,如需转载请自行联系原作者





网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注