ORACLE——重做日志文件管理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

联机重做日志文件概念

联机日志文件又叫重做日志文件,记录了对数 据库修改的信息,包括用户对数据修改和数据库管理员对数据库结构的修改。它主要用于在发生故障的时候和数据库备份文件配合恢复数据库,一般发生故障有2个 情况:一个是介质损坏另外一个是用户误操作。每个数据库至少有两个日志文件组,每组至少包含1个或者多个日志成员,这里要多个日志成员的原因是防止日志文 件组内某个日志文件损坏后及时提供备份,所以同一组的日志成员一般内容信息相同,但是存放位置不同。

在Oracle数据库中,执行数据修改操作 后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大, 事实上它非常小,一般设置在3~5MB左右。LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程将LOG_BUFFER中的内容写入 一个特定类型的文件,就是传说中的联机重做日志文件。

联机重做日志文件是循环使用的(见下图)。 当第一个日志文件达到一定数量时,就会停止写入,而转向第二个日志文件,第二个满转向第三个日志文件.第三个满就向第一个日志文件写入.而第一个日志文件 有没有自动备份就涉及到归档或者不归档的问题.当数据库自动对原来的日志文件进行备份的话就叫归档模式,不需要对数据库进行自动备份就叫非归档模式.

clip_image002

那么什么情况触发LGWR进程写日志文件呢?以下情况将触发LGWR进程写操作:

1).当commit事务发生

2).当redo log buffer存储达到1/3

3).当重做日志缓冲区有超过一个兆字节的更改记录

4).在DBWN将buffer cache修改过的数据块的信息写入到数据文件之前

触发CHECK POINT事件的情况:

1).每次日志切换时。

2).实例通过normal,transactional,immediate选项关闭时

3).通过设置初始化参数FAST_START_MTTR_TARGET强制发生

4) .数据库管理员手工设置ALTER SYSTEM CHECKPOINT、 ALTER TABLESPACE, DATAFILE OFFLINE时。

5).使用alter tablespace[OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 语句导致指定数据文件发生检查点

非归档模式只能做冷备份,归档模式可以做热备份并且可以做增量备份和部分恢复.

在非归档模式下执行数据库备份时,基本上数据管理员通过重做日志文件不能够恢复全部的数据,所以必须备份所有的数据文件和控制文件,而且必须使用 shutdown normal等命令关闭数据库.

而在归档模式下.当出现介质损坏(硬盘损坏或者误删数据文件)或者例程失败(服务 器断电),数据库管理员可以通过归档日志来防止数据丢失,而非归档模式只能应对instance失败.在归档模式下,数据库处于open状态,仍然可以备 份数据库,而不影响数据库的正常使用.不仅可以做完全恢复而且可以将数据库恢复到特定的点.

非归档模式和归档模式各有各的优点,选择时可以参考:1,数据库中数据变化的频繁程度;2,企业对数据丢失的态度;3,数据库是否需要7x24运行,因为非归档模式需要关闭数据库才能进行备份.

查看归档模式

ORACLE数据库拥有2种归档模式,ARCHIVELOG和NOARCHIVELOG。可以通过下面方式查看数据库的归档模式

 

(1): SELECT NAME, LOG_MODE FROM V$DATABASE

(2):

SQL> archive log list

数据库日志模式 存档模式

自动存档 启用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 106

下一个存档日志序列 108

当前日志序列 108

SQL> archive log list

Database log mode No Archive Mode

Automatic archival Disabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 2861

Current log sequence 2866

 

 

日志模式切换

 

非归档模式切换归档模式1、关闭服务:

SQL> SHUTDOWN IMMEDIATE;

2、不加载数据文件(只加载控制文件和日志文件)启动服务:

SQL> STARTUP MOUNT;

3、查看日志归档模式:

SQL> ARCHIVE LOG LIST

数据库日志模式 非存档模式

自动存档 禁用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 163

当前日志序列 165

4、配置数据库启用日志归档模式

SQL> ALTER DATABASE ARCHIVELOG;

数据库已更改。

5、加载并打开数据文件:

SQL> ALTER DATABASE OPEN;

数据库已更改。

6、再次查看日志归档模式

SQL> ARCHIVE LOG LIST

数据库日志模式 存档模式

自动存档 启用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 163

下一个存档日志序列 165

当前日志序列 165

SQL> ARCHIVE LOG START

已处理的语句

7:修改参数LOG_ARCHIVE_START

SQL> ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;

系统已更改。

归档模式切换到非归档模式

1、关闭服务

SQL> SHUTDOWN IMMEDIATE;

2、启动服务(不加载数据文件)

SQL> STARTUP MOUNT;

3、设置数据库为非归档模式

SQL> ALTER DATABASE NOARCHIVELOG;

数据库已更改。

4、加载并打开数据文件

SQL> ALTER DATABASE OPEN;

数据库已更改。

日志切换和检查点切换

 

SQL>ALTER SYSTEM SWITCH LOGFILE;

 

日志切换就是停止写当前日志组,转而写另外 一个新的日志组、系统可以自动切换,也可以手工切换。当发生SWITCH LOGIFLE时,系统会在后台完成CHECKPOINT的操作。CHECKPOINT是一个事件,它用于减少instant recovery的时间.当CHECKPOINT发生时,它会触发DBWR进程,把database buffer中变化了的数据写入数据文件,同时chkp进程更新control file和datafile header,以使它们保持一致。检查点其实是一个后台进程,用来保证所有修改过的数据库缓冲区的东西都写入数据库文件。它由参数 LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL来决定。检查点完成后,系统将更新数据库头和控制文件, 也保证数据库的同步。这里主要体现在一个系统改变号上SCN(也叫检查点号)。它分别出现在v$log表的FIRST_CHANGE#列和 V$DATAFILE的CHECKPOINT_CHANGE#列还有V$DATABASE的CHECKPOINT_CHANGE#上。 只要说明三个值相同,那么数据库就没有不同步的现象。否则就要进行介质恢复。这里可以通过日志切换改变新的检验点号。当然引起SCN改变的情况还有很多。

 

SQL>ALTER SYSTEM CHECKPOINT;

 

强制设置检查点间隔

 

ALTER SYSTEM SET FAST_START_MTTR_TARGET = n

 

 

联机日志文件的规划

联机日志文件的规划原则如下:

1:分散放开,多路复用。一般会将同一组的不同日志成员文件放到不同的磁盘或不同的裸设备上。以提高安全性。

2:把重做日志放在速度最快的硬盘上(即:日志所在的磁盘应当具有较高的I/O),一般会将日志文件放在裸设备上。

3:把重做日志文件设为合理大小:例如,增 大日志文件大小可以加快一些大型的INSERT、UPDATE、DELETE操作,也能降低日志文件切换频率。减少一些日志等待事件。一般根据具体业务情 况有所不同。一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求

4:ORACLE推荐,同一个重做日值组下的所有重做日志文件大小、成员个数一致.

联机重做日志状态

日志文件组的状态一般有INACTIVE、ACTIVE、CURRENT、UNUSED、CLEARING、CLEARING_CURRNT等六种状态:

SQL> SELECT STATUS FROM V$LOG;

UNUSED : 表示该联机重做日志文件组对应的文件还从未被写入过数据,通常刚刚创建的联机重做日志文件组会显示成这一状态。当日志切换到这一组时,就会改变状态。

CURRENT : 表示当前正在使用的日志文件组。该联机重做日志组是活动的。当前Oracle数据库正在使用的联机重做日志文件组。

ACTIVE : 表示该组是活动的但不是当前组,实例恢复时需要这组日志。如果处于这一状态,表示虽然当前并未使用,不过该文件中内容尚未归档,或者文件中的数据没有全部写入数据文件,一旦需要实例恢复,必须借助该文件中保存的内容。

INACTIVE: 表示实例恢复已不再需要这组联机重做日志组了。表示对应的联机重做日志文件中的内容已被妥善处理,该组联机重做日志当前处于空闲状态。

CLEARING:表示该组重做日志文件正被重建(重建后该状态会变成UNUSED)。

CLEARING_CURRENT:表示该组重做日志重建时出现错误。

日志文件的状态有STALE,INVALID 、DELETED、空白 四种状态。可以通过下面语句查看

SELECT STATUS FROM V$LOGFILE

INVALID : 表示该文件是不可以被访问的。

STALE : 表示该文件中的内容是不完全的。

空白 : 表示该文件正在使用。

DELETED : 表示该文件已不再有用了。

ARCHIVED列值为YES表示已经归档,NO表示未归档。 SEQUENCE列值表示日志序列号,每进行一次日志切换就+1。

创建新的日志组

ALTER DATABASE ADD LOGFILE GROUP 1('/oradata/redo01_1.log', '/oradata/redo01_2.log') SIZE 8G REUSE;

 

一开始增加的日志文件,日志序列为0,状态为UNUSED,因为没有使用过,进行切换后,就可以正常使用了。

 

删除旧的日志组

ALTER DATABASE DROP LOGFILE GROUP 1;

注意事项:

1)执行删除日志组命令后,其实只是在数据字典中删掉了对于日志信息。你查看对应的日志文件,你会发现日志文件还在,只有手动删除日志文件,才能真正的删除日志文件。

2)不能删除仅有的2个文件组;

例如,数据库只有两组重做日志文件,删除其中一组ALTER DATABASE DROP LOGFILE GROUP 2;

ORA-01567: 删除日志 2 时将为实例 orcl (线程 1) 保留两个以下的日志文件

ORA-00312: 联机日志 2 线程 1: 'E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG'

clip_image004

3)不能删除正在活动的文件组(即CURRENT、ACTIVE状态的日志文件);

Windows平台:

clip_image006

Linux平台:

 

SQL> alter database drop logfile group 10;

ERROR at line 1:
ORA-01623: log 10 is current log for instance WFCSDB03 (thread 1) - cannot drop
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_1.raw'
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_2.raw'

clip_image008



SQL> alter system switch logfile;    

System altered.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1        265 1.0733E+10          2 NO  INACTIVE              54310652 08-AUG-12
         1        263 4194304000          2 NO  INACTIVE              54310551 08-AUG-12
         1        264 4194304000          2 NO  INACTIVE              54310641 08-AUG-12
         1        266 4194304000          2 NO  INACTIVE              54310659 08-AUG-12
         1        267 4194304000          2 NO  ACTIVE                54310666 08-AUG-12
         1        268 4194304000          2 NO  CURRENT               56534648 09-AUG-12
         1        262 4194304000          2 NO  INACTIVE              54310376 08-AUG-12
rows selected.

SQL> alter database drop logfile group 10;
alter database drop logfile group 10
*
ERROR at line 1:
ORA-01624: log 10 needed for crash recovery of instance WFCSDB03 (thread 1)
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_1.raw'
ORA-00312: online log 10 thread 1: '/oradata/raw/redo04_2.raw'

 

clip_image010

4)不能删除当前组的成员,当日志组只有一个成员时,不能删除日志组成员。

5)不能删除还没有归档的文件组。

增加日志组文件

ALTER DATABASE ADD LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG' TO GROUP 1

删除日志组文件

不能删除日志组中唯一的日志文件,可以使用删除组的方法直接删除组;不能删除没有归档或者还在活动的日志;

ALTER DATABASE DROP LOGFILE MEMBER 'E:\APP\KERRY\ORADATA\ORCL\REDO011.LOG'

重命名日志组文件

 

ALTER DATABASE RENAME FILE 'E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG' TO 'D:\REDO02.LOG';

注意2点:

一不能移动正在使用的日志文件,否则执行脚本会报如下错误:

clip_image012

二确保执行命令前把目标文件已经移动到新目录下了,否则会报如下错误:

ORA-01511:重命名日志/数据文件时出错

ORA-01512:重命名日志文件E:\APP\KERRY\ORADATA\ORCL\REDO02.LOG出错,未找到新文件D:\REDO02.LOG

ORA-27041: 无法打开文件。

 
 

清空日志文件数据

清空是说删除日志文件的内容。主要用于数据库无法进行有效恢复的时候。比如标识为current的日志文件组所有文件都坏了等。只有非active 和非current状态的组才能被清空

ALTER DATABASE CLEAR LOGFILE 'XXX\XXX\XX.LOG';

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP NUMBER;

查询日志组相关信息

 

下面是重做日志相关的数据字典

 

SELECT * FROM V$LOG;

SELECT * FROM V$LOGFILE;

SELECT * FROM V$ARCHIVED_LOG;

SELECT * FROM V$RECOVER_FILE

SELECT * FROM V$LOG_HISTORY;

SELECT * FROM V$LOGHIST;

--查看闪回日志使用状况

 

SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

 

--查看日志组切换时间间隔

复制代码
SELECT N.RECID                               AS RECID         ,
       N.FIRST_TIME                          AS FIRST_TIME    ,
       M.FIRST_TIME                          AS END_TIME      ,
       ROUND((M.FIRST_TIME - N.FIRST_TIME) * 24 * 60, 2)AS MINUTES
  FROM V$LOG_HISTORY M, V$LOG_HISTORY N
 WHERE M.RECID = N.RECID + 1
 ORDER BY M.RECID

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
1月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
4月前
|
SQL Oracle 关系型数据库
"揭秘!一键解锁Oracle日志清理魔法,让海量归档日志无处遁形,守护数据库健康,告别磁盘空间告急噩梦!"
【8月更文挑战第9天】随着Oracle数据库在企业应用中的普及,归档日志管理对保持数据库健康至关重要。归档日志记录所有更改,对数据恢复极为重要,但也可能迅速占用大量磁盘空间影响性能。利用Oracle提供的RMAN工具,可通过编写Shell脚本来自动清理归档日志。脚本包括设置环境变量、连接数据库、检查和删除指定时间前的日志,并记录执行情况。通过Cron作业定时运行脚本,可有效管理日志文件,确保数据库稳定运行。
118 7
|
4月前
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
64 0
|
5月前
|
存储 SQL Oracle
关系型数据库Oracle归档日志备份
【7月更文挑战第19天】
76 5
|
5月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在online模式下增量抓取Oracle数据时,在archive_log切换时,出现数据丢失的情况,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL Oracle 关系型数据库
探索 Linux 命令 `db_archive`:Oracle 数据库归档日志的工具
探索 Linux 中的 `db_archive`,实际与 Oracle 数据库归档日志管理相关。在 Oracle 中,归档日志用于恢复,当在线重做日志满时自动归档。管理员可使用 SQL*Plus 查看归档模式,通过 `RMAN` 进行备份和恢复操作。管理归档日志需谨慎,避免数据丢失。了解归档管理对 Oracle 管理员至关重要,确保故障时能快速恢复数据库。
|
6月前
|
SQL DataWorks Oracle
DataWorks产品使用合集之datax解析oracle增量log日志该如何操作
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
62 0

推荐镜像

更多