话说大张江有处仙乡,唤做SIT部落。仙女老爷们的日常便是把机房的各色设备连来倒去,探究万物的兼容调和之法。小仙惫懒, Oracle系列都这开头......
上回书说到江湖上的一本武林秘籍,该秘籍记录武林人士的一言一行及各大门派的武林绝学。凡能得此秘籍者,便可对各个武林中人的功夫了如指掌,据此就可轻易破解各大门派的武功。为了得到此书,一场江湖浩劫恐怕是再所难免。DBA们为了防止此书落到恐怖分子手中,把该书藏于一非常隐秘之处,同时把写有该隐秘之处地址的锦盒交于空智大师。
要想知道武林秘籍的名字,可以翻阅我们上期文章。
要想了解空智大师的秘密,请随我来。
言归正传:今儿我们来聊聊Oracle数据库的控制文件。
什么是控制文件
控制文件是一个记录当前数据库的结构信息的二进制文件,下面听小编慢慢道来。
控制文件是一个记录当前数据库的结构信息的二进制文件,控制文件主要包括的信息有:
数据库的名字,ID,创建的时间
数据文件和日志文件的名字和位置
日志文件的sequence号码
检查点的信息
归档信息
备份信息
上面的日志文件就是掀起血雨腥风的那本由空智大师保管的武林秘籍。
如何管理控制文件
小编总结下来,要想管理好控制文件,只需要记住下面七句话,保你平安无事,所向披靡,一统江湖,千秋万代。
在mount状态第一次被使用,open之后时刻在变
如果丢失,需要还原和回复
生产库推荐使用至少2个控制文件
记录数据库的物理信息,属性,行为的二进制文件
数据库正常工作至少需要一个控制文件,最多可以同时制定8个控制文件
控制文件的位置和数量由初始化参数决定 control_files
所有控制文件都是镜像关系,多路复用。
解释如下:
1. 还记得我们之前提到过的oracle数据库打开的几种状态吗?如下图:
通过上图可以看到,控制文件在oracle数据库mount的时候被打开。所以,如果需要编辑控制文件的话,就需要在shutdown or nomount状态,当然也可以在数据库mount or open状态编辑,只不过需要重启数据库才能生效。
2. 还记得我们之前讲到过的oracle数据库的文件可分为主要物理文件和非主要物理文件。多唠叨一下,主要物理文件丢失,数据库不可用;而非主要物理文件的丢失,不影响数据库的使用,只不过我们需要还原和回复非主要物理文件。控制文件就属于非主要物理文件。
3. 生产环境必须使用2个以上的控制文件,多个控制文件之间是镜像关系,也是出于冗余考虑,官方叫法控制文件的多路复用。最好,每个镜像的控制文件不要放在同一个磁盘或者目录下。
4. 创建数据库时是自动创建的控制文件。
5. 大概说下数据库的启动过程:
启动数据库 ------> 通过Oracle的SID找到正确的参数文件 ------> 通过参数文件里面的control_files这个参数去找控制文件 ------> control_files参数指定了控制文件的位置 ------> 通过控制文件再去找到联机日志和数据文件。
这就是数据库一个文件一个文件如何关联起来的。
Demo
1. 查看控制文件
也可以命令 select * from v$controlfile;
2. 查看控制文件各个记录段信息
3. 增加控制文件
如果对我们上面一统江湖的那7句话理解透彻,控制文件的增加,删除,改名,移动就so easy了。
alter system set control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/oradata/orcl/control02.ctl','/u01/app/oracle/oradata/orcl/control03.ctl' scope=spfile;
上面命令是告诉参数我增加了一个控制文件control03.ctl,scope=spfile的意思就是说我要把这个修改写到参数文件里面,但是当前不生效,需要重启数据库后才有效。
注意,坑来了。你只是告诉参数增加了控制文件,但是实际上,控制文件control03.ctl是不存在的。如果这个时候重启数据库的话,会有经典error出现。
ORA-00205: error in identifying control file, check alert log formore info
莫挠头,休哭泣,想想我们的一统江湖7句箴言(空中飘来几个字,二进制文件,镜像关系)。既然是个二进制的镜像文件,那就好搞了。
cp u01/app/oracle/oradata/orcl/control02.ctl u01/app/oracle/oradata/orcl/control03.ctl
这个时候再重启数据库,搞定收工。
4. 删除控制文件
有了上面增加控制文件的思想,删除控制文件是不是不学自通了。你已学成,可以下山了。
alter system set control_files='/u01/app/oracle/oradata/orcl/control01.ctl' scope=spfile;
删除控制文件control02.ctl和control03.ctl。重启数据库,收工又。
注意,知识点又来了。这里只是告诉参数现在的控制文件是control01.ctl,而文件control02.ctl和control03.ctl实际还没有被删除,还静悄悄的躺在那里,只是不被使用而已。所以,你需要用系统命令手动删除这2个文件。
5. 移动控制文件
飘来7句箴言,你已学成。
6. 更名控制文件
飘来7句箴言,你已出师,可以收徒。
7. 查看控制文件内容
SQL> alter database backup controlfile to trace as '/u01/app/oracle/product/12.2.0/controlfile.bkp';
cat u01/app/oracle/product/12.2.0/controlfile.bkp
贴出部分内容
-- DB_UNIQUE_NAME="orcl"
-- LOG_ARCHIVE_DEST_2='LOCATION=/u01/app/arch2'
-- LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/arch1'
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 (
'/u01/app/oracle/oradata/orcl/redo02.log',
'/u01/app/oracle/oradata/orcl/redo02a.log'
) SIZE 200M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 200M BLOCKSIZE 512,
GROUP 4 '/u01/app/oracle/oradata/orcl/redo04.log' SIZE 10M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/oradata/orcl/system01.dbf',
'/u01/app/oracle/oradata/orcl/sysaux01.dbf',
'/u01/app/oracle/oradata/orcl/undotbs01.dbf',
'/u01/app/oracle/oradata/orcl/users01.dbf'
CHARACTER SET AL32UTF8
虽然控制文件不是oracle数据库的主要物理文件,控制文件的丢失也不会导致数据的丢失。但是实际生产环境还是必须使用控制文件的多路复用,经常对控制文件做备份。毕竟,你好,我好,他也好,还原与恢复也是需要时间的。