首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Oracle 19C入门到精通之管理重做日志文件

重做日志文件(redo log file)通常也被称为日志文件,它是保证数据库安全和数据库备份/恢复的基本保障。管理员可以根据日志文件和数据库备份文件,将崩溃的数据库恢复到最近一次记录日志时的状态。在日常工作中,数据库管理员维护重做日志文件也是十分必要的。

1. 重做日志文件概述

重做日志文件用于记载事务操作所引起的数据变化,当执行DDL或DML操作时,由LGWR进程将缓冲区中与该事务相关的重做记录全部写入重做日志文件。当丢失或损坏数据库中的数据时,Oracle会根据重做日志文件中的记录恢复丢失的数据。

1.1. 日志文件的内容及数据的恢复

重做日志文件由重做记录组成,重做记录又被称为重做条目,它由一组变更向量组成。每个变更向量都记录了数据库中某个数据块所做的修改。例如,用户执行了一条UPDATE语句对某张表的一条记录进行修改,同时生成一条重做记录。这条重做记录可能由多个变更向量组成,在这些变更向量中记录了所有被这条语句修改过的数据块中的信息,被修改的数据块包括表中存储这条记录的数据块,以及回滚段中存储的相应回滚条目的数据块。如果由于某种原因导致这条UPDATE语句执行失败,这时事务就可以先通过与这条UPDATE语句对应的重做记录找到被修改之前的结果,然后将其复制到各个数据块中,从而完成对数据的恢复。

利用重做记录不仅能够恢复对数据文件所做的修改操作,还能够恢复对回退段所做的修改操作。因此,重做日志文件不仅可以保护数据,还能够保护回退段数据。在进行数据库的恢复时,Oracle会先读取每个变更向量,然后将其中记录的修改信息重新应用到相应的数据块上。

重做记录将以循环方式在SGA区的重做日志高速缓冲区中进行缓存,并且由后台进程LGWR写入重做日志文件中。当一个事务被提交时,LGWR进程将与该事务相关的所有重做记录全部写入重做日志文件组中,同时生成一个“系统变更码”(SCN)。系统变更码会随着重做记录一起保存到重做日志文件组中,以标识与重做记录相关的事务。只有当某个事务所产生的重做记录全部被写入重做日志文件后,Oracle才会认为该事务提交成功。

1.2. 写入重做日志文件

在Oracle中,用户对数据库所做的修改首先被保存在内存中,这样可以提高数据库的性能,因为对内存中的数据进行操作要比对磁盘中的数据进行操作快得多。Oracle每隔一段时间(日志信息存储超过3 s)或满足特定条件(当发生提交命令或者重做日志缓冲区的信息满1/3)时,就会启动LGWR进程将内存中的重做日志记录保存到重做日志文件中。因此,即使发生故障导致数据库崩溃,Oracle也可以利用重做日志文件来恢复丢失的数据。

在创建Oracle数据库的过程中,默认创建3个重做日志文件组,每个日志文件组中包含两个日志文件成员,并且每个日志文件组都有内部序号,Oracle按照序号从小到大的顺序向日志文件组中写入日志信息。当一个重做日志文件组被写满后,后台进程LGWR将开始向下一个重做日志文件组中写入日志信息;当LGWR进程将所有的重做日志文件都写满后,它将再次转向第一个日志文件组进行重新覆盖。当前正在被LGWR进程写入日志记录的某组重做日志文件被称为“联机重做日志文件”(online redo log file),下图显示了重做日志文件的循环写入方式。

如上图所示的所有日志文件组中,正在被LGWR进程写入的重做日志文件处于“当前状态”(CURRENT),正在被实例用于数据库恢复的重做日志文件处于“活动状态”(ACTIVE),其他的重做日志文件处于“未活动状态”(INACTIVE),用户通过查询数据字典视图v$logfile可以获取重做日志文件的状态。

2. 增加日志组及其成员

在一个Oracle数据库中,至少需要两个重做日志文件组,每个组可以包含一个或多个重做日志成员。通常情况下,数据库管理员会在创建数据库时按照事先计划创建所需要的重做日志文件组和各个组中的日志文件。在一些特殊情况下(例如发现LGWR进程经常处于等待状态),Oracle就需要通过手动方式向数据库中添加新的重做日志组或成员,或者改变重做日志文件的名称与位置,以及删除重作日志组或成员。另外,需要注意的是,对于重做日志文件的日常维护工作,用户需要具有ALTER DATABASE系统权限。

2.1. 添加新的重做日志文件组

在Oracle数据库的日常管理中,为了防止后台进程LGWR等待向重做日志文件组中写入日志信息,数据库管理员必须选择合适的日志组个数。增加重做日志文件组可以使用ALTER DATABASE ADD LOGFILE语句。

在system模式下,向数据库中添加一个新的重做日志文件组,代码如下:

alter database add logfile ('/opt/oracle/oradata/ORCLCDB/REDO4_A.LOG', '/opt/oracle/oradata/ORCLCDB/REDO4_B.LOG') size 20M;

上述代码新增的重做日志组中有两个日志成员,大小均为20MB;通常情况下,重做日志文件的大小最好为10~50 MB,Oracle默认的日志文件大小是50 MB。上面的列子并没有为新创建的重做日志组指定组编号,这种情况下,Oracle会自动为新建的重做日志组设置编号,一般是在当前最大组号之后递增。

如果需要为新创建的重做日志组指定编号,则需要在ALTER DATABASE ADD LOGFILE语句后添加GROUP关键字。

向数据库中添加一个新的重做日志文件组,并指定组编号为5,代码如下:

alter database add logfile group 5 ('/opt/oracle/oradata/ORCLCDB/REDO5_A.LOG', '/opt/oracle/oradata/ORCLCDB/REDO5_B.LOG') size 20M;

--查询数据字典视图v$logfile获取重做日志文件的状态

select * from v$logfile;

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

2.2. 创建日志成员文件

如果某个日志组中的所有日志成员都被损坏了,那么当后台进程LGWR切换到该日志组时,Oracle会停止工作,并对该数据库执行不完全恢复,为此数据库管理员需要向该日志组中添加一个或多个日志成员。为重做日志组添加新的成员,需要使用ALTER DATABASE ADD LOG MEMBER语句。

为第4个重做日志文件组添加一个新的日志文件成员,代码及其运行结果如下:

alter database add logfile member '/opt/oracle/oradata/ORCLCDB/REDO4_C.LOG' to group 4;

3. 删除重做日志文件

在某些情况下,数据库管理员可能需要删除重做日志的某个完整的组,或减少某个日志组中的成员。例如,存储某个日志文件的磁盘被损坏,就需要删除该损坏磁盘的日志文件,以防止Oracle将重做记录写入不可访问的文件中。删除重做日志需要使用ALTER DATABASE语句,执行该语句要求用户具有ALTER DATABASE系统权限。

3.1. 删除日志成员

要删除一个日志成员文件,可以使用ALTER DATABASE DROP LOGFILE MEMBER语句。

在system模式下,删除“/opt/oracle/oradata/ORCLCDB/REDO4_C.LOG”重做日志文件,代码如下:

alter database drop logfile member '/opt/oracle/oradata/ORCLCDB/REDO4_C.LOG';

说明:上述语句只是在数据字典和控制文件中将重做日志文件成员删除,而对应的物理文件并没有删除,若要删除,可以采取手动删除的方式。

3.2. 删除日志文件组

果某个日志文件组不再使用,可以将整个日志组删除;或者当日志组大小不合适时,由于已经存在的日志组的大小不能被改变,就需要重新建立日志组,在重新建立日志组之前,就需要删除大小不合适的原日志组。当删除一个日志组时,其中的成员文件也将被删除。在删除日志组时,必须要注意以下几点:

无论日志组中有多少个成员,一个数据库至少需要两个日志组,删除时不能超过此限制。

只能删除处于INACTIVE状态的日志组。如果要删除处于CURRENT状态的重做日志组,必须执行一个手动切换日志,将它切换到INACTIVE状

如果数据库处于归档模式,则在删除重做日志组之前必须确定它已经被归档。

注意:可以通过查询v$log数据字典视图来查看重做日志文件组的状态以及它们是否已经被归档。

若要删除一个重做日志组,需要使用ALTER DATABASE DROP LOGFILE语句。

删除数据库中编号为5的日志组,代码如下:

alter database drop logfile group 5;

与删除指定的日志文件相同,删除日志文件组也只是在数据字典和控制文件中将日志文件组的信息删除,而对应的物理文件并没有被删除,若要删除,可以采取手动删除的方式。

3.3. 清空重做日志文件

清空重做日志文件实际上就是将日志文件中的内容清空,这相当于删除原有的日志文件,重新创建新的日志文件。即使数据库只有两个重做日志文件组,甚至要清空的重做日志组处于CURRENT状态,也都可以成功执行清空操作。

清空日志文件,需要使用ALTER DATABASE CLEAR LOGFILE语句。

清空数据库中编号为4的日志组中所有日志文件的内容,代码如下:

alter database clear logfile group 4;

注意:如果要清空的重做日志文件组尚未被归档,则必须再使用ALTER DATABASE CLEAR UNARCHIVED LOGFILE语句。

4. 更改重做日志文件的位置或名称

在重做日志文件被创建后,有时候可能需要改变它们的名称或位置。具体步骤如下:

关闭数据库,代码如下:

SQL>shutdown

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

手动复制源文件到目标位置,甚至可以对复制后的文件进行重命名。

再次启动数据库实例,加载数据库,但不打开数据库,代码如下:

SQL> startup mount;

ORACLE 例程已经启动。

使用ALTER DATABASE RENAME FILE语句重新设置重做日志文件的路径及其名称,代码如下:

SQL> alter database rename file

2 '/opt/oracle/oradata/LogFiles/REDO5.LOG',

3 '/opt/oracle/oradata/LogFiles/REDO4.LOG'

4 to

5 '/opt/oracle/oradata/LogFiles/REDO5a.LOG',

6 '/opt/oracle/oradata/LogFiles/REDO4a.LOG';

数据库已更改。

在上述代码中,关键字to上面的两行代码描述源日志文件的路径及其名称,下面的两行代码描述目标日志文件的路径及其名称。

打开数据库,代码如下:

SQL> alter database open;

数据库已更改。

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

5. 查看重做日志信息

对于数据库管理员而言,经常查看日志文件是其一项重要的工作,以便及时了解数据库的运行情况。要了解Oracle数据库的日志文件信息,可以查看如下表所示的3个常用数据字典视图及其说明。

在SQL* Plus环境中,使用DESC命令显示v$log数据字典视图的结构,运行结果如下图所示:

上图中,部分内容解释:

GROUP#:日志文件组编号。

SEQUENCE#:日志序列号。

STATUS:日志组的状态,有3种,分别是CURRENT、INACTIVE和ACTIVE。

FIRST_CHANGE#:重做日志组上一次被写入时的系统变更码(SCN),也被称作检查点号。在使用日志文件对数据库进行恢复时,将会用到SCN。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Oz-bZXlhBAUhMT-lOyQPWXPQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券