Oracle 控制文件和日志文件

管理控制文件

在Oracle数据库中,控制文件是一个很小(大小一般在10MB范围内)的二进制文件,含有数据库的结构信息,包括数据文件和日志文件的信息。可以将控制文件理解为物理数据库的一个元数据存储库。控制文件在数据库创建时被自动创建,并在数据库发生物理变化时更新。控制文件被不断更新,并且在任何时候都要保证控制文件是可用的。只有Oracle进程才能够安全地更新控制文件的内容,所以,任何时候都不要试图手动编辑控制文件。
由于控制文件在数据库中的重要地位,所以保护控制文件的安全非常重要,为此Oracle系统提供了备份文件和多路复用的机制。当控制文件损坏时,用户可以通过先前的备份来恢复控制文件。系统还提供了手工创建控制文件和把控制文件备份成文本文件的方式,从而使用户能够更加灵活地管理和保护控制文件。
控制文件中记录了对应数据库的结构信息(如,数据文件和日志文件的名称、位置等信息)和数据库当前的参数设置,其中主要包含如下内容:

  • 数据库名称和SID标识
  • 数据文件和日志文件列表(包括文件名称和对应路径信息)。
  • 数据库创建的时间戳。
  • 表空间信息。
  • 当前重做日志文件序列号。
  • 归档日志信息。
  • 检查点信息。
  • 回滚段(UNDO SEGMENT)的起始和结束。
  • 备份数据文件信息。
    (1)及时备份控制文件
    Oracle数据库的控制文件是在创建数据库时自动创建的,一般情况下,控制文件至少有一个副本。当Oracle数据库的实例启动时,控制文件用于在数据库(包括数据文件、控制文件、日志文件)和实例(指Oracle内存管理结构)之间建立起关联,它在进行数据库操作时必须被打开。当数据库的物理组成(比如,增加一个重做日志文件)发生变化时,Oracle将自动把这个变化信息记录到控制文件中。如果数据库的物理组成发生了变化,则建议用户及时备份控制文件。
    (2)保护控制文件
    一旦控制文件被损坏,数据库便无法顺利启动,而且修复也非常困难。也因为如此,控制文件的管理与维护工作显得格外重要。由于控制文件对整个数据库起着非常重要的作用,因此数据库管理员在管理控制文件时,需要采用多种策略或准则来保护控制文件,目前采用的方法主要包括多路复用控制文件和备份控制文件。
    控制文件的多路复用
    为了提高数据库的安全性,至少要为数据库建立两个控制文件,并且这两个控制文件最好分别保存在不同的磁盘中,这样就可以避免产生由于某个磁盘故障而无法启动数据库的危险,该管理策略被称为多路复用控制文件。通俗地说,多路复用控制文件是指在系统不同的位置上同时存放多个控制文件的副本,在这种情况下,如果多路复用控制文件中的某个磁盘发生物理损坏导致其所包含的控制文件损坏,数据库将被关闭(在数据库实例启动的情况下),此时就可以利用另一个磁盘中保存的控制文件来恢复被损坏的控制文件,然后再重新启动数据库,达到保护控制文件的目的。
    在初始化参数CONTROL_FILES中列出了当前数据库的所有控制文件名。Oracle将根据CONTROL_FILES参数中的信息同时修改所有的控制文件,但只读取其中的第一个控制文件中的信息。另外,需要注意的是:在整个数据库运行期间,如果任何一个控制文件被损坏,那么实例就不能再继续运行。实现控制文件的多路复用主要包括更改CONTROL_FILES参数和复制控制文件两个步骤,具体如下:
    1.更改CONTROL_FILES参数
    在SPFILE文件中,CONTROL_FILES参数用于设置数据库的控制文件路径(包括文件名),Oracle通过该参数来定位并打开控制文件,如果需要对控制文件进行多路复用,就必须先更改CONTROL_FILES参数的设置,更改这个参数可以使用ALTER SYSTEM语句
SQL> alter system set control_files=
  2    'E:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL',
  3    'E:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL',
  4    'D:\OracleFiles\ControlFiles\CONTROL03.CTL'
  5  scope=spfile;

在上面的代码中,前两个控制文件是在创建数据库时自动创建的,第3个控制文件是用户将要手动添加的(用于实现多路复用的功能),并且它位于不同的磁盘上(为了降低故障率),但目前还没有创建该文件,用户需要关闭数据库,然后通过手动复制来创建它。
2.复制控制文件
在CONTROL_FILES参数进行设置后,需要创建第3个控制文件,以达到复用控制文件的目的,具体步骤如下:
(1)退出SQL*Plus环境。
(2)选择“开始”/“控制面板”/“管理工具”/“组件服务”项,打开Windows的“组件服务”窗口,在该窗口的中间部分找到OracleServiceORCL和OracleDBConsoleORCL服务,手动将这些服务停止
这里写图片描述
(3)找到CONTROL_FILES参数中所指定的第一个控制文件,然后将这个控制文件拷贝到CONTROL_FILES参数中新增加的目录下,并按照参数的设置重新命名(这里重命名为CONTROL03.CTL,注意:它就是CONTROL01.CTL的多路复用控制文件)
这里写图片描述
(4)启动“组件服务”窗口中的OracleServiceORCL和OracleDBConsoleORCL服务,打开SQL*Plus环境,通过查询数据字典V$CONTROLFILE来确认添加的控制文件是否已经起作用,代码如下:

SQL> select name as 控制文件  from V$CONTROLFILE;

这里写图片描述

创建控制文件
在一般情况下,若使用了多路复用控制文件,并将各个控制文件分别存储在不同的磁盘中,则全部控制文件丢失或损坏的可能性将非常小。如果突发意外,而导致数据库的所有控制文件全部丢失或损坏,唯一的补救方法就是手工创建一个新的控制文件。手工创建控制文件使用CREATE CONTROLFILE语句

create controlfile
reuse database db_name
logfile
group 1 redofiles_list1
group 2 redofiles_list2
group 3 redofiles_list3
...
datafile
datafile1
datafile2
datafile3
…
maxlogfiles max_value1
maxlogmembers max_value2
maxinstances max_value3
maxdatafiles max_value4
noresetlogs|resetlogs
archivelog|noarchivelog;

参数说明如下:

  • db_name:数据库名称,通常是orcl。
  • redofiles_list1:重做日志组中的重做日志文件列表1,列表中的重做日志文件可以有多个,其下面两个个列表与此相同。
  • datafile1:数据文件路径,其下面两个个列表与此相同。
  • max_value1:最大的重做日志文件数,这是一个永久性的参数。
  • max_value2:最大的重做日志组成员数,这是一个永久性的参数。
  • max_value3:最大实例数,这是一个永久性的参数。
  • max_value4:最大数据文件数,这是一个永久性的参数。

    在上面的语法中,提到了永久性参数这个概念,它是在创建数据库时设置的参数,主要包括数据库名称、MAXLOGFILES、MAXLOGMEMBERS、MAXINSTANCES等。
    注意:若数据库管理员需要改变数据库的某个永久性参数,那么必须重新创建控制文件。

备份和恢复控制文件
为了提高数据库的可靠性,降低由于丢失控制文件而造成灾难性后果的可能性,DBA需要进场对控制文件进行备份。特别是当修改了数据库结构之后,需要立即对控制文件进行备份。
1.备份控制文件
备份控制文件需要使用到ALTER DATABASE BACKUP CONTROLFILE语句。有两种备份方式:一种是备份为二进制文件,另一种是备份为脚本文件。
备份为二进制文件:备份为二进制文件需要使用“alter dabase backup controlfile”语句。

---- 将数据库的控制文件备份为一个二进制文件,即复制当前的控制文件
SQL> alter database backup controlfile
  2  to 'D:\OracleFiles\ControlFiles\control_file1.bkp';

备份为脚本文件:备份为脚本文件实际上就是备份为可读的文本文件,同样使用“alter dabase backup controlfile”语句。
删除控制文件
如果控制文件的位置不在适合时,可以从数据库中删除控制文件,其操作过程如下。
(1)关闭数据库(shutdown)。
(2)编辑初始化参数CONTROL_FILES,清除掉打算要删除的控制文件的名称。
(3)重新启动数据库(startup)。
上面的第二部操作,仅仅是在初始化参数CONTROL_FILES中删除了指定的控制文件,但物理磁盘上的控制文件还是存在的,用于也可以在这个操作之后,手动清除磁盘上的物理文件。
注意:不能够将控制文件全部删除,至少保留两个或两个以上,否则数据库将无法启动。
查询控制文件的信息
控制文件是一个二进制文件,其中被分隔成许多部分,分别记录各种类型的信息。每一类信息成为一个记录文档段。控制文件的大小在创建时即被确定,其中各个记录文档段大小也是固定的。例如,在创建数据库时通过MAXLOGFILES子句设定数据库中最多的重做日志文件数量,那么在控制文件中就会为LOGFILE记录文档分配相应的存储空间。
查询Oracle数据库的控制文件信息,可以使用若干个数据字典视图,与控制文件信息相关的常用数据字典视图如表所示。
这里写图片描述

使用v$controlfile_record_section视图查看控制文件中记录文档段的类型、文档段中每条记录的大小、记录文档中最多能够存储的条目数、已经创建的数目等信息

SQL> select type,record_size,records_total,records_used from v$controlfile_record_section;

这里写图片描述
type列表示记录文档段的类型,这里以TABLESPACE为例,该数据库最多可以拥有200个表空间(RECORDS_TOTAL列),而现在系统中已经创建了9个(RECORDS_USED列)。

管理重做日志文件

重做日志文件用于记载事务操作所引起的数据变化,当执行DDL或DML操作时,由LGWR进程将缓冲区中与该事物相关的重做记录全部写入重做日志文件。当丢失或损坏数据库中的数据时,Oracle会根据重做日志文件中的记录恢复丢失的数据。
1.日志文件的内容及数据恢复
重做日志文件由重做记录组成,重做记录又称为重做条目,它由一组变更向量组成。每个变更向量都记录了数据库中某个数据块所做的修改。比如,用户执行了一条UPDATE语句对某个表的一条记录进行修改,同时生成一个条重做记录。这条重做记录可能有多个变更向量组成,在这些变更向量中记录了所有被这条语句修改过的数据块中的信息,被修改的数据块包括表中存储这条记录的数据块,以及回滚段中存储的相应回滚条目的数据块。如果由于某种原因导致这条UPDATE语句执行失败,这时事务就可以通过与这条UPDATE语句对应的重做记录找到被修改之前的结果,然后将其复制到各个数据块中,从而完成数据恢复。
利用重做记录,不仅能够恢复对数据文件所做的修改操作,还能够恢复对回退段所做的修改操作。因此,重做日志文件不仅可以保护数据,还能够保护回退段数据。在进行数据库恢复时,Oracle会读取每个变更向量,然后将其中记录的修改信息重新应用到相应的数据块上。
重做记录将以循环方式在SGA区的重做日志高速缓冲区中进行缓存,并且由后台进程LGWR写入到重做日志文件中。当一个事务被提交时,LGWR进程将与该事物相关的所有重做记录全部写入重做日志文件组中,同时生成一个“系统变更码”(SCN)。系统变更码SCN会随着重做记录一起保存到重做日志文件组中,以标识与重做记录相关的事务。只有当某个视图所产生的重做记录全部被写入重做日志文件后,Oracle才会认为该事务提交成功。
2.写入重做日志文件
在Oracle中,用户对数据库所做的修改首先被保存在内存冲,这样可以提高数据库的性能,因为对内存中的数据进行操作要比对磁盘中的数据进行操作快的多。Oracle每隔一段时间(日志信息存放超过3秒钟)或满足特定条件时(当发生提交命令、或者重做日志缓冲区的信息满1/3)就会启动LGWR进程将内存中的重做日志记录保存到重做日志文件中。因此,即使发生故障导致数据库崩溃,Oracle也可以利用重做日志文件来恢复丢失的数据。
在创建Oracle数据库的过程中,默认创建3个重做日志文件组,每个日志文件组中包含两个日志文件成员,并且每个日志文件组都有内部序号,Oracle按照序号从小到大的顺序向日志文件组中写入日志信息。当一个重做日志文件组写满后,后台进程LGWR开始写入下一个重做日志文件组;当LGWR进程将所有的日志文件都写过一遍之后,它将再次转向第一个日志文件组重新覆盖。当前正在被LGWR进程写入日志记录的某组重做日志文件被称为“联机重做日志文件”(Online Redo Log File),图11-12显示了重做日志的循环写入方式。
这里写图片描述
增加日志组及其成员
在一个Oracle数据库中,至少需要两个重做日志文件组,每个组可以包含一个或多个重做日志成员。通常情况下,数据库管理员会在创建数据库时按照事先计划创建所需要的重做日志文件组和各个组中的日志文件。在一些特殊情况下(比如,发现LGWR进程经常处于等待状态),Oracle就需要通过手工方式向数据库中添加新的重做日志组或成员,或者改变重做日志文件的名称与位置,以及删除中作日志组或成员。另外,需要注意的是:对于重做日志文件的这些日常维护工作,需要用户具有ALTER DATABASE系统权限,接下来就将讲解如何对重做日志文件进行这些日常维护操作。
1.添加新的重做日志文件组
在Oracle数据库的日常管理中,为了防止后台进程LGWR等待写入日志组,数据库管理员必须选择合适的日志组个数。增加重做日志文件组可以使用ALTER DATABASE ADD LOGFILE语句

-----在system模式下,向数据库中添加一个新的重做日志文件组
SQL> alter database add logfile
  2  ('D:\OracleFiles\LogFiles\REDO4_A.LOG',
  3  'E:\OracleFiles\LogFiles\REDO4_B.LOG')
  4  size 20M;

在上面新增的重做日志组中有两个日志成员,它们分别位于不同的磁盘分区,大小均为20M,通常情况下,重做日志文件的大小最好在10MB到50MB之间,Oracle默认的日志文件大小是50MB。另外,上面的例子中并没有为新创建的重做日志组指定组编号,这种情况下,Oracle会自动为新建的重做日志组设置编号,一般在当前最大组号之后递增。
如果需要为新创建的重做日志组指定编号,则需要在ALTER DATABASE ADD LOGFILE语句后添加GROUP关键字

   -----向数据库中添加一个新的重做日志文件组,并指定组编号为5
SQL> alter database add logfile group 5
  2  ('D:\OracleFiles\LogFiles\REDO5_A.LOG',
  3  'E:\OracleFiles\LogFiles\REDO5_B.LOG')
  4  size 20M;

使用日志组编号可以更加方便地管理重做日志组,但是日志组编号必须是连续的,不能跳跃,比如,1、3、5、7这样不连续的编号是不可以的,否则将会耗费数据库控制文件的空间。

------向数据库中添加一个单一的重做日志文件,并覆盖已存的同名日志文件
SQL> alter database add logfile ‘D:\OracleFiles\LogFiles\REDO6.LOG’ reuse;

如果要创建的日志文件已经存在,则必须在ALTER DATABASE ADD LOGFILE语句后面使用REUSE关键字,这样就可以覆盖已有的操作系统文件。在使用了REUSE的情况下,不能再使用SIZE子句设置重做日志文件的大小,重做日志文件的大小将由已存在日志文件的大小决定。
2.创建日志成员文件
如果某个日志组中的所有日志成员都被损坏了,那么当后台进程LGWR切换到该日志组时,Oracle会停止工作,并对该数据库执行不完全恢复,为此数据库管理员需要向该日志组中添加一个或多个日志成员。
为重做日志组添加新的成员,需要使用ALTER DATABASE ADD LOG MEMBER语句

------为第4个重做日志文件组添加一个新的日志文件成员
SQL> alter database add logfile member
  2  'E:\OracleFiles\LogFiles\REDO4_C.LOG' to group 4;

另外,还可以通过指定重做日志组中其他成员的名称,以确定要添加的新日志成员所属于的重做日志组

------通过指定第5个重做日志组中的一个成员,来向该组中添加一个新的重做日志文件
SQL> alter database add logfile member
  2  'D:\OracleFiles\LogFiles\REDO1_new.LOG' to ('E:\app\Administrator\oradata\orcl\REDO01.LOG') ;

在上面的代码中,需要注意的是:在关键字“to”的左侧是新增加的日志成员的名称,而在其右侧则是要参照的日志成员名称,并且该日志成员的路径需要使用括号括起来。
删除重做日志
在某些情况下,数据库管理员可能需要删除重做日志的某个完整的组,或减少某个日志组中的成员。比如,存放某个日志文件的磁盘被损坏,就需要删除该损坏磁盘的日志文件,以防止Oracle将重做记录写入到不可访问的文件中。删除重做日志需要使用ALTER DATABASE语句,执行该语句要求用户具有ALTER DATABASE系统权限。
1.删除日志成员
要删除一个日志成员文件,可以使用“ALTER DATABASE DROP LOGFILE MEMBER”语句

---在system模式下,除“E:\OracleFiles\LogFiles\REDO4_C.LOG”重做日志文
SQL> alter database drop logfile member
  2  'E:\OracleFiles\LogFiles\REDO4_C.LOG';

说明: 上面的语句只是在数据字典和控制文件中将重做日志文件成员删除,而对应的物理文件并没有删除,若要删除,可以采取手动删除的方式。
2.删除日志文件组
如果某个日志文件组不再需要使用,可以将整个日志组删除;或者当日志组大小不合适时,由于已经存在的日志组的大小不能改变,就需要重新建立日志组,在重新建立日志组之前,就需要删除大小不合适的原日志组。删除一个日志组时,其中的成员文件也将被删除。在删除日志组时,必须要注意以下几点:

  • 无论日志组中有多少个成员,一个数据库至少需要两个日志组,删除时不能超过这个限制。
  • 只能删除处于INACTIVE状态的日志组。如果要删除处于CURRENT状态的重做日志组,必须执行一个手工切换日志,将它切换到INACTIVE状态。
  • 如果数据库处于归档模式,在删除重做日志组之前必须确定它已经被归档。
    说明: 用户可以通过查询V$LOG数据字典视图来查看重做日志文件组的状态以及它们是否已经归档。
    若要删除一个重做日志组,需要使用带有 ALTER DATABASE DROP LOGFILE语句。
----删除数据库中编号为5的日志组
SQL> alter database drop logfile group 5;

与删除指定的日志文件相同,删除日志文件组也只是在数据字典和控制文件中将日志文件组的信息删除,而对应的物理文件并没有删除,若要删除,可以采取手动删除的方式。
3.清空重做日志文件
清空重做日志文件实际上就是将日志文件中的内容清空,这相当于删除原有的日志文件,重新创建新的日志文件。即使数据库只有两个重做日志文件组,甚至要清空的重做日志组处于CURRENT状态,也都可以成功执行清空操作。
清空日志文件,需要使用“ALTER DATABASE CLEAR LOGFILE”语句

----清空数据库中编号为4的日志组中所有日志文件的内容
SQL> alter database clear logfile group 4;

说明:如果要清空的重做日志文件组尚未归档,则必须在使用“ALTER DATABASE CLEAR UNARCHIVED LOGFILE”语句。

更改重做日志的位置或名称
在重做日志文件创建后,有时候可能需要改变它们的名称或位置。比如,某一个日志文件最初被放置在D盘上,由于D盘的空间并不足够大,随着应用系统业务量的不断增加,D盘经常发生剩余空间不足的情况,这时候数据库管理员就需要把D盘上的日志文件移动到其它大容量的磁盘分区中,针对这种情况,我们来看一下它的具体实现步骤:
(1)关闭数据库,代码及运行结果如下。

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

(2)手动复制源文件到目标位置,甚至可以对复制后的文件进行重命名。
(3)再次启动数据库实例,加载数据库,但不打开数据库,代码如下。

SQL> startup mount;
ORACLE 例程已经启动。

(4)使用ALTER DATABASE RENAME FILE语句重新设置重做日志文件的路径及名称,代码及运行结果如下。

SQL> alter database rename file
  2  'D:\OracleFiles\LogFiles\REDO1_NEW.LOG',
  3  'D:\OracleFiles\LogFiles\REDO4_A.LOG'
  4  to
  5  'E:\OracleFiles\LogFiles\REDO1_NEWa.LOG',
  6  'E:\OracleFiles\LogFiles\REDO4a.LOG';

数据库已更改。

在上面的代码中,关键字“to”上面的两行代码描述源日志文件及其路径,下面的两行代码描述目标日志文件。
(5)打开数据库,代码及运行结果如下。

SQL> alter database open;
数据库已更改。

(6)打开数据库后,新的重做日志文件的位置和名称将生效,通过查询V$LOGFILE字典视图就可以获知数据库现在所使用的重做日志文件。

对于数据库管理员而言,经常查看日志文件是其一项必要的工作内容,用以了解数据库的运行情况。要了解Oracle数据库的日志文件信息,可以查询如表11-2所示的三个常用数据字典视图。
这里写图片描述
在SQL*Plus环境中,使用desc命令显示V$LOG数据字典视图的结构
这里写图片描述
在上面的运行结果中,用户需要对以下内容进行了解:

  • GROUP#:日志文件组编号。
  • SEQUENCE#:日志序列号。
  • STATUS:日志组的状态,有三种:CURRENT、INACTIVE、ACTIVE。
  • FIRST_CHANGE#:重做日志组上一次写入时的系统变更码(SCN),也称作检查点号。在使用日志文件对数据库进行恢复时,将会用到SCN。

管理归档日志文件

日志模式分类
虽然归档日志文件可以保存重做日志文件中即将被覆盖的记录,但它并不是总起作用的,这样要看Oracle数据库所设置的日志模式,通常Oracle有两种日志模式:第一种是非归档日志模式(NOARCHIVELOG),第二种是归档日志模式(ARCHIVELOG)。在非归档日志模式下,原日志文件的内容会被新的日志内容所覆盖;在归档日志模式下,Oracle会首先对原日志文件进行归档存储,且在归档未完成之前不允许覆盖原有日志。
1.归档模式(ARCHIVELOG)
在重做日志文件被覆盖之前,Oracle能够将已经写满的重做日志文件通过复制保存到指定的位置,保存下来的所有重做日志文件被称为“归档重做日志”,这个过程就是“归档过程”。只有数据库处于归档模式时,才会对重做日志文件执行归档操作。另外,归档日志文件中不仅包含了被覆盖的日志文件,还包含重做日志文件使用的顺序号。
当数据库的运行处于归档模式时,具有如下优势:

  • 如果发生磁盘介质损坏,则可以使用数据库备份与归档重做日志恢复已经提交的事务,保证不会发生任何数据丢失。
  • 如果为当前数据库建立一个备份数据库,通过持续地为备份数据库应用归档重做日志,可以保证源数据库与备份数据库的一致性。
  • 利用归档日志文件,可以实现使用数据库在打开状态下创建的备份文件来进行数据库恢复。

在归档模式下,系统后台进程LGWR在写入下一个重做日志文件之前,必须等待该重做日志文件完成归档,否则LGWR进程将被暂停执行,直到对重做日志文件归档完成。归档操作可以由后台进程ARCN自动完成,也可以由数据库管理员手工完成,为了简化操作,通常情况下选择由后台进程ARCN自动完成。另外,为了提高归档的速度,可以考虑使用多个ARCN进程加速归档的速度。图显示了在归档模式下重做日志文件的自动归档过程。
这里写图片描述

2.非归档模式(NOARCHIVELOG)
非归档模式只能用于保护实例故障,而不能保护介质故障,当数据库处于NOARCHIVELOG模式时,如果进行日志切换,生成的新内容将直接覆盖掉原来的日志记录。
使用非归档模式具有如下一些特点:

  • 当检查点完成之后,后台进程LGWR可以覆盖原来的重做日志文件。
  • 如果数据库备份后的重做日志内容已经被覆盖掉,那么当出现数据库文件损坏时,只能恢复到最近一次的某个完整备份点,而且这个备份点的时间人工无法控制,甚至可能会有数据丢失。

    Oracle数据库具体应用归档模式还是非归档模式,这个由数据库对应的应用系统来决定。如果任何由于磁盘物理损坏而造成的数据丢失都是不允许的,那么就只能使用归档模式;如果只是强调应系统的运行效率,而将数据的丢失考虑次之,可以采取非归档模式,但数据库管理员必须经常定时地对数据库进行完整的备份.

管理归档操作

默认情况下,Oracle数据库处于非归档日志模式,这样重做日志文件中被覆盖掉的日志记录就不会被写入到归档日志文件中。根据Oracle数据库对应的应用系统的要求,用户可以把数据库的日志模式切换到归档模式,反之亦可操作。要实现数据库在归档模式与非归档模式之间进行切换,可以使用ALTER DATABASE ARCHIVELOG或NOARCHIVELOG语句。
1.日志模式切换
在Oracle 11g中,归档日志文件默认情况下存放到快速恢复区所对应的目录(由初始化参数DB_RECOVERY_FILE_DEST设定)中,并且会按照特定的格式生成归档日志文件名。如果只想将归档日志文件放在默认的路径下时,那么只需执行ALTER DATABASE ARCHIVELOG语句即可。
改变日志操作模式时,用户必须以SYSDBA的身份执行相应操作。接下来讲解数据库由非归档模式切换为归档模式的具体操作步骤:
(1)查看当前日志模式
在改变日志模式之前,用户首先应该检查当前日志模式,这个可以通过查询动态性能视图V$DATABASE实现

SQL> select log_mode from v$database;
结果:
LOG_MODE
------------
NOARCHIVELOG

通过查询结果可以看到,数据库当前处于非归档日志模式(NOARCHIVELOG)
(2)关闭并重新启动数据库
改变日志操作模式必须在MOUNT状态下进行,因此必须先关闭数据库,然后重新装载数据库。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

注意:改变日志模式时,关闭数据库不能使用SHUTDOWN ABORT命令。
(3)改变日志模式
使用ALTER DATABASE ARCHIVELOG语句将数据库切换到归档模式

SQL> alter database archivelog;
数据库已更改。

若是要把归档日志模式改变成非归档日志模式,只需要将ALTER DATABASE ARCHIVELOG语句中的“ARCHIVELOG”关键字换成“NOARCHIVELOG”即可,其它步骤基本相同。
(4)打开数据库
使用ALTER DATABASE OPEN语句打开数据库,这时数据库的日志模式就彻底改变了

SQL> alter database open;
数据库已更改。

数据库打开后,用户可以使用ARCHIVE LOG LIST命令查看数据库是否处于归档模式。

2.配置归档进程
如果Oracle系统的后台进程LGWR经常出现等待的状态,就可以考虑启动多个ARCN进程,通过修改系统初始化参数“LOG_ARCHIVE_MAX_PROCESSES”就可以调整启动ARCN进程数量

----设置启动3ARCN后台系统进程
SQL> alter system set log_archive_max_processes=3;
系统已更改。

说明:当数据库处于ARCHIVELOG模式时,默认情况下Oracle会自动启动两个归档日志进程。通过改变初始化参数LOG_ARCHIVE_MAX_PROCESSES的值,用户可以动态地增加或减少归档进程的个数。

设置归档文件位置

归档日志文件保存的位置称为归档目标,用户可以为数据库设置多个归档目标,与设置控制文件和重做日志文件一样,不同的归档目标最好位于不同的磁盘中,以缓解归档操作时磁盘的I/O瓶颈。
归档目标在初始化参数LOG_ARCHIVE_DEST_n中进行设置,其中n为1到10的整数,即可以为数据库指定1到10个归档目标。在进行归档时,Oracle会将重做日志文件组以相同的方式归档到每一个归档目标中。在设置归档目标时,可以指定本地机器作为归档目标(LOCATION),也可以选择远程服务器作为归档目标(SERVER),下面分别来看这两种情况。
(1)本地归档目标(LOCATION)
若设置LOG_ARCHIVE_DEST_n参数时使用LOCATION关键字,则表示指定的归档目标在本地机器上。

----在本地机器上,建立4个归档目标,代码及运行结果如下。
SQL> alter system set log_archive_dest_1 = 'location=D:\OracleFiles\archive1';
系统已更改。
SQL> alter system set log_archive_dest_2 = 'location=D:\OracleFiles\archive2';
系统已更改。
SQL> alter system set log_archive_dest_3 = 'location=D:\OracleFiles\archive3';
系统已更改。
SQL> alter system set log_archive_dest_4 = 'location=D:\OracleFiles\archive4';
系统已更改。

使用初始化参数LOG_ARCHIVE_DEST_n设置归档位置时,还可以指定OPTIONAL、MANDATORY或REOPEN选项,下面分别进行介绍。

  • OPTIONAL:该选项是默认选项,使用该选项时,无论“归档操作”是否执行成功,都可以覆盖重做日志文件。
  • MANDATORY:该选项用于强制进行“归档操作”。使用该选项时,只有在归档成功后,重做日志文件才能被覆盖。
  • REOPEN:这是一个属性选项,它用于设定重新归档的时间间隔,默认值为300秒。但需要注意的是:REOPEN属性必须跟在MANDATORY选项后。

查看归档日志信息
查看归档日志信息主要有两种方法:一种是使用数据字典和动态性能视图;另一种是使用ARCHIVE LOG LIST命令,下面分别进行讲解。
(1)使用数据字典和动态性能视图
常用的各种包含归档信息的数据字典和动态性能视图
这里写图片描述
下面通过查询V$ARCHIVE_DEST动态性能视图来显示归档目标信息

SQL> select dest_name from  v$archive_dest;

这里写图片描述
(2)使用ARCHIVE LOG LIST命令
在SQL*Plus环境中,使用ARCHIVE LOG LIST命令可以显示当前数据库的归档信息
这里写图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值