控制文件是一个二进制文件,在数据库创建时自动创建,用于记录数据库名称、创建时间、表空间名、数据文件和日志文件位置等等。控制文件对于数据库非常重要,一旦受损,那么数据库将无法正常工作。
一、创建控制文件
因为某些原因可能需要重建控制文件,例如,控制文件中的参数设置不合理等等,创建控制文件的语法:
CREATE CONTROLFILE
REUSE DATABASE "database_name"
[NORESETLOGS | RESETLOGS] //不清空日志,清空日志
[NOARCHIVELOG] //非归档
MAXLOGFILES integer //最大日志文件个数
MAXLOGMEMBERS integer //日志组中最大成员人数
MAXDATAFILES integer //最大数据文件个数
MAXINSTANCES integer //最大实例个数
MAXLOGHISTORY integer //最大历史日志文件个数
LOGFILE
GROUP group_number log_file_name [SIZE size] [, GROUP group_number log_file_name [SIZE size] [,...]]
DATAFILE datafile_name [, ... ];
创建控制文件,需要事先查询数据日志文件和数据文件信息
1. 查询日志文件 V$LOGFILE, V$LOG
示例:
SQL> select group#, member from v$logfile;
GROUP# MEMBER
---------- ----------------------------------
1 D:\ORACLE\TEST\REDO01.LOG
3 D:\ORACLE\TEST\REDO03.LOG
2 D:\ORACLE\TEST\REDO02.LOG
查询日志文件大小:日志组#1, #2, #3大小为50M,组内每个日志文件大小与组大小相等。
SQL> select group#, bytes/1024/1024 from v$log;
GROUP# BYTES/1024/1024
---------- ---------------
1 50
3 50
2 50
2. 查询数据文件 V$DATAFILE
SQL> select name from v$datafile;
NAME
--------------------------------------
D:\ORACLE\TEST\SYSTEM01.DBF
D:\ORACLE\TEST\UNDOTBS01.DBF
D:\ORACLE\TEST\SYSAUX01.DBF
D:\ORACLE\TEST\USERS01.DBF
F:\UNTOTBS01.DBF
查询当前使用的控制文件,参数control_files记录当前控制文件位置(多路复用,三个文件为同一个文件,放在不同的地方)
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string D:\ORACLE\TEST\CONTROL01.CTL,
D:\ORACLE\TEST\CONTROL02.CTL,
D:\ORACLE\TEST\CONTROL03.CTL
3. 关闭数据库
4. 备份数据文件和日志文件,以免创建控制文件出错导致数据文件和日志文件受损,直接复制数据文件和日志文件到其他位置
5. 启动数据库实例 STARTUP NOMOUNT
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup nomount;
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 239078276 bytes
Database Buffers 364904448 bytes
Redo Buffers 7135232 bytes
6. 创建新的控制文件
SQL> CREATE CONTROLFILE
2 REUSE DATABASE "test"
3 NORESETLOGS
4 NOARCHIVELOG
5 MAXLOGFILES 50
6 MAXLOGMEMBERS 3
7 MAXDATAFILES 50
8 MAXINSTANCES 5
9 MAXLOGHISTORY 500
10 LOGFILE
11 GROUP 1 'D:\ORACLE\TEST\REDO01.LOG' size 50M,
12 GROUP 2 'D:\ORACLE\TEST\REDO02.LOG' size 50M,
13 GROUP 3 'D:\ORACLE\TEST\REDO03.LOG' size 50M
14 DATAFILE
15 'D:\ORACLE\TEST\SYSTEM01.DBF',
16 'D:\ORACLE\TEST\UNDOTBS01.DBF',
17 'D:\ORACLE\TEST\SYSAUX01.DBF',
18 'D:\ORACLE\TEST\USERS01.DBF',
19 'F:\UNTOTBS01.DBF'
20 ;
控制文件已创建。
查询控制文件:
SQL> select name from v$controlfile;
NAME
-----------------------------------------
D:\ORACLE\TEST\CONTROL01.CTL
D:\ORACLE\TEST\CONTROL02.CTL
D:\ORACLE\TEST\CONTROL03.CTL
这里控制文件与之前旧的控制文件位置相同,新建的控制文件覆盖了已有的控制文件。如果需要在其他地方创建新的控制文件,在这一步之前修改参数CONTROL_FILES的值,如从D盘改到E盘
SQL> alter system set control_files=
2 'E:\ORACLE\TEST\CONTROL01.CTL',
3 'E:\ORACLE\TEST\CONTROL02.CTL',
4 'E:\ORACLE\TEST\CONTROL03.CTL'
5 scope=spfile;
系统已更改。
重启数据库:shutdown immediate; startup nomount;
然后执行上述脚本,创建新的控制文件
再此查询控制文件参数,控制文件路径发生了变化,同时在新的路径下生成了3个控制文件。
SQL> select name from v$controlfile;
NAME
----------------------------------------------------
E:\ORACLE\TEST\CONTROL01.CTL
E:\ORACLE\TEST\CONTROL02.CTL
E:\ORACLE\TEST\CONTROL03.CTL
7. 打开数据库
SQL> alter database open;
数据库已更改。
如果创建控制文件使用RESETLOGS选项,则打开数据库用:alter database open resetlogs