14.2 控制文件管理实务与疑难解析

2008-06-01 10:40 赵振平编著 电子工业出版社
 

《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
Enter password:
Connected.

得到文件列表。

(1)得到联机日志文件的列表。

SELECT GROUP#,MEMBER
FROM V$LOGFILE
ORDER BY GROUP#;
(2)得到数据文件的列表。
SELECT FILE#,NAME 
FROM V$DATAFILE;

【注意】这里要知道数据文件的编号(ID),后续步骤出错时需要用到。

(3)得到控制文件的列表。

 SELECT VALUE 
FROM V$PARAMETER
WHERE NAME = 'control_files';
关闭数据库。
 SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.

【小贴士(Tip)】不得已的时候才使用SHUTDOWN ABORT命令关闭数据库。

备份所有的数据文件及联机日志文件。

编辑初始化参数文件PFILE(本例中是initnbo.ora)。
加入如下的内容:

*.control_files='/export/home/nbodata/nbo/control01.
ctl','/wxxrdb/control02.ctl '

这里指定控制文件的名字及其位置。使用CREATE CONTROLFILE命令创建控制文件的时候,生成的控制文件的名字及存放位置,由这里决定。

使用PFILE启动数据库到NOMOUNT状态。

 SQL>STARTUP NOMOUNT PFILE=' /oracle/app/oracle/
product/10.1.0/Db_1/dbs/ initnbo.ora'
创建控制文件。
CREATE CONTROLFILE REUSE 
SET DATABASE "NBO" RESETLOGS  NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 454
LOGFILE
GROUP 1 (
'/export/home/nbodata/nbo/redo12.log',
'/export/home/nbodata/nbo/redo11.log'
) SIZE 20M,
GROUP 2 (
'/oracle/app/oracle/oradata/nbo/redo022.log',
'/export/home/nbodata/nbo/redo21.log'
) SIZE 10M,
GROUP 3 (
'/oracle/app/oracle/oradata/nbo/redo32.log',
'/export/home/nbodata/nbo/redo31.log'
) SIZE 10M,
GROUP 4 (
'/export/home/nbodata/nbo/redo42.log',
'/export/home/nbodata/nbo/redo43.log',
'/export/home/nbodata/nbo/redo41.log'
) SIZE 4M
-- STANDBY LOGFILE
DATAFILE
'/export/home/nbodata/nbo/system01.dbf',
'/export/home/nbodata/nbo/undotbs01.dbf',
'/export/home/nbodata/nbo/sysaux01.dbf',
'/export/home/nbodata/nbo/users01.dbf'
CHARACTER SET ZHS16GBK
;

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'
TO '/export/home/nbodata/nbo/indtbs1';

这里的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
Enter password:
Connected.
得到跟踪文件的路径。
SQL> SHOW PARAMETER user_dump_dest
NAME                          TYPE       VALUE
---------------------------- ---------------------------
----------------
user_dump_dest                 string    /oracle/app/oracle/
admin/nbo/udump

跟踪文件的路径是/Oracle/app/Oracle/admin/nbo/udump。

把控制文件备份到数据库的跟踪文件中。

SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
Database altered.
查看跟踪文件,得到创建控制文件的脚本。
$cd /oracle/app/oracle/admin/nbo/udump
$more nbo_ora_1499.trc

其中,nbo_ora_1499.trc是本例中产生的跟踪文件。

【小贴士(Tip)】跟踪文件的名字是不断变化的。

实务388  如何镜像控制文件

〖环境(Environment)〗

OS:Solaris 9
DB:Oracle 10g

当前系统中只有一个控制文件(control01.ctl)。

〖方法(Action)〗

L> CONNECT sys@wm as SYSDBA
Enter password:
Connected.
关闭数据库。
SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
生成镜像文件。
 $cp /export/home/nbodata/nbo/control01.ctl /wxxrdb/control02.ctl

根据数据库中现有的控制文件control01.ctl,生成镜像文件control02.ctl。

【小贴士(Tip)】控制文件的镜像应该放在不同的物理磁盘。

修改初始化参数文件(PFILE)。

进入初始化参数文件所在的默认路径。
 

 $ cd $ORACLE_HOME/dbs
修改PFILE(本例中是initnbo.ora)。
 $vi initnbo.ora
在参数control_files的后面加上'/wxxrdb/control02.ctl ',control02.ctl是镜像文件。
即:
*.control_files='/export/home/nbodata/nbo/control01.ctl','
/wxxrdb/control02.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
-------------------------------------------------------------------------
/EXPORT/HOME/NBODATA/NBO/CONTROL01.CTL
/EXPORT/HOME/NBODATA/NBO/CONTROL02.CTL
/EXPORT/HOME/NBODATA/NBO/CONTROL03.CTL
SQL>
方法二
SQL> SHOW PARAMETER control_files
NAME                  TYPE       VALUE
------------------------------------------- ------------------------------
control_files       string    /export/home/nbodata/nbo/contr ol01.ctl,
/export/home/nbodata/nbo/control02.ctl,
/export/ho me/nbodata/nbo/control03.ctl

从上面可以看出,数据库中共有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
Enter password:
Connected.
关闭数据库。

SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
修改初始化参数文件(PFILE)。
进入初始化参数文件所在的默认路径。
$ cd $ORACLE_HOME/dbs
修改PFILE(本例中是initnbo.ora)。
 $vi initnbo.ora
将参数control_files由
*.control_files='/wxxrdb1/control01.ctl','/wxxrdb1/
control02.ctl','/wxxrdb1/control03.ctl'
改成
 *.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'
FROM PFILE='/oracle/app/oracle/product/10.1.0/Db_1/dbs/initnbo.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
Enter password:
Connected.
关闭数据库。
SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
根据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'
重新启动数据库
SQL> STARTUP

实务392  如何知道控制文件的内容

〖环境(Environment)〗

OS:Solaris 9
DB:Oracle 10g

〖方法(Action)〗

登录数据库。

 SQL> CONNECT system@wm
Enter password:
Connected.
获得dump文件的路径。
SQL〉SHOW PARAMETER user_dump_dest
NAME                  TYPE        VALUE
------------------------------------------ ------------------------------
user_dump_dest      string     /oracle/app/oracle/admin/nbo/udump

其中,dump文件的路径是/Oracle/app/Oracle/admin/nbo/udump。

DUMP出控制文件的详细信息。

SQL> ALTER SESSION SET events 'immediate trace name controlf level 10';
Session altered.

到/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.
Creating OFFLINE file 'MISSING00005' in the controlfile.

其中,'MISSING00005'就是被遗漏掉的数据文件,00005就是数据文件的编号(ID)。根据数据文件的编号(ID),可以查出实际存在的数据文件的名字。在本例中,MISSING00005实际对应的数据文件是dbscontro.dbf。

〖原因(Cause)〗

对于遗漏掉的数据文件,有的是可以恢复的,有的是永远也不能恢复的。

〖方法(Action)〗

方法一:如果数据库是以只读的,使用下面的方法。

重noresetlogs方式打开的,则采取下面的措施。

如果漏掉的数据文件是命名数据文件。

 SQL>ALTER DATABASE 
RENAME FILE '/oracle/app/oracle/product/10.1.0/Db_1/dbs/MISSING00005'
TO '/export/home/nbodata/nbo/dbscontro.dbf';

把MISSING00005命名成实际存在的数据文件dbscontro.dbf。

使数据文件dbscontro.dbf所在的表空间在线。

SQL> ALTER TABLESPACE TBS_CONTRO ONLINE;
Tablespace altered.

其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。

如果漏掉的数据文件是在线的,采取下面的措施。

重命名数据文件。

 SQL>ALTER DATABASE 
RENAME FILE '/oracle/app/oracle/product/10.1.0/Db_1/dbs/MISSING00005'
TO '/export/home/nbodata/nbo/dbscontro.dbf';
把MISSING00005命名成实际存在的数据文件dbscontro.dbf。

恢复数据文件dbscontro.dbf。
 SQL> RECOVER DATAFILE 5 ;
Media recovery complete.

其中,5是数据文件(dbscontro.dbf)的编号ID。


使数据文件dbscontro.dbf在线。

 SQL> ALTER DATABASE DATAFILE 5 ONLINE;

如果漏掉的数据文件是非正常离线的,采取下面的措施。
 

重命名数据文件。

SQL>ALTER DATABASE 
RENAME FILE '/oracle/app/oracle/product/10.1.0/Db_1/dbs/MISSING00005'
TO '/export/home/nbodata/nbo/dbscontro.dbf';

把MISSING00005命名成实际存在的数据文件dbscontro.dbf。


恢复数据文件dbscontro.dbf。

SQL> RECOVER DATAFILE 5 ;
Media recovery complete.
其中,5是数据文件(dbscontro.dbf)的编号ID。

使数据文件dbscontro.dbf所在的表空间在线。
 SQL> ALTER TABLESPACE TBS_CONTRO ONLINE;
Tablespace altered.

其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。


如果漏掉的数据文件是正常离线的,采取下面的措施:


重命名数据文件。

SQL>ALTER DATABASE 
RENAME FILE '/oracle/app/oracle/product/10.1.0/Db_1/dbs/MISSING00005'
TO '/export/home/nbodata/nbo/dbscontro.dbf';

把MISSING00005命名成实际存在的数据文件dbscontro.dbf。

使数据文件dbscontro.dbf所在的表空间在线。

SQL> ALTER TABLESPACE TBS_CONTRO ONLINE;
Tablespace altered.

其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。


方法二:如果数据库是以RESETLOGS方式打开的,则使用下面的方法。


如果漏掉的数据文件是只读的,采取下面的措施。


重命名数据文件。
 

SQL>ALTER DATABASE 
RENAME FILE '/oracle/app/oracle/product/10.1.0/Db_1/dbs/MISSING00005'
TO '/export/home/nbodata/nbo/dbscontro.dbf';

把MISSING00005命名成实际存在的数据文件dbscontro.dbf。


使数据文件dbscontro.dbf所在的表空间在线。
 

SQL> ALTER TABLESPACE TBS_CONTRO ONLINE;
Tablespace altered.

其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。


如果漏掉的数据文件是正常离线的,使用下面的方法:


重命名数据文件。
 

SQL>ALTER DATABASE 
RENAME FILE '/oracle/app/oracle/product/10.1.0/Db_1/dbs/MISSING00005'
TO '/export/home/nbodata/nbo/dbscontro.dbf';

把MISSING00005命名成实际存在的数据文件dbscontro.dbf。


使数据文件dbscontro.dbf所在的表空间在线(ONLINE)。
 

SQL> ALTER TABLESPACE TBS_CONTRO ONLINE;
Tablespace altered.

其中,TBS_CONTRO是数据文件dbscontro.dbf所在的表空间。


 如果漏掉的数据文件是其他情况。


这些情况漏掉的数据文件,将永远不能恢复,只能删除这些数据文件所在的表空间。
 


 

【责任编辑: 夏书 TEL:(010)68476606】