最近两天在从头看一些与DBA有关的书籍,有一章讲到了控制文件,现在整理一下有关的知识点及实际对照生产库对比的情况
-
控制文件的定义及引入的目的
Oracle数据库的控制文件是数据库中极其重要的文件,该文件是一个比较小的二进制文件,它记载了物理数据库的当前状态,每一个控制文件只属于一个数据库,但为了防止控制文件丢失,一个数据库一般有不止一个控制文件,这些控制文件中的内容完全一样,在数据库装载或打开之前,Oracle服务器不必须能够访问控制文件。当数据库在打开状态下,Oracle服务器会随时修改控制文件中的内容,任何用户,包括数据库管理员都不能修改控制文件中的数据。
如果由于某种原因Oracle服务器不能访问控制文件了,那么数据库也就无法正常工作了。如果一个数据库的所有控制文件都出了问题,那么这个数据库就需要进行恢复。因此,实际的商用数据库至少需要2个(一般为3个)控制文件,为了防止磁盘的物理故障,这些控制文件最好放在不同的物理磁盘上,而且最好放在不同的物理磁盘控制器上。
-
实际对比一个生产库来看一下
我们先执行命令:select name from v$controlfile;
输出结果:sql> select name from v$controlfile; NAME -------------------------------------------------------------------------------- /oradata/orcl/control01.ctl /oradata/orcl/control02.ctl
接下来我们登陆到服务器路径下,看一下说的是否跟书上一样。
[oracle@oradb1 orcl]$ du -ks * 9616 control01.ctl 9616 control02.ctl
这里发现,2个控制文件,大小是一样的。
之后按照书上的说法,目前看来,这2个控制文件都在一个目录下,是有安全隐患的,如果磁盘坏了的话两个控制文件都没办法访问了,那么数据库就启动不了了。(注意,这里同理,Redo文件也一样需要在不同的磁盘下)
-
接下来问题来了
我们怎么知道实际在Linux下,这些文件系统都挂载在哪些盘上了呀?好像印象中,我们都是做的Raid1或者Raid5,并且这台生产系统,还是在云上的虚拟机,貌似没办法知道哪个磁盘是给我们这台服务器用的,这样的话,这个风险岂不是很高么?
关于这里,我询问了比较懂Linux存储的同事,也上网找了一下相关资料,得到如下结论:在oracle文档上强烈建议将使用多个控制文件并放置在不同的硬盘上。这样的建议和架构对控制文件的保护上没错,但是在实际的生产系统中这样的架构似乎并不合理。加入放在两个硬盘上,那么两块硬盘中有故障的概率要比一块硬盘大。而在oracle系统中,无论哪个contorlfile失效都会导致系统宕掉。这可能到增加了系统故障的可能。所以达不到高可用的要求。而一些实际的系统架构是依赖于硬件的冗余,比如raid1或者raid5/raid6的配置来保证系统的高可用运行和controlfile在硬盘出现故障时不会丢失。
另外,对controlfile的备份也需要重视。看起来Oracle官方的推荐,跟实际生产情况还是有差异的,我们能做到的就是在备份数据库的时候,一定要注意把控制文件备份出来,这样不管通过什么方式恢复了数据库,如果磁盘有问题的话,我们可以拿备份的控制文件来用。