控制文件 controlfile
启动数据库第二步(MOUNT状态)就要读取的文件
SQL> ho ls /u01/oracle/oradata/orcl/control0*
/u01/oracle/oradata/orcl/control01.ctl /u01/oracle/oradata/orcl/control03.ctl
/u01/oracle/oradata/orcl/control02.ctl
一个二进制文件,记录当前数据库的物理状态,维护数据库的一致性。
可以多个控制文件,最多8个,每个控制文件都是一样的。
为了防止故障,应该分散存放。
文件内的内容是不能修改的,包括数据库管理员。
初始化大小由CREATE DATABASE定义
SQL> ho strings /u01/oracle/oradata/orcl/control01.ctl
--使用strings只能看到一些基本的信息
包含的内容:
数据库的名字和标识
数据库创建的时间戳
表空间名字
数据文件和联机重做日志文件的位置和名字
当前联机重做日志文件的sequence号码
检查点信息
回滚段的开始和结束
备份信息
联机重做日志的归档信息
备份信息
SQL> show parameter control
SQL> select NAME,value from v$parameter where name like '%contr%';
SQL> select NAME,value from v$spparameter where name like '%contr%';
SQL> select NAME,value from v$system_parameter where name like '%contr%';
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/u01/oracle/oradata/orcl/control01.ctl
/u01/oracle/oradata/orcl/control02.ctl
/u01/oracle/oradata/orcl/control03.ctl
<使用SPFILE多重镜像控制文件>
修改SPFILE:
SQL> alter system set control_files=
2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL',
3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.ctl',
4 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.ctl',
5 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL04.ctl' scope=spfile;
创建另外的控制文件:
cp $HOME/ORADATA/u01/ctrl01.ctl $HOME/ORADATA/u02/ctrl04.ctl
<获得控制文件信息>
利用下列视图可以获得控制文件信息.
V$CONTROLFILE: 列出实例的所有控制文件的名字和状态
V$PARAMETER: 列出所有参数的位置和状态
V$CONTROLFILE_RECORD_SECTION: 提供控制文件的记录部分的信息
SHOW PARAMETER CONTROL_FILES: 列出控制文件的名字,状态,位置
================================================================================
小实例:
验证控制文件的版本号需要一致才能打开数据库
减少控制文件个数
SQL> alter system set control_files='/u01/oracle/oradata/orcl/control01.ctl' scope=spfile;
--因为是初始化参数,只能修改spfile,并重启让他生效
SQL> shutdown immediate
SQL> startup
增加控制文件个数
alter system set control_files ='/u01/oracle/oradata/orcl/control01.ctl','/u01/oracle/oradata/orcl/control02.ctl','/u01/oracle/oradata/orcl/control03.ctl' scope=spfile;
SQL> shutdown immediate
SQL> startup
--重启,报错说01和02的控制文件序列号不一致,启不了----因为上面关闭过一次DB
ORA-00214: control file '/u01/oracle/oradata/orcl/control01.ctl' version 772
inconsistent with file '/u01/oracle/oradata/orcl/control02.ctl' version 763
SQL> ho cp /u01/oracle/oradata/orcl/control01.ctl /u01/oracle/oradata/orcl/control02.ctl
--直接拷贝control01覆盖control02
SQL> shutdown immediate
SQL> startup
--再重启,说01和03不一致
ORA-00214: control file '/u01/oracle/oradata/orcl/control01.ctl' version 772
inconsistent with file '/u01/oracle/oradata/orcl/control03.ctl' version 763
SQL> ho cp /u01/oracle/oradata/orcl/control01.ctl /u01/oracle/oradata/orcl/control03.ctl
--直接拷贝control01覆盖control03
--再次重启就可以启起来了
SQL> select CONTROLFILE_SEQUENCE# from v$database;
CONTROLFILE_SEQUENCE#
------------------
780 --查看当前控制文件序列号
===================================================
控制文件的备份:
SQL> alter database backup controlfile to trace;
去/u01/oracle/admin/orcl/udump/目录下ll -t查找最新的trace文件
[oracle@li udump]$ cp orcl_ora_19074.trc /u01/oracle/createcontrol.sql
[oracle@li udump]$ vim /u01/oracle/createcontrol.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oracle/oradata/orcl/redo01.log' SIZE 50M,
GROUP 2 '/u01/oracle/oradata/orcl/redo02.log' SIZE 50M,
GROUP 3 '/u01/oracle/oradata/orcl/redo03.log' SIZE 50M
DATAFILE
'/u01/oracle/oradata/orcl/system01.dbf',
'/u01/oracle/oradata/orcl/undotbs01.dbf',
'/u01/oracle/oradata/orcl/sysaux01.dbf',
'/u01/oracle/oradata/orcl/users01.dbf',
'/u01/oracle/oradata/orcl/example01.dbf'
CHARACTER SET WE8ISO8859P1
;
--注意上面的脚本都最好顶格写
SQL> shutdown immediate
SQL> ho rm /u01/oracle/oradata/orcl/control0*
SQL> startup
ORA-00205: error in identifying control file, check alert log for more info
SQL> @/u01/oracle/createcontrol.sql
SQL> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED --运行完脚本后就直接到mount状态了
SQL> alter database open;
--------------------------------------------------
备份控制文件
SQL> alter database backup controlfile to '/u01/oracle/control.ctl.bak';
--使用备份控制文件覆盖control01,02,03(有几个就覆盖几个)
SQL> ho cp /u01/oracle/control.ctl.bak /u01/oracle/oradata/orcl/control01.ctl
SQL> ho cp /u01/oracle/control.ctl.bak /u01/oracle/oradata/orcl/control02.ctl
SQL> ho cp /u01/oracle/control.ctl.bak /u01/oracle/oradata/orcl/control03.ctl
SQL> startup force
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> recover database using backup controlfile;
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto --先使用auto(自动),没用
SQL> recover database using backup controlfile;
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/oracle/oradata/orcl/redo01.log --那就一个个的redo日志去试
Log applied.
Media recovery complete.
SQL> select open_mode from v$database; --就直接是mount状态了
OPEN_MODE
----------
MOUNTED
SQL> alter database open resetlogs; --使用resetlogs打开
--如果要求介质恢复(media recovery),就使用recover database去进行介质恢复;
---------------------------------------------
如果数据库正在运行,丢失了所有的控制文件
也可以使用上面的命令去备(只要不关闭数据库就可以了)因为信息跑在内存里
---------------------------------------------
从控制文件里获取信息
因为是二进制格式,不能看,用strings看的信息不完全
可以通过数据字典视图或者动态性能视图去查看相关信息
v$datafile
v$log
v$logfile
v$backup
v$archive
.........................
转储控制文件的信息
SQL> alter session set events 'immediate trace name controlf level 8';
--级别1-10,数字越高信息越详细;这里用8就好了
在udump目录里使用 ll -t查找最新的那个
***************************************************************************
DATABASE ENTRY
***************************************************************************
(size = 316, compat size = 316, section max = 1, section in-use = 1,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 1, numrecs = 1)
12/12/2010 15:52:19
DB Name "ORCL"
Database flags = 0x00400000 0x00001000
Controlfile Creation Timestamp 12/12/2010 15:52:20
Incmplt recovery scn: 0x0000.00000000
Resetlogs scn: 0x0000.000ddb61 Resetlogs Timestamp 12/12/2010 16:20:43
Prior resetlogs scn: 0x0000.0006ce7b Prior resetlogs Timestamp 11/20/2010 14:00:18
Redo Version: compatible=0xa200100
#Data files = 5, #Online files = 5
Database checkpoint: Thread=1 scn: 0x0000.000ddb62 --控制文件里记录的检查点和SCN信息