oracle中tfile,Oracle 控制文件(CONTROL FILE)

本文介绍Oracle数据库中控制文件的管理方法,包括控制文件的数量、位置管理、版本一致性处理、备份与恢复策略等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三、控制文件的管理

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

个数与位置及状态管理:

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

备份管理

恢复管理

新建控制文件语句

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

spfile步骤

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

一致性关闭数据库

增加或减少控制文件(cp or mv)

启动数据库使用spfile

验证结果

pfile步骤

一致性关闭数据库

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

增加或减少控制文件(cp or mv)

启动数据库使用pfile

验证结果

--演示spfile修改控制文件

SQL> show parameter control_file

NAME                                 TYPE        VALUE

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

control_file_record_keep_time        integer     7

control_files                        string      /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> alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl' scope = spfile;

System altered.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              88082196 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

Database mounted.

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

SQL> show parameter control_file

NAME                                 TYPE        VALUE

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

control_file_record_keep_time        integer     7

control_files                        string      /u01/app/oracle/oradata/orcl/c

ontrol01.ctl

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

SQL> alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl',

2  '/u01/app/oracle/oradata/orcl/control02.ctl',

3  '/u01/app/oracle/oradata/orcl/control03.ctl'

4  scope = spfile;

System altered.

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

SQL> startup force

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              88082196 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

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

1051 inconsistent with file '/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> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

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

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

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda2             6.4G  3.9G  2.2G  64% /

/dev/sdd1             6.8G  3.7G  2.8G  58% /u01

/dev/sdc2             1.2G   34M  1.1G   3% /home

/dev/sdc1             760M   17M  704M   3% /tmp

/dev/sda1             456M   18M  415M   5% /boot

tmpfs                 450M     0  450M   0% /dev/shm

none                  450M  104K  450M   1% /var/lib/xenstored

控制文件的备份

热备:

alter database backup controlfile to '

alter database backup controlfile to trace as '

RMAN:

backup current controlfile;

backup database include current controlfile;

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

RMAN > configure controlfile autobackup on;

--演示备份

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

SQL> alter database backup controlfile to '/u01/app/oracle/control.bak';

Database altered.

--用于重建控制文件

SQL> alter database backup controlfile to trace as '/u01/app/oracle/recreate_controlfile.txt';

Database altered.

--使用RMAN备份

RMAN> connect target /;

connected to target database: ORCL (DBID=1242732291)

RMAN> backup current controlfile;   --handle为备份文件的路径

Starting backup at 23-MAY-10

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=148 devtype=DISK

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

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: backup set complete, elapsed time: 00:00:05

Finished backup at 23-MAY-10

RMAN> backup database include current controlfile;

Starting backup at 23-MAY-10

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=141 devtype=DISK

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

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

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

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

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

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

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

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

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_nnndf_TAG20100523T132647_5zkh4sk2_.bkp tag=TAG20100523T132647 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:05:25

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

including current SPFILE in backupset

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_ncsnf_TAG20100523T132647_5zkhh5st_.bkp tag=TAG20100523T132647 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:14

Finished backup at 23-MAY-10

RMAN> show all;

RMAN configuration parameters are:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

CONFIGURE BACKUP OPTIMIZATION OFF; # default

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE MAXSETSIZE TO UNLIMITED; # default

CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

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

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

new RMAN configuration parameters:

CONFIGURE CONTROLFILE AUTOBACKUP ON;

new RMAN configuration parameters are successfully stored

控制文件的恢复管理

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

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

直接修改参数control_file

丢失问题

归档模式下

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

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

非归档模式下

先做全备,然后建立新的控制文件即可

新建控制文件语句

数据库处于mount及open状态

执行alter database backup controlfile to trace as '

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

版本不一致演示

SQL> startup

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              88082196 bytes

Database Buffers          159383552 bytes

Redo Buffers                2973696 bytes

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

1051 inconsistent with file '/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> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

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

--处理办法:

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

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

SQL> alter system set control_files = ' /u01/app/oracle/oradata/orcl/c ontrol01.ctl',

2  '/u01/app/oracle/oradata/orcl/control02.ctl' scope = spfile;

System altered.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              75499284 bytes

Database Buffers          171966464 bytes

Redo Buffers                2973696 bytes

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

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

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

Tue Jun  8 19:03:42 2010

starting up 1 shared server(s) ...

MMON started with pid=11, OS id=4557

CJQ0 started with pid=10, OS id=4555

Tue Jun  8 19:03:44 2010

ALTER DATABASE   MOUNT

Tue Jun  8 19:03:44 2010

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

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Tue Jun  8 19:03:47 2010

ORA-205 signalled during: ALTER DATABASE   MOUNT...

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

SQL> alter system set control_files='/u01/app/oracle/oradata/orcl/control01.ctl',

2  '/u01/app/oracle/oradata/orcl/control02.ctl' scope = spfile;

System altered.

SQL> startup force

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              83887892 bytes

Database Buffers          163577856 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

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

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              79693588 bytes

Database Buffers          167772160 bytes

Redo Buffers                2973696 bytes

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

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

ALTER DATABASE   MOUNT

Thu Jul 15 12:13:15 2010

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

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

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

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

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

--设置正确的字符集

SQL> CREATE CONTROLFILE REUSE DATABASE "orcl" NOARCHIVELOG NORESTLOGS

2  MAXLOGFILES 16

3  MAXLOGMEMBER 3

4  MAXDATAFILES 20

5  MAXINSTANCES 8

6  MAXLOGHISTORY 3

7  LOGFILE

8    GROUP 1(

9      'u01/app/oracle/oradata/orcl/redo1.log',

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

11       ) SIZE 50M,

12    GROUP 2(

13      '/u01/app/oracle/oradata/orcl/redo2.log',

14      '/u01/app/oracle/oradata/orcl/redo02.log'

15       ) SIZE 50M,

16    GROUP 3(

17      '/u01/app/oracle/oradata/orcl/redo3.log',

18      '/u01/app/oracle/oradata/orcl/redo03.log'

19       ) SIZE 100M

20  DATAFILE

21    '/u01/app/oracle/oradata/orcl/tbs1_2.dbf',

22    '/u01/app/oracle/oradata/orcl/tbs1_1.dbf',

23    '/u01/app/oracle/oradata/orcl/example01.dbf',

24    '/u01/app/oracle/oradata/orcl/users01.dbf',

25    '/u01/app/oracle/oradata/orcl/sysaux01.dbf',

26    '/u01/app/oracle/oradata/orcl/system01.dbf',

27    '/u01/app/oracle/oradata/orcl/undotbs01.dbf'

28  CHARACTER SET WE8ISO8859P1;

CREATE CONTROLFILE REUSE DATABASE "orcl" NOARCHIVELOG NORESTLOGS

*

ERROR at line 1:

ORA-01967: invalid option for CREATE CONTROLFILE

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

Created file /u01/app/oracle/oradata/rectl.sql

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

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

Control file created.

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

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

CREATE CONTROLFILE REUSE DATABASE "orcl" NOARCHIVELOG NORESETLOGS

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 20

MAXINSTANCES 8

MAXLOGHISTORY 3

LOGFILE

GROUP 1(

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

) SIZE 50M,

GROUP 2(

'/u01/app/oracle/oradata/orcl/redo2.log',

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

) SIZE 50M,

GROUP 3(

'/u01/app/oracle/oradata/orcl/redo3.log',

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

) SIZE 100M

DATAFILE

'/u01/app/oracle/oradata/orcl/tbs1_2.dbf',

'/u01/app/oracle/oradata/orcl/tbs1_1.dbf',

'/u01/app/oracle/oradata/orcl/example01.dbf',

'/u01/app/oracle/oradata/orcl/users01.dbf',

'/u01/app/oracle/oradata/orcl/sysaux01.dbf',

'/u01/app/oracle/oradata/orcl/system01.dbf',

'/u01/app/oracle/oradata/orcl/undotbs01.dbf'

CHARACTER SET WE8ISO8859P1

/

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

SQL> alter database open;

Database altered.

SQL> select * from dual;

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> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              79693588 bytes

Database Buffers          167772160 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open  ;

Database altered.

--查看归档的状态

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     1

Next log sequence to archive   3

Current log sequence           3

--备份控制文件

SQL> alter database backup controlfile to '/u01/app/oracle/oradata/orcl/rectl.bak';

Database altered.

SQL> create table tb_temp(id int,col1 varchar2(20));

Table created.

SQL> insert into tb_temp select 1,'Robinson' from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;   --切换日志

System altered.

SQL> archive log list; --日志切换后sequence由变成

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     2

Next log sequence to archive   4

Current log sequence           4

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

SQL> startup

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              79693588 bytes

Database Buffers          167772160 bytes

Redo Buffers                2973696 bytes

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

SQL> show parameter control

NAME                                 TYPE        VALUE

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

control_file_record_keep_time        integer     7

control_files                        string      /u01/app/oracle/oradata/orcl/c

ontrol01.ctl, /u01/app/oracle/

oradata/orcl/control02.ctl

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

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

ls: /u01/app/oracle/oradata/orcl/contr*: No such file or directory

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

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

SQL> alter database mount;

Database altered.

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> shutdown immediate;

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.

Total System Global Area  251658240 bytes

Fixed Size                  1218796 bytes

Variable Size              79693588 bytes

Database Buffers          167772160 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL> alter database open resetlogs;

Database altered.

SQL> select * from dual;

D

-

X

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

ID COL1

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

1 Robinson

SQL> drop table tb_temp purge;

Table dropped.

SQL> archive log list;   --日志的sequence号被置为

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     1

Next log sequence to archive   1

Current log sequence           10b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值