
第5章 管理Oracle存储结构
5.1 管理控制文件
5.1.1 控制文件简介
每一个Oracle数据库都至少有一个控制文件,这是一个很小的二进制文件,大小一般为几MB,它记录着数据库的物理结构。Oracle数据库实例启动时,控制文件用于标识数据库和日志文件,当进行数据库操作时控制文件必须被打开。当数据库的物理组成更改时,Oracle自动更改数据库的控制文件。数据恢复时,也要使用控制文件。如果没有控制文件,数据库不能装载和恢复。
Oracle数据库的控制文件,在数据库创建的同时一起创建。默认情况下,在数据库创建过程中至少要创建两个控制文件。如果失去了控制文件或要更改控制文件中特定的设置,也可以在以后创建控制文件。
➢ 控制文件中主要包含以下信息。
➢ 数据库名称。
➢ 相关的数据文件和重做日志文件的名称和位置。
➢ 数据库创建的时间戳。
➢ 当前日志序列号。
➢ 检查点信息。
➢ 恢复管理器(Recovery Manager,RMAN)备份信息。
在创建控制文件(使用CREATE CONTROLFILE语句)时,需要指定如表5-1所示的参数。
表5-1 控制文件参数

5.1.2 备份控制文件
为了保证数据库的安全,在数据文件或日志文件发生变化时(如在表空间中添加了新的数据文件),控制文件会自动进行更改,此时需要对控制文件进行备份。使用ALTER DATABASE BACKUP CONTROLFILE语句来备份当前控制文件。在备份控制文件时,数据库必须处于打开(OPEN)或装载(MOUNT)状态。
1. 备份控制文件为二进制文件
备份控制文件为二进制文件,也就是产生现有控制文件的副本。
语法:
ALTER DATABSE
BACKUP CONTROLFILE TO'filename' [ REUSE ];
例5-1:备份控制文件为二进制文件c:\control.bkp。
SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'c:\control.bkp'; 数据库已更改。
2. 备份控制文件为SQL语句
备份控制文件为SQL语句,Oracle数据库写入SQL语句到跟踪文件,而不是进行控制文件的物理备份。产生的SQL语句以后可以用来重新创建控制文件。如果写入SQL语句到标准跟踪文件,那么需要查看USER_DUMP_DEST初始化参数,来确定标准跟踪文件的位置(默认在C:\app\administrator\diag\rdbms\orcl\orcl\trace目录中),在该目录中找到最近修改时间的文件,打开该文件,记录下CREATE CONTROLFILE语句。
语法:
ALTER DATABASE
BACKUP CONTROLFILE TO
TRACE [ AS 'filename' [ REUSE ] ] [ RESETLOGS | NORESETLOGS ];
表5-2列出了ALTER DATABASE语句各参数的描述信息。
表5-2 LTER DATABASE语句参数

例5-2:备份控制文件为SQL语句,文件为c:\control。
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS 'c:\control'; 数据库已更改。 //在c:\control文件中直接查看CREATE CONTROLFILE语句,CREATE CONTROLFILE语句用来为Oracle数据库创建一个新的控制文件
5.1.3 创建新控制文件
在Oracle中,有以下两种方法创建控制文件。
➢ 创建数据库时会自动创建控制文件,控制文件名称是由CONTROL_FILES初始化参数指定的。
➢ 创建数据库以后创建控制文件,此时需要使用CREATE CONTROLFILE语句进行创建。
当出现以下情况时,需要创建新控制文件。
➢ 所有控制文件都不能使用,并且没有任何控制文件的备份。
➢ 需要修改数据库参数的永久设置,如MAXLOGFILES或MAXDATAFILES等。
按以下步骤在数据库中创建新控制文件。
1. 关闭数据库
使用以下命令关闭数据库。
SQL> SHUTDOWN IMMEDIATE 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
2. 启动数据库到NOMOUNT状态
使用以下命令启动数据库到NOMOUNT状态。
SQL> STARTUP NOMOUNT ORACLE 例程已经启动。 Total System Global Area 431038464 bytes Fixed Size 1375088 bytes Variable Size 327156880 bytes Database Buffers 96468992 bytes Redo Buffers 6037504 bytes
3. 创建新控制文件
CREATE CONTROLFILE语句用于为数据库创建新控制文件。在创建新控制文件时,需要指定联机重做日志文件和数据文件的信息。这些信息需要事先通过V$LOGFILE和V$DATAFILE动态性能视图查询。
使用以下命令创建新控制文件。
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOAR CHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG' SIZE 50M BLOCKSIZE 512, GROUP 2 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG' SIZE 50M BLOCKSIZE 512, GROUP 3 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG' SIZE 50M BLOCKSIZE 512 DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF', 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF', 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF', 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF', CHARACTER SET AL32UTF8; 控制文件已创建。
4. 打开数据库
使用以下命令转换数据库启动模式为OPEN,即打开数据库。
SQL> ALTER DATABASE OPEN; 数据库已更改。
注意
如果在CREATE CONTROLFILE语句中使用RESETLOGS,那么需要使用ALTER DATABASE OPEN RESETLOGS命令打开数据库。
5.1.4 删除控制文件
当某个控制文件损坏时,或者一个控制文件的位置不再合适时,可以从数据库中删除控制文件。
注意
在生产环境中,为了数据库的安全,建议数据库在任何时候都应该至少有两个控制文件。
按以下步骤在数据库中删除控制文件。
1. 查看CONTROL_FILES初始化参数
使用以下命令查看CONTROL_FILES初始化参数,显示当前Oracle数据库存在两个控制文件。
SQL> SHOW PARAMETER CONTROL_FILES NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL, C:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL
2. 修改CONTROL_FILES初始化参数
使用以下命令修改CONTROL_FILES初始化参数,只指定需要的控制文件。
SQL> ALTER SYSTEM SET CONTROL_FILES='C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL' SCOPE=SPFILE; 系统已更改。
注意
此操作不会实际从磁盘中删除不需要的控制文件。使用操作系统命令删除不必要的文件后,才最终从数据库中删除控制文件。
3. 关闭数据库
使用以下命令关闭数据库。
SQL> SHUTDOWN IMMEDIATE 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
4. 删除不需要的控制文件
使用操作系统命令del删除不需要的控制文件。
C:\>del C:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL
5. 启动数据库
使用以下命令启动数据库。
SQL> STARTUP ORACLE 例程已经启动。 Total System Global Area 431038464 bytes Fixed Size 1375088 bytes Variable Size 335545488 bytes Database Buffers 88080384 bytes Redo Buffers 6037504 bytes 数据库装载完毕。 数据库已经打开。
6. 查看CONTROL_FILES初始化参数
使用以下命令查看CONTROL_FILES初始化参数,当前只存在一个控制文件。
SQL> SHOW PARAMETER CONTROL_FILES NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL
5.1.5 添加控制文件
为了Oracle数据库的安全,允许在数据库中添加多个控制文件。
按以下步骤在数据库中添加控制文件。
1. 查看CONTROL_FILES初始化参数
使用以下命令查看CONTROL_FILES初始化参数,显示当前Oracle数据库存在一个控制文件。
SQL> SHOW PARAMETER CONTROL_FILES NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL
2. 修改CONTROL_FILES初始化参数
使用以下命令修改CONTROL_FILES初始化参数,添加需要指定的控制文件。
SQL> ALTER SYSTEM SET CONTROL_FILES='C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL','C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL02.CTL' SCOPE=SPFILE; 系统已更改。
3. 关闭数据库
使用以下命令关闭数据库。
SQL> SHUTDOWN IMMEDIATE 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
4. 复制控制文件
使用操作系统命令copy复制控制文件。
C:\>copy C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL02.CTL
已复制1个文件。
5. 启动数据库
使用以下命令启动数据库。
SQL> STARTUP ORACLE 例程已经启动。 Total System Global Area 431038464 bytes Fixed Size 1375088 bytes Variable Size 335545488 bytes Database Buffers 88080384 bytes Redo Buffers 6037504 bytes 数据库装载完毕。 数据库已经打开。
6. 查看CONTROL_FILES初始化参数
使用以下命令查看CONTROL_FILES初始化参数,当前已经存在两个控制文件。
SQL> SHOW PARAMETER CONTROL_FILES NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string C:\APP\ADMINISTRATOR\ORADATA\O RCL\CONTROL01.CTL, C:\APP\ADMI NISTRATOR\ORADATA\ORCL\CONT ROL02.CTL