14.2 控制文件管理实务与疑难解析
《Oracle数据库精讲与疑难解析》第14章为大家介绍的是重中之重——控制文件的管理,本节将为大家介绍控制文件管理实务与疑难解析。
AD:
14.2 控制文件管理实务与疑难解析
实务386 如何创建控制文件
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
〖原因(Cause)〗
如果控制文件丢失或者损坏,可以利用CREATE CONTROLFILE命令重建控制文件。如果要创建控制文件,必须要有SYSDBA权限。
〖方法(Action)〗
以用户sys的身份登录数据库。
SQL> CONNECT sys@wm as SYSDBA |
得到文件列表。
(1)得到联机日志文件的列表。
SELECT GROUP#,MEMBER |
SELECT FILE#,NAME |
【注意】这里要知道数据文件的编号(ID),后续步骤出错时需要用到。
(3)得到控制文件的列表。
SELECT VALUE |
SQL> SHUTDOWN IMMEDIATE; |
【小贴士(Tip)】不得已的时候才使用SHUTDOWN ABORT命令关闭数据库。
备份所有的数据文件及联机日志文件。
编辑初始化参数文件PFILE(本例中是initnbo.ora)。
加入如下的内容:
*.control_files='/export/home/nbodata/nbo/control01. |
这里指定控制文件的名字及其位置。使用CREATE CONTROLFILE命令创建控制文件的时候,生成的控制文件的名字及存放位置,由这里决定。
使用PFILE启动数据库到NOMOUNT状态。
SQL>STARTUP NOMOUNT PFILE=' /oracle/app/oracle/ |
CREATE CONTROLFILE REUSE |
REUSE:重用已有的控制文件。
SET DATABASE:可以用于修改数据库的名字,可以指定和原来的数据库不同的名字。
RESETLOGS:重命名数据库,丢失任何的联机日志组,都需要指定RESETLOGS子句。
NORESETLOGS:对数据库执行完全恢复或者要使用当前的联机日志文件时,要指定这个参数。
NOARCHIVELOG:指定数据库运行于非归档状态。
ARCHIVELOG:指定数据库运行于归档状态。
LOGFILE:指定联机日志文件。
MAXLOGFILES:允许数据库中最大有多少组联机日志。
MAXLOGMEMBERS:每组联机日志中最多可以有多少成员(文件)。
MAXDATAFILES:数据文件的最大数量。
MAXINSTANCES:最多有多少个实例可以同时使用这个数据库。
MAXLOGHISTORY:其意义在于限制控制文件中和视图v$log_history中归档日志文件的最大数目。归档日志最多维持在MAXLOGHISTORY所设置的数目。
FORCE LOGGING:如果原来的数据库使用了FORCE LOGGING,则创建控制文件时,也要使用FORCE LOGGING子句。
DATAFILE:指定数据文件。
CHARACTER SET:指定字符集。
如果修改了数据库的名字,则要修改PFILE中的参数DB_NAME的值。
恢复数据库。
如果创建控制文件时,指定了NORESETLOGS,则可以执行完全恢复(Complete Recover)。
如果创建控制文件时,指定了RESETLOGS,则恢复时,必须带上USING BACKUP CONTROL FILE子句。
打开数据库。
如果数据库没有进行恢复,或者执行了完全恢复,则使用ALTER DATABASE OPEN命令打开数据库。
如果创建数据库时使用了RESETLOGS子句,则使用ALTER DATABASE OPEN RESETLOGS命令打开数据库。
检查警报文件。
如果在CREATE CONTROLFILE语句中漏掉了某些数据文件,则在警报文件中将会出现这样的信息:MISSINGnnnn…,其中nnnn是漏掉的数据文件的ID。如果漏掉的数据文件是只读的或者正常离线的(offline normal),这时候可以重命名MISSINGnnnn成为实际存在的数据文件,例如:
ALTER DATABASE RENAME FILE 'MISSING00006' |
这里的00006是数据文件indtbs1的编号。
使用RESETLOGS打开数据库后,如果漏掉的文件既不是只读的也不是正常离线的,则这样的数据文件将永远不可恢复,这时候只能用DROP命令把包含这个数据文件的表空间删除。
立即对数据库进行全备份。
实务387 如何得到创建控制文件的脚本
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
〖原因(Cause)〗
在Oracle中,可以把控制文件以文本的形式备份到跟踪文件中。当控制文件丢失时,可以执行创建控制文件的脚本,重新创建控制文件。使用ALTER DATABASE BACKUP CONTROLFILE TO TRACE命令把创建控制文件的脚本备份到跟踪文件中。
〖方法(Action)〗
以用户system的身份登录数据库。
SQL> CONNECT system |
SQL> SHOW PARAMETER user_dump_dest |
跟踪文件的路径是/Oracle/app/Oracle/admin/nbo/udump。
把控制文件备份到数据库的跟踪文件中。
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE; |
$cd /oracle/app/oracle/admin/nbo/udump |
其中,nbo_ora_1499.trc是本例中产生的跟踪文件。
【小贴士(Tip)】跟踪文件的名字是不断变化的。
实务388 如何镜像控制文件
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
当前系统中只有一个控制文件(control01.ctl)。
〖方法(Action)〗
L> CONNECT sys@wm as SYSDBA |
SQL> SHUTDOWN IMMEDIATE; |
$cp /export/home/nbodata/nbo/control01.ctl /wxxrdb/control02.ctl |
根据数据库中现有的控制文件control01.ctl,生成镜像文件control02.ctl。
【小贴士(Tip)】控制文件的镜像应该放在不同的物理磁盘。
修改初始化参数文件(PFILE)。
进入初始化参数文件所在的默认路径。
$ cd $ORACLE_HOME/dbs |
$vi initnbo.ora |
即:
*.control_files='/export/home/nbodata/nbo/control01.ctl',' |
为了保险起见,我们可以镜像3个甚至更多的控制文件。
根据PFILE生成SPFILE(这一步可选)。
CREATE SPFILE='/oracle/app/oracle/product/10.1.0/Db_1/dbs/SPFILEnbo.ora'
FROM PFILE='/oracle/app/oracle/product/10.1.0/Db_1/dbs/initnbo.ora'
因为修改了PFILE(initnbo.ora)中的参数,因此需要重建SPFILE(SPFILEnbo.ora)。
重新启动数据库。
SQL> STARTUP |
实务389 如何知道当前数据库中控制文件的名字及位置
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
〖原因(Cause)〗
有时候,需要查找控制文件的名字及位置。从视图V$CONTROLFILE和初始化参数CONTROL_FILES中,都可以找出控制文件的名字及位置。
〖方法(Action)〗
方法一
SQL> SELECT * FROM V$CONTROLFILE; STATUS NAME |
SQL> SHOW PARAMETER control_files |
从上面可以看出,数据库中共有3个控制文件(control01.ctl、control02.ctl、control03.ctl)。
实务390 如何删除控制文件
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
〖任务(Task)〗
数据库中共有3个控制文件(control01.ctl、control02.ctl、control03.ctl),要删除控制文件control03.ctl。
〖方法(Action)〗
以具有SYSDBA权限的用户的身份登录数据库。
SQL> CONNECT sys@wm as SYSDBA |
关闭数据库。
SQL> SHUTDOWN IMMEDIATE; |
进入初始化参数文件所在的默认路径。
$ cd $ORACLE_HOME/dbs |
$vi initnbo.ora |
*.control_files='/wxxrdb1/control01.ctl','/wxxrdb1/ |
*.control_files='/wxxrdb1/control01.ctl','/wxxrdb1/control02.ctl' |
可以看出,从参数control_files中删除了control03.ctl。
根据PFILE重新生成SPFILE(这一步可选)。
CREATE SPFILE='/oracle/app/oracle/product/10.1.0/Db_1/dbs/SPFILEnbo.ora' |
SQL> STARTUP |
使用操作系统命令彻底删除不再使用的控制文件control03.ctl。
实务391 如何移动控制文件
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
〖任务(Task)〗
把控制文件control01.ctl从当前目录/export/home/nbodata/nbo/移动到另外一个目录/wxxrdb/。
〖方法(Action)〗
以具有SYSDBA权限的用户的身份登录数据库。
SQL> CONNECT sys@wm as SYSDBA |
SQL> SHUTDOWN IMMEDIATE; |
CREATE SPFILE='/oracle/app/oracle/product/10.1.0/Db_1/dbs/SPFILEnbo.ora' |
SQL> STARTUP |
实务392 如何知道控制文件的内容
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
〖方法(Action)〗
登录数据库。
SQL> CONNECT system@wm |
SQL〉SHOW PARAMETER user_dump_dest |
其中,dump文件的路径是/Oracle/app/Oracle/admin/nbo/udump。
DUMP出控制文件的详细信息。
SQL> ALTER SESSION SET events 'immediate trace name controlf level 10'; |
到/Oracle/app/Oracle/admin/nbo/udump下进行查找,找到dump文件,就可以知道控制文件的内容。
实务393 创建控制文件时,遗漏数据文件怎么办
〖环境(Environment)〗
OS:Solaris 9
DB:Oracle 10g
〖现象(Symptom)〗
创建完控制文件,打开数据库后,检查警报文件,发现类似于下面的信息。
File #5 found in data dictionary but not in controlfile. |
其中,'MISSING00005'就是被遗漏掉的数据文件,00005就是数据文件的编号(ID)。根据数据文件的编号(ID),可以查出实际存在的数据文件的名字。在本例中,MISSING00005实际对应的数据文件是dbscontro.dbf。
〖原因(Cause)〗
对于遗漏掉的数据文件,有的是可以恢复的,有的是永远也不能恢复的。
〖方法(Action)〗
方法一:如果数据库是以只读的,使用下面的方法。
重noresetlogs方式打开的,则采取下面的措施。
如果漏掉的数据文件是命名数据文件。
SQL>ALTER DATABASE |
把MISSING00005命名成实际存在的数据文件dbscontro.dbf。
使数据文件dbscontro.dbf所在的表空间在线。
SQL> ALTER TABLESPACE TBS_CONTRO ONLINE; |
其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。
如果漏掉的数据文件是在线的,采取下面的措施。
重命名数据文件。
SQL>ALTER DATABASE |
恢复数据文件dbscontro.dbf。
SQL> RECOVER DATAFILE 5 ; |
其中,5是数据文件(dbscontro.dbf)的编号ID。
使数据文件dbscontro.dbf在线。
SQL> ALTER DATABASE DATAFILE 5 ONLINE; |
如果漏掉的数据文件是非正常离线的,采取下面的措施。
重命名数据文件。
SQL>ALTER DATABASE |
把MISSING00005命名成实际存在的数据文件dbscontro.dbf。
恢复数据文件dbscontro.dbf。
SQL> RECOVER DATAFILE 5 ; |
使数据文件dbscontro.dbf所在的表空间在线。
SQL> ALTER TABLESPACE TBS_CONTRO ONLINE; |
其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。
如果漏掉的数据文件是正常离线的,采取下面的措施:
重命名数据文件。
SQL>ALTER DATABASE |
把MISSING00005命名成实际存在的数据文件dbscontro.dbf。
使数据文件dbscontro.dbf所在的表空间在线。
SQL> ALTER TABLESPACE TBS_CONTRO ONLINE; |
其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。
方法二:如果数据库是以RESETLOGS方式打开的,则使用下面的方法。
如果漏掉的数据文件是只读的,采取下面的措施。
重命名数据文件。
SQL>ALTER DATABASE |
把MISSING00005命名成实际存在的数据文件dbscontro.dbf。
使数据文件dbscontro.dbf所在的表空间在线。
SQL> ALTER TABLESPACE TBS_CONTRO ONLINE; |
其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。
如果漏掉的数据文件是正常离线的,使用下面的方法:
重命名数据文件。
SQL>ALTER DATABASE |
把MISSING00005命名成实际存在的数据文件dbscontro.dbf。
使数据文件dbscontro.dbf所在的表空间在线(ONLINE)。
SQL> ALTER TABLESPACE TBS_CONTRO ONLINE; |
其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。
如果漏掉的数据文件是其他情况。
这些情况漏掉的数据文件,将永远不能恢复,只能删除这些数据文件所在的表空间。