一、基本概念
(1) 控制文件:记录数据库物理结构的二进制文件;
(2) 内容包括:
数据库名;
数据文件和重做日志文件的名称和存放位置;
创建数据库的时间戳;
当前日志的序列号;
检查点信息。
二、控制文件的文件名
(1)控制文件的文件名在初始化参数文件的control_files参数中指定,实例启动的时候,该参数列出的所有控制文件会被打开,在实例运行期间,实例会写这些控制文件,并且维护它们;
(2)在数据库创建之前,如果没有指定control_files参数:
如果没有使用oracle管理的文件,数据库会使用默认的文件名创建一个控制文件,默认的文件名由操作系统指定;
如果使用oracle管理的文件,那么由control_files参数确定文件名和存放位置。
三、多元化控制文件到不同的磁盘
(1)每个oracle数据库都应值拥有至少两个控制文件,每个存储在不同的物理磁盘;
(2)如果控制文件因为磁盘故障而损坏,相关的实例必须关闭,一旦磁盘被修复,损坏的控制文件可以使用存储在其他磁盘的控制文件副本转储,实例可以被重新启动,在这种情况下,不需要介质恢复;
(3)数据库会对control_files参数所列出来的所有文件进行写入;
(4)在数据库操作期间,数据库仅从control_files参数中读取第一个文件;
(5)在数据库运行期间,control_files参数中列出的文件中,如果任何一个不可用,实例将变成不可操作,并且将会中断。
(6)多元化控制文件的一种方法是在每一个存储重做日志组的磁盘上存储控制文件副本。
四、备份控制文件
(一) 什么时候需要备份
每次改变了数据库的物理结构,都应该进行控制文件备份,这些结构包括:
(1) 添加,删除,重命名数据文件;
(2) 添加或删除表空间,或者更改表空间的读/写状态;
(3) 添加或删除重做日志文件或文件组。
(二) 将控制文件备份为二进制文件
alter database backup controlfile to 'e:\backup\controlfile\db01\control.bkp';
(三) 创建用于重建控制文件的SQL语句脚本
alter database backup controlfile to trace;
五、恢复控制文件(使用多元化控制文件)
(一) 单个控制文件出错
1. 关闭数据库
SQL> shutdown immediate
2. 使用操作系统命令复制控制文件
SQL> host
C:\Documents and Settings\Administrator>copy E:\DB\TEST01\TEST01\CONTROL03.CTL E:\DB\TEST01\TEST01\CONTROL02.CTL
3. 打开数据库
C:\Documents and Settings\Administrator>exit
SQL> startup
(二) 物理故障
1. 关闭数据库
SQL> shutdown immediate
2. 复制控制文件(副本)到新的可访问的位置
SQL> host
Microsoft Windows [版本5.2.3790]
(C)版权所有1985-2003 Microsoft Corp.
C:\Documents and Settings\Administrator>copy E:\BACKUP\controlfile\DB01\CONTROL01.CTL E:\DB\DB01\
已复制 1个文件。
C:\Documents and Settings\Administrator>copy E:\BACKUP\controlfile\DB01\CONTROL02.CTL E:\DB\DB01\
已复制 1个文件。
C:\Documents and Settings\Administrator>copy E:\BACKUP\controlfile\DB01\CONTROL03.CTL E:\DB\DB01\
已复制 1个文件。
3. 修改control_files参数
4. 使用pfile启动数据库
C:\Documents and Settings\Administrator>exit
SQL> startup pfile='E:\DB\DB01\init20100221.ora'
5. 验证控制文件
SQL> select name from v$controlfile;
NAME
----------------------------------------------
E:\DB\DB01\CONTROL01.CTL
E:\DB\DB01\CONTROL02.CTL
E:\DB\DB01\CONTROL03.CTL
6. 创建spfile
SQL> create spfile from pfile='E:\DB\DB01\init20100221.ora';
7. 关闭数据库
SQL> shutdown immediate
8. 使用spfile启动数据库
SQL> startup
9. 验证控制文件
SQL> select name from v$controlfile;
NAME
-------------------------------------------
E:\DB\DB01\CONTROL01.CTL
E:\DB\DB01\CONTROL02.CTL
E:\DB\DB01\CONTROL03.CTL
六、创建额外的控制文件/重命名/重定位控制文件
1、确定控制文件位置
select name from v$controlfile;
2、修改初始化参数
SQL> alter system set control_files=
'E:\BACKUP\controlfile\test01\CONTROL01.CTL',
'E:\BACKUP\controlfile\test01\CONTROL02.CTL',
'E:\BACKUP\controlfile\test01\CONTROL03.CTL'
scope=spfile;
系统已更改。
3、关闭数据库
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
4、Host copy
5、启动数据库
SQL> startup
ORACLE例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 83887460 bytes
Database Buffers 79691776 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
6、验证控制文件位置
SQL> select name from v$controlfile;
NAME
----------------------------------------------
E:\BACKUP\CONTROLFILE\TEST01\CONTROL01.CTL
E:\BACKUP\CONTROLFILE\TEST01\CONTROL02.CTL
E:\BACKUP\CONTROLFILE\TEST01\CONTROL03.CTL
七、创建新的控制文件(举例:数据库改名)
(一) 什么时候需要创建新的控制文件
(1)所有的控制文件包括副本都已经损坏;
(2)想要改变使用create database命令创建数据库时指定的数据库参数,这些参数设置包括:
n 数据库名称
n MAXLOGFILES
n MAXLOGMEMBERS
n MAXLOGHISTORY
n MAXDATAFILES
n MAXINSTANCES
(二) 准备数据文件和重做日志文件清单(应该早有准备)
1、SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ---------------------------------
3 E:\DB\TEST01\TEST01\REDO03.LOG
2 E:\DB\TEST01\TEST01\REDO02.LOG
1 E:\DB\TEST01\TEST01\REDO01.LOG
2、SQL> select name,bytes/1024/1024 MB from v$datafile;
NAME MB
-------------------------------------------------- ----------
E:\DB\TEST01\TEST01\SYSTEM01.DBF 480
E:\DB\TEST01\TEST01\UNDOTBS01.DBF 25
E:\DB\TEST01\TEST01\SYSAUX01.DBF 260
E:\DB\TEST01\TEST01\USERS01.DBF 5
3、SQL> select name from v$controlfile;
NAME
------------------------------------------
E:\DB\TEST01\TEST01\CONTROL01.CTL
E:\DB\TEST01\TEST01\CONTROL02.CTL
E:\DB\TEST01\TEST01\CONTROL03.CTL
4、SQL> archive log list
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 8
当前日志序列 10
(三) 创建Pfile
Create pfile= 'e:\db\test01\init20100209.ora' from spfile;
(四) 关闭数据库
SQL> shutdown normal
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
(五) 备份所有的数据文件和重做日志文件
(六) 修改初始化参数文件
打开新建的'e:\db\test01\init20100209.ora文件,更改数据库名:TEST01——>DB01
(七) 使用Pfile启动一个新的实例到nomount状态
SQL> startup nomount pfile='e:\db\test01\init20100209.ora'
ORACLE例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 92276068 bytes
Database Buffers 71303168 bytes
Redo Buffers 2945024 bytes
(八) 创建新的控制文件
如果除了丢失了控制文件外,还丢失了重做日志组,在使用create controlfile语句创建控制文件时,需要指定resetlogs子句
SQL> create controlfile
2 set database "DB01"
3 logfile group 3 ('E:\DB\TEST01\TEST01\REDO03.LOG') size 5M,
4 group 2 ('E:\DB\TEST01\TEST01\REDO02.LOG') size 5M,
5 group 1 ('E:\DB\TEST01\TEST01\REDO01.LOG') size 5M
6 resetlogs
7 datafile 'E:\DB\TEST01\TEST01\SYSTEM01.DBF' size 480M,
8 'E:\DB\TEST01\TEST01\UNDOTBS01.DBF' size 25M,
9 'E:\DB\TEST01\TEST01\SYSAUX01.DBF' size 260M,
10 'E:\DB\TEST01\TEST01\USERS01.DBF' size 5M
11 maxlogfiles 50
12 maxlogmembers 3
13 maxloghistory 400
14 maxdatafiles 200
15 maxinstances 6
16 noarchivelog;
控制文件已创建。
(九) 打开数据库
(1) 指定RESETLOGS将重设当前LOG sequence number为1,抛弃所有日志信息。
(2) 以下条件需要使用resetlog
n 在不完全恢复(介质恢复)
n 使用备份控制文件
(3) 使用resetlogs打开数据库后无必完整地备份一次数据库。
SQL> alter database open resetlogs;
数据库已更改。
(十) 验证结果
SQL> select name from v$database;
NAME
---------
DB01
(十一) 创建spfile
SQL> create spfile from pfile= 'e:\db\test01\init20100209.ora' ;
文件已创建。
(十二) 使用spfile启动数据库
SQL> startup
ORACLE例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 92276068 bytes
Database Buffers 71303168 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
(十三) 验证结果
SQL> select name from v$database;
NAME
---------
DB01