Oracle数据库基础与应用教程
上QQ阅读APP看书,第一时间看更新

第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