Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313559
  • 博文数量: 84
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 16:46
文章分类

全部博文(84)

文章存档

2017年(2)

2016年(4)

2015年(78)

我的朋友

分类: Oracle

2015-10-21 20:39:29

    控制文件和日志文件时数据库中两个主要的文件,没有控制文件数据库就无法启动,没有日志文件数据库的信息就无法完全恢复。
控制文件

    控制文件时数据库中的一个二进制文件,它主要用来记录数据库的名字、数据库的数据文件存放位置信息。因此,有人也把控制文件必做数据库的心脏,那么心脏如果丢失或者损坏了,数据库就将不复存在。对于控制文件来说,保护是至关重要的。
    每个数据库都存在控制文件,但是一个控制文件只属于一个数据库。就像每个人都有身份证,但是一个身份证只属于一个人。控制文件在创建数据库时自动创建,当 数据库的信息发生改变时,控制文件也随之被改变;控制文件不能手动修改,只能有Oracle数据库本身自己来修改。控制文件在数据库启动和关闭时都要使 用,如果没有控制文件,数据库将无法工作。
     使用下面的语句就可在数据字典中查看控制文件的信息:

  1. SQL> desc v$controlfile
  2.  Name      Null?             Type
  3.  ----------------------------------------- -------- ----------------------------
  4.  STATUS                      VARCHAR2(7)
  5.  NAME                        VARCHAR2(513)
  6.  IS_RECOVERY_DEST_FILE       VARCHAR2(3)
  7.  BLOCK_SIZE                  NUMBER
  8.  FILE_SIZE_BLKS              NUMBER

  9. SQL>
控制文件的内容
     控制文件的存放位置和状态可以从数据字典v$controlfile中查询,查询方法有两种,一种是SQL*Plus下查询,另一种是在企业管理器中查询。
在SQL*Plus中
SQL> select name,status from v$controlfile;

NAME                                                            STATUS
------------------------------------------------                -----
/u01/app/oracle/oradata/orcl/control01.ctl                  #控制文件位置信息及文件名
/u01/app/oracle/fast_recovery_area/orcl/control02.ctl       #控制文件位置信息及文件名
SQL>
在OEM中
选择【服务器】---【控制文件】,另外点击【高级】选项,则显示控制文件的信息。

    从上面的查询结果中可以看出数据库的控制文件的扩展名是.ctl。每一个控制文件中都记录数据库的名称、创建数据库的时间、数据文件的名字及数据库存储位置、当前的日志序列号、最近检查点的信息等数据库使用信息。这些信息都是在操作数据库时自动写入到控制文件中的,而不是手动写入。例如,在创建数据库时,控制文件中就会自动写入数据库的名称、数据库的创建时间等信息;在增加或者删除表空间时,表空间的信息也会自动写入控制文件中。控制文件的大小取决于创建数据库时所提供的参数信息,因此当添加数据库的文件时,控制文件的大小保持不变。
    当增加、重命名、删除一个数据文件时,Oracle服务器进程会立即更新空置文件以反映数据库结构的这种变化。每次在数据库的结构发生变化后,为了防止数据丢失都要备份控制文件。
    通常情况下,数据库管理员会使用镜像来管理控制文件,把每个控制文件分布到不同的物理磁盘,发生灾难时,即使其中一个控制文件损坏,数据也不会丢失,也不会使整个数据库陷于瘫痪。

控制文件的多路复用
    控制文件在数据库中的作用是不可比拟的,保护控制文件实际就是在保护数据库。Oracle的多路复用的特性就可以帮助数据库管理员保护好控制文件。多路复用特性可以把控制文件的副本创建到不同的磁盘上,这样即使一个磁盘发生故障,Oracle仍然可以从其他磁盘上恢复,从而达到保护数据库的作用。

在oracle中有两种方法创建多路复用控制文件:

1. 修改系统会话

首先通过查询了解当前系统控制文件:
select * from v$controlfile;
其次,修改系统会话参数值,添加新的控制文件CONTROL04.CTL:
alter system set control_files=
'/u01/app/oracle/oradata/orcl/control01.ctl',
'/u01/app/oracle/fast_recovery_area/orcl/control02.ctl',
'/home/oracle/control03.ctl',
'/home/oracle/control04.ctl'
scope=spfile

第三,关闭数据库
shutdown immediate;

第四,复制CONTROL01.CTL,并将文件名改为CONTROL03.CTL.
复制control02.ctl文件,把字名改为CONTROL04.CTL

最后,重新打开数据库,查询查看控制文件就可以.
Startup

2. 使用init.ora参数文件

首先, shutdown immediate 数据库,

其次,复制一个新日志文件,如复制CONTROL04.CTL ,并把名字改为 CONTROL05.CTL.

第三,:找到init.ora文件,文件在/u01/app/oracle/admin/orcl/pfile目录下,使用文本工具打个文件,修改参数值:
control_files=("/home/oracle/control05.ctl","/u01/app/oracle/oradata/orcl/control01.ctl", "/u01/app/oracle/fast_recovery_area/orcl/control02.ctl", /home/oracle/control03.ctl","/home/oracle/control04.ctl")
注意,原来没有control05.ctl,只能四个,修改后应该有五个.

第四,重启数据库,由于oracle中系统参数优先级高于初始化文件,所以在启动时指明使用初始化参数.
startup pfile=/u01/app/oracle/admin/orcl/pfile/init.ora.99201523278

最后,查询 select * from v$controlfile;


日志文件

    日志文件在Oracle数据库中分为重做日志文件和归档日志文件两种。其中,重做日志文件时Oracle数据库正常运行不可缺少的文件。重做日志文件Redo Log File主要记录数据库操作的过程。在需要回复数据时,重做日志文件可以将日志从备份还原的数据库上再执行一遍,已达到数据的最新状态。
    Oracle系统运行时有归档模式和非归档模式。在非归档模式下,所有的日志文件都写在重做日志文件中,如果重做日志文件写满了(多大是写满?),那么就把前面的日志文件覆盖了。例如,一共有a、b、c三个日志文件,在非归档模式下,如果a文件写满了,就开始写b文件,如果b文件写满了,就开始写c文件,如果三个文件都写满了,就把a文件中的内容覆盖掉重新写入。在归档模式下,如果重做日志文件全部写满后,就把第一个重做日志文件写入归档日志文件中,再把日志写到一个重做日之文件中,使用归档日志的方式就可以方便以后做恢复操作。
    使用下面的语句就可在数据字典中查看日志文件的信息:
  1. SQL> desc v$logfile
  2.  Name                  Null?      Type
  3.  ----------------------------------------- -------- ----------------------------
  4.  GROUP#                             NUMBER
  5.  STATUS                             VARCHAR2(7)
  6.  TYPE                               VARCHAR2(7)
  7.  MEMBER                             VARCHAR2(513)
  8.  IS_RECOVERY_DEST_FILE              VARCHAR2(3)

  9. SQL>
     有与在归档模式下,Oracle的性能会受到一定的影响,所以Oracle默认情况采用的是非归档模式。取得当前Oracle的归档模式可以从v$database数据字典中查看。日志的状态NOARCHIVELOG指的是非归档模式,而ARCHIVELOG是归档模式。
SQL> select name,log_mode from v$database;

NAME      LOG_MODE
--------- ------------
ORCL      NOARCHIVELOG

SQL>

日志文件全部存放在日志文件组中。如何创建、删除、查询日志文件组,以及如何添加日志文件到日志文件组。








阅读(1405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~