从零开始学习Oracle之控制文件和日志

Oracle控制文件主要用来存放数据库的名字、数据库的位置等信息。日志记录了Oracle数据库日常操作。控制文件和日志文件都存储了Oracle数据库中的重要信息。

1.控制文件简介

控制文件是数据库中最小的文件,是一个二进制文件,其中包括了数据库的结构信息,同时也包括了数据文件和日志文件的一些信息。控制文件虽小,但可以说是Oracle中最重要的文件,只有Oracle进程才能够更新控制文件中的内容。控制文件中主要包括数据库名称、位置、联机或者脱机状态、Redo Log File的位置和名称、表空间名称、Archive Log File信息、CheckPoint信息、Undo信息、RMAN信息等,从控制文件中包含的内容也可以看出控制文件在整个 Oracle 中的重要性。

控制文件在每个数据库中都存在,但是一个控制文件只能属于一个数据库。这就像是工作证,每个员工都有工作证,但是一个工作证只能属于一个员工。在创建数据库时,控制文件被自动创建,如果数据库的信息发生变化,控制文件也会随之改变。控制文件不能手动修改,只能由Oracle数据库本身来修改。控制文件在数据库启动和关闭时都要使用,如果没有控制文件,数据库将无法工作。

2.控制文件的应用案例

2.1查看控制文件的内容

通过数据字典v$controlfile,可以查看控制文件的存放位置和状态。

在数据字典中查看控制文件的存放位置和状态。实现代码如下:

SELECT name,status FROM v$controlfile;

2.2更新控制文件的内容

当数据文件出现增加、重命名和删除等操作时,Oracle服务器会立刻更新控制文件以反映数据库结构的这种变化。每次在数据库的结构发生变化后,为了防止数据丢失都要备份控制文件。各进程根据分工的不同分别把更改后的数据库信息写入到控制文件中:日志写入进程负责把当前日志序列号记录到控制文件中;校验点进程负责把校验点的信息记录到控制文件中;归档进程负责把归档日志的信息记录到控制文件中。

为了应对磁盘损坏等数据灾难的情况,用户可以把控制文件进行镜像操作,这样即使一个文件被破坏,其他的控制文件依然存在,数据也不会丢失,数据库还可以正常运行。

2.3使用init.ora多路复用控制文件

控制文件虽然由数据库直接创建,但是在数据库初始化之前,用户可以修改初始化文件init.ora。要修改init.ora,需要先找到它的存放位置,这个文件的位置在安装目录的admin\orcl\pflie下,如下图所示:

在修改 init.ora文件之前,先通过复制操作把控制文件复制到不同的位置,然后用记事本打开init.ora文件,找到control files参数后即可进行修改。修改时需要注意,在每个控文件之间是通过逗号分隔的,并且每一个控制文件都是用双括号括起来的。在修改控制文件的路径之前,需要把控制文件复制一份进行保存,以免数据库无法启动。

2.4使用SPFILE多路复用控制文件

除了修改init.ora初始化参数的方式可以实现多路复用控制文件外,还可以通过SPFILE方式实现多路复用,它们的原理和修改参数是一样的。

使用SPFILE多路复用控制文件。具体操作步骤如下:

STEP1:修改control files参数。

在确保数据库是打开状态时,使用以下命令修改control_files参数,语句如下:

ALTER SYSTEM SET control_files='文件的路径1',
‘文件的路径2’,
‘文件的路径3’,…,
'文件的路径n' scope=spfile;

STEP2:关闭数据库。

在数据库打开时,数据库中的文件是无法操作的。关闭数据库的命令如下:

shutdown immediate;

STEP3:在DOS下复制文件到指定位置。

在DOS窗口下使用复制命令在指定位置增加一个控制文件。具体命令如下:

copy 旧文件,新文件

STEP4:启动数据库实例并验证。

文件复制完成后,使用startup命令重新启动数据库。

Startup;

在数据字典controlfile中重新查询现存的控制文件,命令如下:

SELECT name, status FROM v$controlfile;

2.5创建控制文件

虽然有多种保护控制的方法,但是仍然不能完全保证控制不出现丢失和损坏的情况。特别是以下两种情况出现时:

  1. 需要永久地修改数据库的参数设置。
  2. 当控制文件全部损坏,无法修复时。

手动创建控制文件。具体操作步骤如下:

STEP1:找原有的数据文件和重做日志的路径。

获取数据文件和重做日志路径的方法有两种:

一种方法是,当控制文件没有损坏时,从控制文件中直接获取;

另外一种方法是,如果控制文件损坏了,从数据字典v$datafile

中获取数据文件的信息,从数据字典v$logfile中获取日志文件的信息。

当然,使用上面两种方法的前提是数据库能够正常启动。如果数据库不能正常启动,那么需要根据系统的错误信息来查找原因。在创建新的控制文件并且使用它打开数据库以后,Oracle会对数据字典和控制文件的内容进行检查。如果发现数据字典包含了某个数据文件而控制文件没有列出这个数据文件,Oracle数据库就会报错。数据库管理员可以根据这些信息来判断是否缺少必要的数据文件,一步步查找到真正的数据文件。

获取数据文件的命令如下:

SELECT name FROM v$datafile;

获取日志文件的命令如下:

SELECT member FROM v$logfile;

STEP2:关闭数据库

在创建控制文件之前,需要先关闭数据库。命令如下:

shutdown immediate;

为了保证数据库的安全,关闭数据库后,应该把数据库的日志文件、数据库文件、参数文件等备份到其他硬盘上。

STEP3:创建新的控制文件

把原来的控制文件备份到其他位置后,还需要启动一个数据库实例。启动实例的语句如下:

startup nomount;

参数nomount表示只启动实例。

启动实例后就可以创建控制文件了。创建控制文件的语句如下:

create controlfile
reuse database'数据库实例名'noresetlogs//是否重做日志或重命名数据库noarchivelog//
归档状态
maxlogfiles //最大日志文件大小
maxlogmembers //日志文件组的成员数
maxinstances //最大实例的个数
maxloghistory //最大历史日志文件个数
logfile //日志文件
group1'日志文件的路径1'size 日志文件的大小,
..
groupn、日志文件的路径n'size日志文件的大小
datafile //数据文件
路径1',
...
路径n'
character set we8dec

参数 noresetlogs 表示在创建控制文件时不需要重做日志文件和重命名数据库,否则可以使用 resetlogs 参数。

STEP4:使用SPFILE方法修改init.ora中control files参数。

STEP5:验证控制文件。

重启数据库后,查询v$controlfile数据字典,检查控制文件是否全部正确加载。如果数据库加载不了,可以重新启动数据库服务。验证的命令如下:

SELECT name FROM v$controlfile;

至此,控制文件创建成功。

3.日志简介

Oracle日志主要分为两类包括重做日志文件和归档日志文件。重做日志文件是Oracle数据库正常运行不可缺少的文件。重做日志文件主要记录数据库操作的过程。在需要恢复数据库时,重做日志文件可以从备份还原的数据库上再执行一次,从而达到数据库的最新状态。

Oracle系统在运行时有归档模式和非归档模式。在归档模式下,如果重做日志文件全部写满后,就把第一个重做日志文件写入归档日志文件中,再把日志文件写到第一个重做日志文件中,使用归档方式可以方便以后的恢复操作;在非归档模式下,所有的日志文件都写在重做日志文件中,如果重做日志文件写满了,那么就把前面的日志文件覆盖掉。

在归档模式下,Oracle的性能会受到一定的影响,所以Oracle 默认情况下采用的是非归档模式。获取当前Oracle的归档模式可以从v$database 数据字典中查看。

如果需要查看当前数据库的模式,可以通过查看当前数据库的log_mode的值实现。

查看当前数据库的模式。实现代码如下:

SELECT name, log_mode FROM v$database;

从结果可以看出,当前模式为非归档模式。如果结果为ARCHIVELOG,则表示当前模式为归档模式。

4.管理日志文件

在Oracle数据库中,日志文件全部存放在日志文件组中。

4.1新建日志文件组

通过日志文件组,数据库管理员可以轻松地管理日志文件。创建日志文件组的语法如下:

ALTER DATABASE [database_name]
ADD LOGFILE GROUP n
filename SIZE m;
  • 参数database_name为要修改的数据库名,如果省略,表示为当前数据库;
  • 参数n为创建日志工作组的组号,组号在日志组中必须是唯一的;
  • 参数filename表示日志文件组的存在位置;
  • 参数m表示日志文件组的大小,默认情况下大小为50MB。

4.2添加日志文件到日志文件组

添加日志文件和添加日志文件组的语法非常类似。语法规则如下:

ALTER DATABASE [database_name]
ADD LOGFILE MEMMER
filename TO GROUP n;
  • 参数database name为要修改的数据库名,如果省略,则表示为当前数据库;
  • 参数filename表示日志文件的存在位置;
  • 参数n为日志文件填入的组号。

4.3删除日志文件组和日志文件

使用ALTER DATABASE语句可以删除日志文件组,具体的语法规则如下:

ALTER DATABASE [database_name]
DROP LOGFILE
GROUP n;
  • 参数n为日志文件组的组号。

删除日志文件的方法与删除日志文件组的方法类似。语法格式如下:

ALTER DATABASE [database name]
DROP LOGFILE MEMBER
filename;
  • 参数filename 表示日志文件的名称,当然也包括日志文件的路径。

4.4查询日志文件组和日志文件

用户可以查询已经存在的日志文件组和日志文件。查询日志文件组主要是通过V$LOG来实现。

查询V$LOG中的组号(GROUP#)、成员数(MEMBERS)和状态(STATUS)的信息。实现代码如下:

SELECT GROUP#, MEMBERS,STATUS FROM V$LOG;

查询日志文件主要通过V$LOGFILE来实现,

查询V$LOGFILE中的组号(GROUP#)、成员(MEMBER)的信息。实现代码如下:

SELECT GROUP#, MEMBER FROM V$LOGFILE;

在Oracle 日志文件中,最容易模糊的就是日志文件的3个状态,它们的含义如下:

  • current: 表示LGWR正在写的日志文件。
  • active:表示LGWR正在写的日志文件,实例恢复时需要这种文件。
  • inactive:表示LGWR正在写的日志文件,实例恢复时也不会用到这种文件。

通过参数ARCHIVE LAGTARGET可以控制日志切换的时间间隔,以秒为单位。通过减少时间间隔,从而实现提高日志的切换频率。例如以下代码:

SQL> ALTER SYSTEM SET ARCHIVE_LAG_TARGET=50 SCOPE=both;

通过上面的命令,可以实现日志每50秒切换一次。

举报
评论 0