Oracle 的 Redo log 日志

Oracle的数据库日志称为 redo log, 所有数据改变都记录redo log,可以用于修复受损的数据库,Redo 日志是分组的,默认是3组,
Redo日志是轮流使用的,一个redo log满了,LGWR会切换到下一组redo log,这种操作称为 log switch,做log switch的同时也会做check point ,相应的信息还会写入控制文件。

 

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

 

Redo Log 特征
记录数据库的变化(DML、DDL)
用于数据块的 recovery
以组的方式管理 redo file ,最少两组 redo ,循环使用
和数据文件存放到不同的磁盘上,需读写速度快的磁盘(否则会成为瓶颈)
日志恢复不会用到 INACTIVE 的信息,会用到 CURRENT 的信息,若有处于 ACTIVE 的日志,也会用到ACTIVE的信息。

日志切换
 

 

 

 

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$SESSTAT和V$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
1
2
3
4
5
6
7
查看统计信息的重做浪费量

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
1
2
3
4
5
4.归档模式设置归档延迟
alter system set archive_lag_target=1800 scope=both;
1
三、创建日志文件
1.创建文件组
SYS@cdb1> alter database add logfile group 4('/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log') size 50M blocksize 512;

Database altered.
1
2
3
2.添加成员
①通过组的成员

alter database add logfile member '/u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log' to ('/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log');
1
②通过组名

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
四、移动、重命名日志文件
1.关闭数据库
SYS@cdb1> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
1
2
3
4
2.装载数据库
SYS@cdb1> startup mount
ORACLE instance started.
1
2
3.移动日志文件
mv /u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log /home/oracle/logtest/logfile004a_new.log
1
4.重命名日志文件
SYS@cdb1> alter database rename file '/u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log' to '/home/oracle/logtest/logfile004a_new.log';

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

Database altered.
1
2
3
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
2
3
4
5
6
7
8
9
10
11
12
13
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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
2
3
4
5
6
7
8
9
10
11
12
六、控制检查点
1.强制产生检查点
产生条件:
①常关闭数据库
②手动检查点切换
③日志切换
④数据库热备模式

shutdown immediate
alter system switch logfile;
alter system checkpoint;
alter database begin backup;
1
2
3
4
2.数据块
参数:LOG_CHECKPOINT_INTERVAL
当LGWR进程向日志文件写入数据块(日志文件数据块)达到参数值时。

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

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

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


九、相关视图
--显示控制文件中的重做日志文件信息
v$log
--标识重做日志组和成员以及成员状态
v$logfile
--包含日志历史记录信息
v$log_history
1
2
3
4
5
6
 参考:oracle文件管理——日志文件(redo file)

 参考: Oracle 重做日志(Redo Log)详解

posted @ 2022-11-16 14:48  aspirant  阅读(3677)  评论(0编辑  收藏  举报