加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle控制文件详解

发布时间:2020-12-12 16:28:57 所属栏目:百科 来源:网络整理
导读:一、Oracle控制文件 为二进制文件,初始化大小由CREATEDATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 在参数文件中描述其位置,个数等等。通常采用分散放开,多路复用的原则。

一、Oracle控制文件

为二进制文件,初始化大小由CREATEDATABASE指定,可以使用RMAN备份

记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等

在参数文件中描述其位置,个数等等。通常采用分散放开,多路复用的原则。在mount阶段被读取,open阶段一直被使用

维护数据库一致性(数据库启动时会比较控制文件与联机日志文件中的ckpt,即起始scn号,如相等则正常启动,否则需要介质恢复)

一个控制文件只能属于一个数据库

控制文件的任意修改将写入到初始化参数中指定的所有控制文件中,读取时则仅读取第一个控制文件

控制文件只能连接一个数据库,控制文件的大小一般不要超过MB,最多为个,最少一个,互为镜像

控制文件中包含的内容

数据库的名字、ID、创建的时间戳

表空间的名字

联机日志文件、数据文件的位置、个数、名字

联机日志的Sequence号码

检查点的信息

撤销段的开始或结束

归档信息

备份信息

二、查看控制文件的相关信息

1.使用相关视图来查看

V$CONTROLFILE--列出实例中所有控制文件的名字及状态信息

V$PARAMETER--列出所有参数的位置及状态信息

V$CONTROLFILE_RECORD_SECTION--列出控制文件中记录的部分信息

SHOW PARAMETER CONTROL_FILES--列出控制文件的名字、状态、位置等

2.使用STRINGS命令来查看控制文件中的具体内容

3.备份控制文件到平面文件(然后查看控制文件中的具体内容)

SQL>alterdatabasebackupcontrolfiletotraceas'/u01/app/oracle/ctl.txt';

Databasealtered.

4.转储控制文件内容(查看控制文件中的具体内容)

altersessionsetevents'immediate trace name CONTROLF level 12';level表示级别

或--level1块头的内容--level2数据文件内容--levle 10 |12所有内容

oradebug setmypid

oradebugdumpcontrolf 12

SQL>altersystemsetevents'immediate trace name controlf level 10';

System altered.

SQL>show parameter user_dump;

NAMETYPEVALUE

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

user_dump_deststring/u01/app/oracle/admin/orcl/udu

mp

三、控制文件的管理

规划原则:多路复用,建议存放到不同的磁盘或同一磁盘不同的分区

个数与位置及状态管理:

查看控制文件的状态是否与参数定义中的相吻合,当数据库发生结构修改时,将修改内容同时写入控制文件

备份管理

恢复管理

新建控制文件语句

spfile或pfile都可以实现对控制文件的个数及位置管理

spfile步骤

修改spfile参数中的control_files-- alter system ... scope = spfile | both |memory

一致性关闭数据库

增加或减少控制文件(cpormv)

启动数据库使用spfile

验证结果

pfile步骤

修改pfile参数(vi或vim)修改*.control_files=......这一段

启动数据库使用pfile

--演示spfile修改控制文件

SQL>show parameter control_file

control_file_record_keep_timeinteger7

control_filesstring/u01/app/oracle/oradata/orcl/c

ontrol01.ctl,/u01/app/oracle/

oradata/orcl/control02.ctl,/u

01/app/oracle/oradata/orcl/con

trol03.ctl

--将控制文件减少到一个

SQL>altersystemsetcontrol_files='/u01/app/oracle/oradata/orcl/control01.ctl'scope=spfile;

SQL>shutdownimmediate;

Databaseclosed.

Databasedismounted.

ORACLE instance shut down.

SQL>startup mount

ORACLE instance started.

Total System Global Area251658240 bytes

FixedSize1218796 bytes

VariableSize88082196 bytes

DatabaseBuffers159383552 bytes

Redo Buffers2973696 bytes

Databasemounted.

--再次查看参数文件,已显示为一个

ontrol01.ctl

--增加控制文件(在nomount状态下即可修改)

SQL>altersystemsetcontrol_files='/u01/app/oracle/oradata/orcl/control01.ctl',

2'/u01/app/oracle/oradata/orcl/control02.ctl',242)"> 3'/u01/app/oracle/oradata/orcl/control03.ctl'

4scope=spfile;

--启动时可以看到在实例阶段出现了版本号不一致的问题

SQL>startup force

ORA-00214:controlfile'/u01/app/oracle/oradata/orcl/control01.ctl'version

1051 inconsistentwithfile'/u01/app/oracle/oradata/orcl/control02.ctl'

version 1049

--处理办法,用版本号高的控制文件覆盖版本号低的控制文件

SQL>host cp/u01/app/oracle/oradata/orcl/control01.ctl/u01/app/oracle/oradata/orcl/control02.ctl;

SQL>host cp/u01/app/oracle/oradata/orcl/control01.ctl/u01/app/oracle/oradata/orcl/control03.ctl;

SQL>alterdatabasemount;

SQL>alterdatabaSEOpen;

对于控制文件丢失的情况下,通过查看参数文件中设置,使用操作系统命令逐个查看这些文件是否存在

SQL>host ls/u01/app/oracle/oradata/orcl/control01.ctl

/u01/app/oracle/oradata/orcl/control01.ctl

SQL>host ls/u01/app/oracle/oradata/orcl/control02.ctl

/u01/app/oracle/oradata/orcl/control02.ctl

查看控制文件所在的目录可用空间及控制文件的大小,建议不要超过100MB

SQL>host ls/u01/app/oracle/oradata/orcl/c*.ctl-lh

-rw-r----- 1 oracle oinstall 6.8M May 23 10:55 /u01/app/oracle/oradata/orcl/control01.ctl

-rw-r----- 1 oracle oinstall 6.8M May 23 10:55 /u01/app/oracle/oradata/orcl/control02.ctl

-rw-r----- 1 oracle oinstall 6.8M May 23 10:55 /u01/app/oracle/oradata/orcl/control03.ctl

SQL>!df-h

FilesystemSizeUsed AvailUse%Mountedon

/dev/sda26.4G3.9G2.2G64%/

/dev/sdd16.8G3.7G2.8G58%/u01

/dev/sdc21.2G34M1.1G3%/home

/dev/sdc1760M17M704M3%/tmp

/dev/sda1456M18M415M5%/boot

tmpfs450M0450M0%/dev/shm

none450M104K450M1%/var/lib/xenstored

控制文件的备份

热备:

alterdatabasebackupcontrolfileto'<dir>';--热备份控制文件

alterdatabasebackupcontrolfiletotraceas'<dir>';--得到建立控制文件的脚本

RMAN:

backupcurrentcontrolfile;

backupdatabaseincludecurrentcontrolfile;

--或者设置RMAN为自动备份

RMAN>configure controlfile autobackupon;

--演示备份

--用于归档模式下的恢复,直接覆盖到控制文件

SQL>alterdatabasebackupcontrolfileto'/u01/app/oracle/control.bak';

--用于重建控制文件

SQL>alterdatabasebackupcontrolfiletotraceas'/u01/app/oracle/recreate_controlfile.txt';

--使用RMAN备份

RMAN>connect target/;

connectedtotargetdatabase:ORCL(DBID=1242732291)

RMAN>backupcurrentcontrolfile;--handle为备份文件的路径

Startingbackupat 23-MAY-10

using targetdatabasecontrolfileinsteadofrecoverycatalog

allocated channel:ORA_DISK_1

channel ORA_DISK_1:sid=148 devtype=DISK

channel ORA_DISK_1:startingfulldatafile backupset

channel ORA_DISK_1:specifying datafile(s)inbackupset

includingcurrentcontrolfileinbackupset

channel ORA_DISK_1:starting piece 1 at 23-MAY-10

channel ORA_DISK_1:finished piece 1 at 23-MAY-10

piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/

2010_05_23/o1_mf_ncnnf_TAG20100523T131841_5zkgon2l_.bkp tag=TAG20100523T131841 comment=NONE

channel ORA_DISK_1:backupsetcomplete,elapsedtime:00:00:05

Finishedbackupat 23-MAY-10

RMAN>backupdatabaseincludecurrentcontrolfile;

channel ORA_DISK_1:sid=141 devtype=DISK

input datafile fno=00001name=/u01/app/oracle/oradata/orcl/system01.dbf

input datafile fno=00003name=/u01/app/oracle/oradata/orcl/sysaux01.dbf

input datafile fno=00005name=/u01/app/oracle/oradata/orcl/example01.dbf

input datafile fno=00006name=/u01/app/oracle/oradata/orcl/tbs1_1.dbf

input datafile fno=00007name=/u01/app/oracle/oradata/orcl/tbs1_2.dbf

input datafile fno=00002name=/u01/app/oracle/oradata/orcl/undotbs01.dbf

input datafile fno=00004name=/u01/app/oracle/oradata/orcl/users01.dbf

2010_05_23/o1_mf_nnndf_TAG20100523T132647_5zkh4sk2_.bkp tag=TAG20100523T132647 comment=NONE

includingcurrentSPFILEinbackupset

2010_05_23/o1_mf_ncsnf_TAG20100523T132647_5zkhh5st_.bkp tag=TAG20100523T132647 comment=NONE

RMAN>showall;

RMAN configuration parameters are:

CONFIGURE RETENTION POLICYTOREDUNDANCY 1;#default

CONFIGUREBACKUPOPTIMIZATIONOFF;#default

CONFIGUREDEFAULTDEVICETYPETODISK;#default

CONFIGURE CONTROLFILE AUTOBACKUPOFF;#default

CONFIGURE CONTROLFILE AUTOBACKUP FORMATFORDEVICETYPEDISKTO'%F';#default

CONFIGURE DEVICETYPEDISKPARALLELISM 1BACKUPTYPETOBACKUPSET;#default

CONFIGURE DATAFILEBACKUPCOPIESFORDEVICETYPEDISKTO1;#default

CONFIGURE ARCHIVELOGBACKUPCOPIESFORDEVICETYPEDISKTO1;#default

CONFIGURE MAXSETSIZETOUNLIMITED;#default

CONFIGURE ENCRYPTIONFORDATABASEOFF;#default

CONFIGURE ENCRYPTION ALGORITHM'AES128';#default

CONFIGURE ARCHIVELOG DELETION POLICYTONONE;#default

CONFIGURE SNAPSHOT CONTROLFILENAMETO'/u01/app/oracle/10g/dbs/snapcf_orcl.f';#default

RMAN>configure controlfile autobackupon;--将控制文件自动备份功能置为on;

new RMAN configuration parameters:

CONFIGURE CONTROLFILE AUTOBACKUPON;

new RMAN configuration parameters are successfully stored

控制文件的恢复管理

控制文件版本不一致的问题

用较新版本的控制文件覆盖旧版本的控制文件

直接修改参数control_file

丢失问题

归档模式下

当归档日志全的时候,先做全备,然后使用备份的控制文件恢复即可

当归档日志不全的时候,然后建立新的控制文件即可

非归档模式下

先做全备,242)"> 数据库处于mount及open状态

执行alterdatabasebackupcontrolfiletotraceas'<dir>';得到建立语句

注意[no]archievelog [no]resetlogs两个参数的区别

版本不一致演示

SQL>startup

--控制文件部分丢失的演示,原本有两个控制文件,丢失一个

--处理办法:

1.将存在的控制文件复制到目的路径并更改控制文件名字为正确的控制文件名称

2.修改控控文件参数将丢失的控制文件去掉(一般不建议使用)

SQL>altersystemsetcontrol_files=' /u01/app/oracle/oradata/orcl/c ontrol01.ctl',242)"> 2'/u01/app/oracle/oradata/orcl/control02.ctl'scope=spfile;

VariableSize75499284 bytes

DatabaseBuffers171966464 bytes

ORA-00205:errorinidentifying controlfile,checkalertlogformore info

[oracle@robinson ~]$ tail-n 100/u01/app/oracle/admin/orcl/bdump/alert_orcl.log

..........................

Tue Jun8 19:03:42 2010

starting up 1 sharedserver(s)...

MMON startedwithpid=11,OS id=4557

CJQ0 startedwithpid=10,OS id=4555

Tue Jun8 19:03:44 2010

ALTERDATABASEMOUNT

ORA-00202:controlfile:'/u01/app/oracle/10g/dbs/ /u01/app/oracle/oradata/orcl/c ontrol01.ctl'

ORA-27037:unabletoobtainfilestatus

Linux Error:2:Nosuchfileordirectory

Additional information:3

Tue Jun8 19:03:47 2010

ORA-205 signalled during:ALTERDATABASEMOUNT...

--从警告日志中得知,文件名为c ontrol01.ctl的文件不存在,故将其改为正确的文件名

VariableSize83887892 bytes

DatabaseBuffers163577856 bytes

DatabaSEOpened.

非归档模式下,当所有的控制文件都丢失,只能重建控制文件来解决

VariableSize79693588 bytes

DatabaseBuffers167772160 bytes

[oracle@robinson ~]$tail-n 100/u01/app/oracle/admin/orcl/bdump/alert_orcl.log

Thu Jul 15 12:13:15 2010

ORA-00202:controlfile:'/u01/app/oracle/oradata/orcl/control01.ctl'

--重建控制文件主要有三个需要考虑的是

--搞清各个日志文件的大小及位置

--搞清各个数据文件的位置

--设置正确的字符集

SQL>CREATECONTROLFILE REUSEDATABASE"orcl" NOARCHIVELOG NORESTLOGS

2MAXLOGFILES 16

3MAXLOGMEMBER 3

4MAXDATAFILES 20

5MAXINSTANCES 8

6MAXLOGHISTORY 3

7LOGFILE

8GROUP1(

9'u01/app/oracle/oradata/orcl/redo1.log',242)"> 10'/u01/app/oracle/oradata/orcl/redo01.log'

11)SIZE50M,242)"> 12GROUP2(

13'/u01/app/oracle/oradata/orcl/redo2.log',242)"> 14'/u01/app/oracle/oradata/orcl/redo02.log'

15)SIZE50M,242)"> 16GROUP3(

17'/u01/app/oracle/oradata/orcl/redo3.log',242)"> 18'/u01/app/oracle/oradata/orcl/redo03.log'

19)SIZE100M

20DATAFILE

21'/u01/app/oracle/oradata/orcl/tbs1_2.dbf',242)"> 22'/u01/app/oracle/oradata/orcl/tbs1_1.dbf',242)"> 23'/u01/app/oracle/oradata/orcl/example01.dbf',242)"> 24'/u01/app/oracle/oradata/orcl/users01.dbf',242)"> 25'/u01/app/oracle/oradata/orcl/sysaux01.dbf',242)"> 26'/u01/app/oracle/oradata/orcl/system01.dbf',242)"> 27'/u01/app/oracle/oradata/orcl/undotbs01.dbf'

28CHARACTERSETWE8ISO8859P1;

CREATECONTROLFILE REUSEDATABASE"orcl" NOARCHIVELOG NORESTLOGS

*

ERROR at line 1:

ORA-01967:invalidoptionforCREATECONTROLFILE

SQL>save/u01/app/oracle/oradata/rectl.sql;

Createdfile/u01/app/oracle/oradata/rectl.sql

SQL>ho vim/u01/app/oracle/oradata/rectl.sql

SQL>@/u01/app/oracle/oradata/rectl.sql

Controlfilecreated.

--下面给出正确执行后的语句内容

SQL>host cat/u01/app/oracle/oradata/rectl.sql

CREATECONTROLFILE REUSEDATABASE"orcl" NOARCHIVELOG NORESETLOGS

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 20

MAXINSTANCES 8

MAXLOGHISTORY 3

LOGFILE

GROUP1(

'/u01/app/oracle/oradata/orcl/redo01.log'

)SIZE50M,242)"> GROUP2(

'/u01/app/oracle/oradata/orcl/redo2.log',242)"> '/u01/app/oracle/oradata/orcl/redo02.log'

GROUP3(

'/u01/app/oracle/oradata/orcl/redo3.log',242)"> '/u01/app/oracle/oradata/orcl/redo03.log'

)SIZE100M

DATAFILE

'/u01/app/oracle/oradata/orcl/tbs1_2.dbf',242)"> '/u01/app/oracle/oradata/orcl/tbs1_1.dbf',242)"> '/u01/app/oracle/oradata/orcl/example01.dbf',242)"> '/u01/app/oracle/oradata/orcl/users01.dbf',242)"> '/u01/app/oracle/oradata/orcl/sysaux01.dbf',242)"> '/u01/app/oracle/oradata/orcl/system01.dbf',242)"> '/u01/app/oracle/oradata/orcl/undotbs01.dbf'

CHARACTERSETWE8ISO8859P1

/

--将数据库切换到open状态

SQL>select*fromdual;

D

-

X

--查看已经新产生了控制文件

SQL>host ls $ORACLE_BASE/oradata/orcl/control*-l--可以看到新增了控制文件control01.ctl和control02.ctl

-rw-r----- 1 oracle oinstall 6012928 Jul 15 12:58 /u01/app/oracle/oradata/orcl/control01.ctl

-rw------- 1 oracle oinstall 7389184 Jul 15 12:04 /u01/app/oracle/oradata/orcl/control01.ctl.bak

-rw-r----- 1 oracle oinstall 6012928 Jul 15 12:58 /u01/app/oracle/oradata/orcl/control02.ctl

归档模式下控制文件全部丢失的处理

--首先将数据库切换到归档模式

SQL>startup mount;

SQL>alterdatabasearchivelog;

--查看归档的状态

SQL>archiveloglist;

DatabaselogmodeArchive Mode

Automatic archivalEnabled

Archive destinationUSE_DB_RECOVERY_FILE_DEST

Oldest onlinelogsequence1

Nextlogsequencetoarchive3

Currentlogsequence3

--备份控制文件

SQL>alterdatabasebackupcontrolfileto'/u01/app/oracle/oradata/orcl/rectl.bak';

SQL>createtabletb_temp(idint,col1 varchar2(20));

Tablecreated.

SQL>insertintotb_tempselect1,'Robinson'fromdual;

1 row created.

SQL>commit;

Commitcomplete.

SQL>altersystem switch logfile;--切换日志

SQL>archiveloglist;--日志切换后sequence由变成

Oldest onlinelogsequence2

Nextlogsequencetoarchive4

Currentlogsequence4

--模拟控制文件全部丢失

SQL>show parameter control

oradata/orcl/control02.ctl

--查看物理控制文件是否存在

SQL>ho ls/u01/app/oracle/oradata/orcl/contr*

ls:/u01/app/oracle/oradata/orcl/contr*:Nosuchfileordirectory

--建议先对数据库作备份再将备份的控制文件复制到参数文件中指定的位置

SQL>ho cp/u01/app/oracle/oradata/orcl/rectl.bak/u01/app/oracle/oradata/orcl/control01.ctl

SQL>ho cp/u01/app/oracle/oradata/orcl/rectl.bak/u01/app/oracle/oradata/orcl/control02.ctl

alterdatabaSEOpen

ORA-01589:mustuseRESETLOGSorNORESETLOGSoptionfordatabaSEOpen

ORA-01109:databasenotopen

SQL>alterdatabaSEOpenresetlogs;

SQL>select*fromtb_temp;--表成功被恢复

ID COL1

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

1 Robinson

SQL>droptabletb_temp purge;

Tabledropped.

SQL>archiveloglist;--日志的sequence号被置为

Nextlogsequencetoarchive1

Currentlogsequence1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读