一、什么是控制文件?
您可以创建、备份和删除控制文件。
每个Oracle数据库都有一个控制文件,它是一个小的二进制文件,记录数据库的物理结构。
控制文件内容包括:
- 数据库名称
- 相关的数据文件和重做日志文件的名称和位置
- 数据库创建的时间戳
- 当前日志序列号
- 检查点信息
每当数据库打开时,控制文件必须可用于 Oracle 数据库服务器写入。如果没有控制文件,数据库将无法挂载,恢复也很困难。
创建数据库时,会创建控制文件。默认情况下,在数据库创建过程中至少创建一个控制文件的副本。在某些操作系统上,默认是创建多个副本。在数据库创建过程中,应该创建控制文件的两个或多个副本。如果您丢失了控制文件或希望更改控制文件中的特定设置,还可以稍后创建控制文件。
二、控制文件指南
1.为控制文件提供文件名
可以使用数据库初始化参数文件中的CONTROL_FILES初始化参数指定控件文件名。实例在启动期间识别并打开所有列出的文件,在数据库操作期间写入并维护所有列出的控制文件。
如果在创建数据库之前没有为CONTROL_FILES指定文件:
- 如果不使用OMF(Oracle Managed Files),则数据库将创建一个控制文件并使用默认文件名。默认名称是特定于操作系统的。
- 如果您正在使用Oracle Managed Files,那么您为启用该特性而设置的初始化参数将决定控件文件的名称和位置。
- 如果你正在使用Oracle自动存储管理(Oracle ASM),你可以将不完整的Oracle ASM文件名放在DB_CREATE_FILE_DEST和DB_RECOVERY_FILE_DEST初始化参数中。Oracle ASM然后在适当的位置自动创建控制文件。
2.在不同的磁盘上多路复用控制文件
每个Oracle数据库应该至少有两个控制文件,每个控制文件存储在不同的物理磁盘上。
如果控制文件由于磁盘故障而损坏,则必须关闭关联的实例。磁盘驱动器修复后,可以使用来自另一个磁盘的完整控制文件副本来恢复损坏的控制文件,并且可以重新启动实例。在这种情况下,不需要介质恢复。
多路复用控制文件的行为如下:
- 数据库写入数据库初始化参数文件中为初始化参数CONTROL_FILES列出的所有文件名。
- 在数据库操作期间,数据库只读取CONTROL_FILES参数中列出的第一个文件。
- 如果在数据库操作过程中任何控制文件变得不可用,则实例将变得不可操作并应该终止。
说明:Oracle强烈建议您的数据库至少有两个控制文件,并且它们位于不同的物理磁盘上。
复用控制文件的一种方法是在每个存储重做日志组成员的磁盘驱动器上存储一个控制文件副本,如果重做日志是复用的。通过将控制文件存储在这些位置,可以将所有控制文件和重做日志的所有组在单个磁盘故障中丢失的风险降至最低。
3.备份控制文件
备份控制文件是非常重要的。最初是这样,每次更改数据库的物理结构时也是如此。
这种结构变化包括:
- 添加、删除或重命名数据文件
- 添加或删除表空间,或改变表空间的读写状态
- 添加或删除重做日志文件或组
4.管理控制文件的大小
控制文件大小的主要决定因素是创建相关数据库的CREATE DATABASE语句中MAXDATAFILES、MAXLOGFILES、MAXLOGMEMBERS、MAXLOGHISTORY和MAXINSTANCES参数设置的值。
增加这些参数的值将增加关联数据库的控制文件的大小。
三、创建控制文件
1.创建初始控制文件
Oracle数据库的初始控制文件是在发出CREATE Database语句时创建的。
控制文件的名称由数据库创建过程中使用的初始化参数文件中的CONTROL_FILES参数指定。在CONTROL_FILES中指定的文件名应该完全指定,并且是特定于操作系统的。
# 1.例如:control_files初始化参数的设置样例
CONTROL_FILES = (/u01/oracle/prod/control01.ctl,
/u02/oracle/prod/control02.ctl,
/u03/oracle/prod/control03.ctl)
如果在创建数据库时存在具有指定名称的文件,则必须在CREATE database语句中指定CONTROLFILE REUSE子句,否则将发生错误。另外,如果旧控件文件的大小与新控件文件的size参数不同,则不能使用REUSE子句。
控制文件的大小在Oracle数据库的某些版本之间发生变化,当控制文件中指定的文件数量发生变化时也会发生变化。诸如MAXLOGFILES、MAXLOGMEMBERS、MAXLOGHISTORY、MAXDATAFILES和MAXINSTANCES等配置参数会影响控制文件的大小。
随后,您可以更改CONTROL_FILES初始化参数的值,以添加更多的控件文件或更改现有控件文件的名称或位置。
2.创建额外的副本,重命名和重定位控制文件
通过将现有控件文件复制到新位置,并将文件名添加到控件文件列表中,可以创建额外的控件文件副本。
同样,通过将文件复制成新的名称或位置,并在控件文件列表中更改文件名,可以重命名现有的控件文件。在这两种情况下,为了保证控制文件在该过程中不更改,请在复制控制文件之前关闭数据库。
添加当前控制文件的多路复用副本或重命名控制文件:
# 1.关闭数据库
## 查看最开始的控制文件信息
SYS@mynewdb> select name from v$controlfile;
NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/mynewdb/control01.ctl
/u01/app/oracle/oradata/mynewdb/control02.ctl
## 关闭数据库
SYS@mynewdb> shutdown immediate;
# 2.复制已存在的控制文件到新的位置
## 下面的操作依次做了:复制已有控制文件到新的位置、更改现有控制文件的名称
[oracle@oracle4 ~]$ cd $ORACLE_BASE/oradata/mynewdb
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ cp control02.ctl ../
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ mv control01.ctl control1.ctl
# 3.更改文本初始化参数文件中的control_files参数
## 原来的配置
*.control_files='/u01/app/oracle/oradata/mynewdb/control01.ctl','/u01/app/oracle/oradata/mynewdb/control02.ctl'
## 更改后的配置
[oracle@oracle4 /u01/app/oracle/product/19.3.0.0/dbhome_1/dbs]$ vim initmynewdb.ora
*.control_files=(/u01/app/oracle/oradata/mynewdb/control1.ctl,
/u01/app/oracle/oradata/mynewdb/control02.ctl,
/u01/app/oracle/oradata/control02.ctl
)
## 生成服务器参数文件,如果你想使用文本初始化参数文件,这步可以不做,但是启动数据库时需要执行pfile子句
SYS@mynewdb> create spfile from pfile;
File created.
# 4.重新启动数据库
SYS@mynewdb> startup;
## 查看验证
SYS@mynewdb> select name from v$controlfile;
NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/mynewdb/control1.ctl
/u01/app/oracle/oradata/mynewdb/control02.ctl
/u01/app/oracle/oradata/control02.ctl
3.创建新的控制文件
如果数据库的所有控制文件都已永久损坏,且没有备份控制文件,或者希望更改数据库名称,则可以创建新的控制文件。
(1)何时创建新的控件文件
在以下情况下,有必要创建新的控制文件:
- 数据库的所有控制文件都被永久损坏,您没有一个控制文件备份。
- 您想要更改数据库名称。
例如,如果一个数据库名称与分布式环境中的另一个数据库名称冲突,则需要更改它。
说明:可以使用DBNEWID实用程序更改数据库名称和DBID(内部数据库标识符)。
(2)CREATE CONTROLFILE语句
可以使用create CONTROLFILE语句为数据库创建一个新的控制文件。
# 1.以下语句为mynew数据库创建一个新的控制文件
CREATE CONTROLFILE
SET DATABASE prod
LOGFILE GROUP 1 ('/u01/oracle/prod/redo01_01.log',
'/u01/oracle/prod/redo01_02.log'),
GROUP 2 ('/u01/oracle/prod/redo02_01.log',
'/u01/oracle/prod/redo02_02.log'),
GROUP 3 ('/u01/oracle/prod/redo03_01.log',
'/u01/oracle/prod/redo03_02.log')
RESETLOGS
DATAFILE '/u01/oracle/prod/system01.dbf' SIZE 3M,
'/u01/oracle/prod/rbs01.dbs' SIZE 5M,
'/u01/oracle/prod/users01.dbs' SIZE 5M,
'/u01/oracle/prod/temp01.dbs' SIZE 5M
MAXLOGFILES 50
MAXLOGMEMBERS 3
MAXLOGHISTORY 400
MAXDATAFILES 200
MAXINSTANCES 6
ARCHIVELOG;
说明:
CREATE CONTROLFILE语句可能会损坏指定的数据文件和重做日志文件。遗漏文件名可能导致该文件中的数据丢失,或者失去对整个数据库的访问权。
如果数据库在创建新的控制文件之前强制启用了日志记录,并且希望它继续启用,则必须在CREATE CONTROLFILE语句中指定FORCE logging子句。
(3)创建新的控制文件
本次实践会修改数据库的名称,操作如下:
# 1.列出数据库的所有数据文件和重做日志文件。
SYS@mynewdb> select member from v$logfile;
MEMBER
----------------------------------------------------------------------------------------------------
/u01/logs/my1/redo01a.log
/u01/logs/my1/redo02a.log
/u01/logs/my1/redo03a.log
SYS@mynewdb> select name from v$datafile;
NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/mynewdb/system01.dbf
/u01/app/oracle/oradata/mynewdb/sysaux01.dbf
/u01/app/oracle/oradata/mynewdb/undotbs01.dbf
/u01/app/oracle/oradata/mynewdb/users01.dbf
/u01/app/oracle/oradata/mynewdb/usertbs01.dbf
/u01/app/oracle/oradata/mynewdb/apps01.dbf
SYS@mynewdb> select value from v$parameter where name = 'control_files';
VALUE
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/mynewdb/control1.ctl, /u01/app/oracle/oradata/mynewdb/control02.ctl, /u01/ap
p/oracle/oradata/control02.ctl
## 如果你没有这样的列表,你的控制文件已经被破坏,数据库无法打开,尝试定位所有组成数据库的数据文件和重做日志文件。
## 一旦创建了新的控制文件,步骤5中没有指定的任何文件都是不可恢复的。
## 此外,如果省略了组成SYSTEM表空间的任何文件,则可能无法恢复数据库。
# 2.关闭数据库
# 如果数据库是打开的,请尽可能正常关闭数据库。仅在最后使用IMMEDIATE或ABORT子句。
SYS@mynewdb> shutdown immediate;
# 3.备份数据库的所有数据文件和redo日志文件,然后删除所有控制文件
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ mkdir /u01/back
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ cp ./* /u01/back
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ rm -f control*
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ rm ../control02.ctl
# 4.修改文本初始化参数,并生成服务器参数文件
[oracle@oracle4 ~]$ cd $ORACLE_HOME/dbs
[oracle@oracle4 /u01/app/oracle/product/19.3.0.0/dbhome_1/dbs]$ vim initmynewdb.ora
*.control_files=(/u01/app/oracle/oradata/mynewdb/control01.ctl,
/u01/app/oracle/oradata/mynewdb/control02.ctl,
)
*.db_name='MYNEWDB1'
SYS@mynewdb> create spfile from pfile;
File created.
# 5.启动实例到非挂载状态
SYS@mynewdb> startup nomount;
# 6.使用Create CONTROLFILE语句为数据库创建一个新的控制文件
## 当创建一个新的控制文件时,如果你丢失了除控制文件外的任何重做日志组,请指定RESETLOGS子句。在这种情况下,您将需要从丢失的重做日志中恢复
## 如果重命名了数据库,则必须指定RESETLOGS子句。否则,选择NORESETLOGS子句。
[oracle@oracle4 /u01/app/oracle/oradata]$ mkdir mynewdb1
[oracle@oracle4 /u01/app/oracle/oradata]$ ll -h mynewdb
total 2.8G
-rw-r----- 1 oracle oinstall 501M Dec 1 09:21 apps01.dbf
-rw-r----- 1 oracle oinstall 17M Dec 1 09:21 control02.ctl
-rw-r----- 1 oracle oinstall 17M Dec 1 09:21 control1.ctl
-rw-r----- 1 oracle oinstall 551M Dec 1 09:21 sysaux01.dbf
-rw-r----- 1 oracle oinstall 701M Dec 1 09:21 system01.dbf
-rw-r----- 1 oracle dba 21M Nov 2 22:04 temp01.dbf
-rw-r----- 1 oracle oinstall 291M Dec 1 09:21 undotbs01.dbf
-rw-r----- 1 oracle oinstall 501M Dec 1 09:21 users01.dbf
-rw-r----- 1 oracle oinstall 201M Dec 1 09:21 usertbs01.dbf
# 创建控制文件,如果使用resetlogs,redo日志文件需要加上size参数
CREATE CONTROLFILE
SET DATABASE mynewdb1
LOGFILE GROUP 1 ('/u01/logs/my1/redo01a.log') size 100M,
GROUP 2 ('/u01/logs/my1/redo02a.log') size 100M,
GROUP 3 ('/u01/logs/my1/redo03a.log') size 100M
RESETLOGS
DATAFILE '/u01/app/oracle/oradata/mynewdb/system01.dbf' size 700M,
'/u01/app/oracle/oradata/mynewdb/sysaux01.dbf' size 550M,
'/u01/app/oracle/oradata/mynewdb/undotbs01.dbf' size 290M,
'/u01/app/oracle/oradata/mynewdb/users01.dbf' size 500M,
'/u01/app/oracle/oradata/mynewdb/usertbs01.dbf' size 200M,
'/u01/app/oracle/oradata/mynewdb/apps01.dbf' size 500M
MAXLOGFILES 50
MAXLOGMEMBERS 3
MAXLOGHISTORY 400
MAXDATAFILES 200
MAXINSTANCES 6
ARCHIVELOG;
Control file created.
## 注意:相关数据文件的大小需要取整数,如果不是,看你报什么错了,例如:
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01210: data file header is media corrupt
ORA-01110: data file : '/u01/app/oracle/oradata/mynewdb/sysaux01.dbf'
ORA-01163: SIZE clause indicates 70528 (blocks), but should match header 70400
ORA-01110: data file 2: '/u01/app/oracle/oradata/mynewdb/sysaux01.dbf'
## 创建完控制文件之后,数据库会自动挂载。
# 7.操作系统级别查看验证
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ ll control0*
-rw-r----- 1 oracle dba 12206080 Dec 1 16:28 control01.ctl
-rw-r----- 1 oracle dba 12206080 Dec 1 16:28 control02.ctl
## 确实创建了控制文件,且创建的是control_files中指定的文件。
# 8.打开数据库
## 如果在创建控制文件时指定了RESETLOGS,则使用ALTER DATABASE语句,指示RESETLOGS。
SYS@mynewdb> alter database open resetlogs;
Database altered.
# 9.查看数据库相关信息
## 查看实例状态
SYS@mynewdb> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
mynewdb OPEN
## 查看数据库相关信息,可以发现数据库名变成了mynewdb1
SYS@mynewdb> select db_unique_name,log_mode from v$database;
DB_UNIQUE_NAME LOG_MODE
------------------------------ ------------
MYNEWDB1 ARCHIVELOG
## 查看日志信息
SYS@mynewdb> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 1 CURRENT
2 0 UNUSED
3 0 UNUSED
四、创建控制文件后的故障排除
在发出CREATE CONTROLFILE语句之后,您可能会遇到一些错误。在创建控制文件的过程中并不是一帆风顺的。中途会遇到不少问题。
1.检查丢失或多余的文件
在创建新的控制文件并使用它打开数据库之后,检查警报日志,以查看数据库是否检测到数据字典和控制文件之间的不一致,例如数据字典中的数据文件包含控制文件没有列出的内容。
#例如:
Dictionary check beginning
Tablespace 'TEMPTS1' #3 found in data dictionary,
but not in the controlfile. Adding to controlfile.
2022-12-01T17:11:42.485897+08:00
Dictionary check complete
如果一个文件存在于数据字典中,但新的控制文件中没有,则数据库在控制文件中以名称MISSINGnnnn创建一个占位符条目,其中nnnn是文件的十进制文件编号。MISSINGnnnn在控制文件中被标记为脱机并需要进行介质恢复。
如果与MISSINGnnnn相对应的实际数据文件是只读的或正常脱机的,那么可以通过将MISSINGnnnn重命名为实际数据文件的名称来访问数据文件。如果MISSINGnnnn对应的数据文件不是只读的或正常脱机的,那么就不能使用重命名操作使数据文件可访问,因为数据文件需要介质恢复,而RESETLOGS的结果排除了这一点。在这种情况下,必须删除包含数据文件的表空间。
相反,如果控件文件中列出的数据文件不在数据字典中,则数据库将从新控件文件中删除对它的引用。在这两种情况下,数据库都在警报日志中包含解释性消息,以便让您知道找到了什么。
# 创建控制文件的语句如下(本次没有指定apps01.dbf和usertbs01.dbf文件):
CREATE CONTROLFILE
SET DATABASE mynewdb1
LOGFILE GROUP 1 ('/u01/logs/my1/redo01a.log') size 100M,
GROUP 2 ('/u01/logs/my1/redo02a.log') size 100M,
GROUP 3 ('/u01/logs/my1/redo03a.log') size 100M
RESETLOGS
DATAFILE '/u01/app/oracle/oradata/mynewdb/system01.dbf' size 700M,
'/u01/app/oracle/oradata/mynewdb/sysaux01.dbf' size 550M,
'/u01/app/oracle/oradata/mynewdb/undotbs01.dbf' size 290M,
'/u01/app/oracle/oradata/mynewdb/users01.dbf' size 500M
MAXLOGFILES 50
MAXLOGMEMBERS 3
MAXLOGHISTORY 400
MAXDATAFILES 200
MAXINSTANCES 6
ARCHIVELOG;
## 打开数据库之后,查看警告日志
Dictionary check beginning
Tablespace 'TEMPTS1' #3 found in data dictionary,
but not in the controlfile. Adding to controlfile.
Tablespace 'USERTBS' #5 found in data dictionary,
but not in the controlfile. Adding to controlfile.
Tablespace 'APPS_TBS' #6 found in data dictionary,
but not in the controlfile. Adding to controlfile.
File #5 found in data dictionary but not in controlfile.
Creating OFFLINE file 'MISSING00005' in the controlfile.
This file can no longer be recovered so it must be dropped.
File #6 found in data dictionary but not in controlfile.
Creating OFFLINE file 'MISSING00006' in the controlfile.
This file can no longer be recovered so it must be dropped.
Dictionary check complete
## 删除数据文件对应的表空间
SYS@mynewdb> select file_name,tablespace_name from dba_data_files;
FILE_NAME
----------------------------------------------------------------------------------------------------
TABLESPACE_NAME
------------------------------
/u01/app/oracle/oradata/mynewdb/system01.dbf
SYSTEM
/u01/app/oracle/oradata/mynewdb/sysaux01.dbf
SYSAUX
/u01/app/oracle/oradata/mynewdb/undotbs01.dbf
UNDOTBS1
/u01/app/oracle/oradata/mynewdb/users01.dbf
USERS
/u01/app/oracle/product/19.3.0.0/dbhome_1/dbs/MISSING00005
USERTBS
/u01/app/oracle/product/19.3.0.0/dbhome_1/dbs/MISSING00006
APPS_TBS
SYS@mynewdb> drop tablespace usertbs;
Tablespace dropped.
SYS@mynewdb> drop tablespace apps_tbs;
Tablespace dropped.
## 查看数据库中数据文件
SYS@mynewdb> select name from v$datafile;
NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/mynewdb/system01.dbf
/u01/app/oracle/oradata/mynewdb/sysaux01.dbf
/u01/app/oracle/oradata/mynewdb/undotbs01.dbf
/u01/app/oracle/oradata/mynewdb/users01.dbf
2.处理CREATE CONTROLFILE过程中的错误
如果Oracle数据库在创建一个新的控制文件后试图挂载并打开数据库时发送一个错误,最可能的原因是您在CREATE CONTROLFILE语句中遗漏了一个文件或包含了一个不应该列出的文件。
通常错误为ORA-01173、ORA-01176、ORA-01177、ORA-01215或ORA-01216。在这种情况下,您应该恢复备份的文件,并在该任务中重复该过程,使用正确的文件名。
五、备份控制文件
使用ALTER DATABASE BACKUP CONTROLFILE语句备份控件文件。
你有两个选项:
# 1.使用以下语句将控制文件备份到一个二进制文件(现有控制文件的副本):
SYS@mynewdb> alter database backup controlfile to '/u01/back/control.bkp';
Database altered.
[oracle@oracle4 /u01/back]$ file control.bkp
control.bkp: data
# 2.生成SQL语句,稍后可用于重新创建您的控制文件:
SYS@mynewdb> alter database backup controlfile to trace;
Database altered.
## 此命令将 SQL 脚本写入跟踪文件,可在其中捕获和编辑该脚本以重新制造控制文件。
## 查看告警日志,可以发现如下条目
2022-12-01T21:57:49.550911+08:00
alter database backup controlfile to trace
2022-12-01T21:57:49.772075+08:00
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/mynewdb1/mynewdb/trace/mynewdb_ora_10420.trc
Completed: alter database backup controlfile to trace
## 根据日志提示,查看文件/u01/app/oracle/diag/rdbms/mynewdb1/mynewdb/trace/mynewdb_ora_10420.trc
## 在该文件中记录创建控制文件的sql语句,这里就不展示了。
六、使用当前副本恢复控制文件
1.使用控制文件副本恢复损坏的控制文件
如果控制文件损坏,则可以使用控制文件副本恢复它。
此方法假定在CONTROL_FILES参数中指定的一个控制文件已损坏,控制文件目录仍然可访问,并且您拥有控制文件的多路复用副本。
# 1.关闭数据库
SYS@mynewdb> shutdown immediate;
# 2.备份其中一个控制文件,并模拟损坏control_files参数指定的其中一个控制文件
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ cp control01.ctl /u01/back/control01.ctl_bak
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ dd if=/dev/zero of=control01.ctl bs=1M count=1
# 3.尝试启动数据库,报错
SYS@mynewdb> startup;
ORACLE instance started.
Total System Global Area 1073737800 bytes
Fixed Size 8904776 bytes
Variable Size 637534208 bytes
Database Buffers 419430400 bytes
Redo Buffers 7868416 bytes
ORA-00205: error in identifying control file, check alert log for more info
## 根据错误提示,我们查看告警日志,有如下记录,在挂载阶段无法打开控制文件control01.ctl(我们刚刚破环掉的)
## 文件头部信息无效
2022-12-01T22:29:05.555309+08:00
ALTER DATABASE MOUNT
2022-12-01T22:29:05.662046+08:00
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u01/app/oracle/oradata/mynewdb/control01.ctl'
ORA-27048: skgfifi: file header information is invalid
Additional information: 2
ORA-205 signalled during: ALTER DATABASE MOUNT...
2022-12-01T22:29:05.754378+08:00
Errors in file /u01/app/oracle/diag/rdbms/mynewdb1/mynewdb/trace/mynewdb_mz00_13032.trc:
# 4.使用一个操作系统命令用一个好的副本覆盖坏的控制文件:
[oracle@oracle4 /u01/app/oracle/oradata/mynewdb]$ cp /u01/back/control01.ctl_bak control01.ctl
# 5.在步骤3的基础上挂载并打开数据库
SYS@mynewdb> alter database mount;
Database altered.
SYS@mynewdb> alter database open;
Database altered.
SYS@mynewdb> select status from v$instance;
STATUS
------------
OPEN
2.从永久介质故障中使用控制文件副本进行恢复
如果出现永久性介质故障,则可以使用控制文件副本进行恢复。
此方法假定CONTROL_FILES参数中指定的一个控制文件由于永久介质故障而不可访问,并且您拥有该控制文件的多路复用副本。
# 1.在实例关闭后,使用操作系统命令将控制文件的当前副本复制到一个新的、可访问的位置:
cp /u01/oracle/prod/control01.ctl /u04/oracle/prod/control03.ctl
# 2.编辑初始化参数文件中的CONTROL_FILES参数,用新的位置替换坏的位置:
CONTROL_FILES = (/u01/oracle/prod/control01.ctl,
/u02/oracle/prod/control02.ctl,
/u04/oracle/prod/control03.ctl)
# 3.启动SQL*Plus并打开数据库
startup;
如果您有多路复用控制文件,您可以通过编辑CONTROL_FILES初始化参数来快速启动数据库。从CONTROL_FILES设置中删除错误的控制文件,您可以立即重新启动数据库。然后,您可以执行坏的控制文件的重构,并在编辑CONTROL_FILES初始化参数以包括恢复的控制文件之后,在稍后关闭并重新启动数据库。
七、删除控制文件
可以删除控制文件,但是数据库始终应该至少有两个控制文件。
例如,如果控制文件的位置不再合适,则需要从数据库中删除控制文件。
(1)关闭数据库
(2)编辑数据库初始化参数文件中的CONTROL_FILES参数,以删除旧的控件文件名。
(3)重新启动数据库
注意:该操作不会从磁盘上删除不需要的控制文件。从数据库中删除控制文件后,使用操作系统命令删除不必要的文件。
标签:文件,控制,数据库,oracle,mynewdb,Oracle,app,u01 From: https://blog.51cto.com/u_13482808/8278519