oracle文件管理——日志文件(redo file)

参考文档:官方文档

一、什么是日志文件

恢复操作最关键的结构是重做日志,它由两个或多个预先分配的文件组成,这些文件存储发生时对数据库所做的所有更改。Oracle数据库的每个实例都有一个相关的重做日志,以在实例失败时保护数据库。

1.redo日志线程

在典型配置中,只有一个数据库实例访问Oracle数据库,因此只有一个线程。但是,在Oracle Real Application Clusters环境中,两个或多个实例同时访问单个数据库,每个实例都有自己的重做线程。每个实例都有一个单独的重做线程,避免了对一组重做日志文件的争用,从而消除了潜在的性能瓶颈。

2.redo日志文件内容

重做日志文件由重做记录填充。
重做记录(也称为重做条目)由一组更改向量组成,每个更改向量都是对数据库中单个块所做更改的描述。

重做记录以循环方式缓冲在SGA的重做日志缓冲区中,并由日志编写器(LGWR)数据库后台进程写入其中一个重做日志文件。无论何时提交事务,LGWR都会将事务重做记录从SGA的重做日志缓冲区写入重做日志文件,并分配系统更改号(SCN)来标识每个提交事务的重做记录。当与给定事务关联的所有重做记录都安全地保存在联机日志中的磁盘上(commit 完成)或使用commit write nowaits,用户进程才会被通知事务已提交。

在提交相应的事务之前,还可以将重做记录写入重做日志文件。**如果重做日志缓冲区已满,或另一个事务已提交,则LGWR会将重做日志缓冲区中的所有重做日志项刷新到重做日志文件中,即使某些重做记录可能未提交,这就是提交事务比回滚事务高效的原因。**如有必要,数据库可以回滚这些更改。

3.数据库写redo file的方式

数据库的重做日志由两个或多个重做日志文件组成。数据库至少需要两个文件,以确保在存档另一个文件时,其中一个文件始终可供写入(如果数据库处于ARCHIVELOG模式)。

LGWR以循环方式写入重做日志文件。当当前重做日志文件填满时,LGWR开始写入下一个可用的重做日志文件。当最后一个可用的重做日志文件被填充时,LGWR返回到第一个重做日志文件并写入其中,再次开始循环。如下图说明了重做日志文件的循环写入。每行旁边的数字表示LGWR写入每个重做日志文件的顺序。

根据是否启用存档,LGWR可以重用已填充的重做日志文件。
如果禁用存档(数据库处于NOARCHIVELOG模式),则在记录的更改写入数据文件后,可以使用已填充的重做日志文件。
如果启用存档(数据库处于ARCHIVELOG模式),则在记录的更改写入数据文件并存档文件后,LGWR可以使用已填充的重做日志文件。
在这里插入图片描述

二、日志文件规划
1.多组多成员架构

为了防止重做日志本身出现故障,Oracle数据库允许在不同的位置自动维护重做日志的两个或多个相同副本。
组:循环写日志的多个文件(group1 group2)
成员:日志文件副本(goup1 :a_log1 b_log1)
其中成员的大小必须相同
相关参数:
MAXLOGFILES:最大组数
MAXLOGMEMBERS:最大成员数
在控制文件可以查看和设置
在这里插入图片描述

2.日志文件大小

在设置重做日志文件的大小时,考虑是否将归档重做日志。重做日志文件的大小应使已填充的组可以归档到单个脱机存储介质(如磁带或磁盘)中,介质上未使用的空间最少。
重做日志文件允许的最小大小为4 MB。

3.日志文件数据块大小

与数据库块大小(可能介于2K和32K之间)不同,重做日志文件的默认块大小始终等于磁盘的物理扇区大小。历史上,这通常是512字节(512B)。

一些较新的高容量磁盘驱动器提供4K字节(4K)扇区大小,以提高ECC能力和格式效率。大多数Oracle数据库平台都能够检测到这种更大的扇区大小。然后,数据库会在这些磁盘上自动创建具有4K块大小的重做日志文件。

然而,当块大小为4K时,重做损耗会增加。事实上,4K块与512B块中的重做浪费量是相当大的。您可以通过查看存储在V$SESSTATV$SYSSTAT视图中的统计信息来确定重做浪费量。
查看当前日志文件数据块:

SQL> select group#,sequence#,blocksize,members from v$log;

    GROUP#  SEQUENCE#  BLOCKSIZE    MEMBERS
---------- ---------- ---------- ----------
	 1	   10	     512	  1
	 2	   11	     512	  1
	 3	   12	     512	  1

查看统计信息的重做浪费量

SYS@cdb1> select * from v$sysstat where name='redo wastage';

STATISTIC# NAME 								 CLASS	    VALUE    STAT_ID	 CON_ID
---------- ---------------------------------------------------------------- ---------- ---------- ---------- ----------
       263 redo wastage 							     2	   579664 3462806146	      0
4.归档模式设置归档延迟
alter system set archive_lag_target=1800 scope=both;
三、创建日志文件
1.创建文件组
SYS@cdb1> alter database add logfile group 4('/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log') size 50M blocksize 512;

Database altered.
2.添加成员

①通过组的成员

alter database add logfile member '/u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log' to ('/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log');

②通过组名

SYS@cdb1> alter database add logfile member '/u01/app/oracle/oradata/CDB1/onlinelog/logfile004b.log' to group 4;

Database altered.

SYS@cdb1> select group#,member from v$logfile;

    GROUP#
----------
MEMBER
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	 3
/u01/app/oracle/oradata/CDB1/onlinelog/o1_mf_3_jn456ll3_.log

	 2
/u01/app/oracle/oradata/CDB1/onlinelog/o1_mf_2_jn456lcm_.log

	 1
/u01/app/oracle/oradata/CDB1/onlinelog/o1_mf_1_jn456l4g_.log

	 4
/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log

	 4
/u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log

	 4
/u01/app/oracle/oradata/CDB1/onlinelog/logfile004b.log

四、移动、重命名日志文件
1.关闭数据库
SYS@cdb1> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
2.装载数据库
SYS@cdb1> startup mount
ORACLE instance started.
3.移动日志文件
mv /u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log  /home/oracle/logtest/logfile004a_new.log
4.重命名日志文件
SYS@cdb1> alter database rename file '/u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log' to '/home/oracle/logtest/logfile004a_new.log';

Database altered.
5.打开数据库
SYS@cdb1> alter database open;

Database altered.
6.验证

在这里插入图片描述

五、删除日志文件

删除日志文件前提:
①一个实例至少需要两组重做日志文件,而不考虑组中的成员数。

②只有当重做日志组处于非活动状态时,才能删除它。如果必须删除当前组,则首先强制进行日志切换。

③在删除重做日志组之前,请确保该组已存档(如果已启用存档)。
查看日志文件状态:

SYS@cdb1> alter system switch logfile;

System altered.

SYS@cdb1> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE	  MEMBERS ARC STATUS	       FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME	  CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
	 1	    1	      13   52428800	   512		1 YES INACTIVE		     1929776 20-SEP-21	    1931454 20-SEP-21	       0
	 2	    1	      15   52428800	   512		1 NO  CURRENT		     1932220 20-SEP-21	 2.8147E+14		       0
	 3	    1	      12   52428800	   512		1 YES INACTIVE		     1911556 18-SEP-21	    1929776 20-SEP-21	       0
	 4	    1	      14   52428800	   512		3 YES ACTIVE		     1931454 20-SEP-21	    1932220 20-SEP-21	       0

1.删除成员
SYS@cdb1> alter database drop logfile member '/home/oracle/logtest/logfile004a_new.log';

Database altered.

SYS@cdb1> select group#,member from v$logfile;

    GROUP#
----------
MEMBER
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	 3
/u01/app/oracle/oradata/CDB1/onlinelog/o1_mf_3_jn456ll3_.log

	 2
/u01/app/oracle/oradata/CDB1/onlinelog/o1_mf_2_jn456lcm_.log

	 1
/u01/app/oracle/oradata/CDB1/onlinelog/o1_mf_1_jn456l4g_.log

	 4
/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log

	 4
/u01/app/oracle/oradata/CDB1/onlinelog/logfile004b.log

2.删除组
SYS@cdb1> alter database drop logfile group 4;

Database altered.

SYS@cdb1> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE	  MEMBERS ARC STATUS	       FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME	  CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
	 1	    1	      13   52428800	   512		1 YES INACTIVE		     1929776 20-SEP-21	    1931454 20-SEP-21	       0
	 2	    1	      15   52428800	   512		1 NO  CURRENT		     1932220 20-SEP-21	 2.8147E+14		       0
	 3	    1	      12   52428800	   512		1 YES INACTIVE		     1911556 18-SEP-21	    1929776 20-SEP-21	       0

六、控制检查点
1.强制产生检查点

产生条件:
①常关闭数据库
②手动检查点切换
③日志切换
④数据库热备模式

shutdown immediate
alter system switch logfile;
alter system checkpoint;
alter database begin backup; 
2.数据块

参数:LOG_CHECKPOINT_INTERVAL
当LGWR进程向日志文件写入数据块(日志文件数据块)达到参数值时。

3.超时

参数:LOG_CHECKPOINT_TIMEOUT
与archive_lag_target效果一致,如果值为0,表示日志切换与时间无关

七、清除日志文件

当数据库打开时,重做日志文件可能会损坏,并最终停止数据库活动,因为存档无法继续。
在这种情况下,要在不关闭数据库的情况下重新初始化文件,请执行以下操作:

alter database clear logfile group 4;
八、强制日志记录设置的优先级

在这里插入图片描述

九、相关视图
--显示控制文件中的重做日志文件信息
v$log
--标识重做日志组和成员以及成员状态
v$logfile
--包含日志历史记录信息
v$log_history
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值