oracle 重做日志文件和归档日志
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
检查点可发生在下面情况中: • 每次日志切换时 • 当使用NORMAL、TRANSACTIONAL、IMMEDIATE 选项关闭例程时 • 通过设置初始化参数FAST_START_MTTR_TARGET 强制执行时 • 数据库管理员通过手动方式请求时 • ALTER TABLESPACE [OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 命令导致对特定数据文件执 行检查点操作时。
• 如果数据文件、控制文件、重做日志的当前SCN 值完全 一致,则系统会直接打开所有数据文件和重做日志。 • 如果控制文件和数据文件的当前SCN 值完全一致匹配, 并小于重做日志的当前SCN,则需要进行实例恢复(例如 执行SUHTDOWN ABORT 后)。 • 如果控制文件和数据文件的当前SCN 值不匹配,则表 示数据文件或控制文件存在损坏,此时就需要进行介质 恢复,以恢复损坏的物理文件。 2)当后台进程CKPT 工作时,同时会促使后台进程DBWn 开始工作,并且将数据库高速缓存中的脏缓冲区(Dirty Buffer )写入到数据文件中。
属于同一日志组的每个日志文件被称为日志成员 ,并且同一个日志组的不同日志成员互为镜像, 即组内的每个成员都有相同的日志序列号和同样 的大小。Oracle 服务器每次写入日志组时,都分 配一个日志序列号以唯一地标识每个重做日志文 件。当前日志序列号存储在控制文件和所有数据 文件的头部。在Oracle 数据库中,多个重做日志 组是循环使用的,如图7—1 所示。
日志切换和检查点操作是在数据库运行中的某些特定点 自动执行的,但DBA 可以强制执行日志切换或检查点操 作。强制执行检查点有两种方式: 1)设置FAST_START_MTTR_TARGET
第7周 重做日志和归档日志
杨进 goodskyfly@163.com
【学习目标】
介绍Oracle 数据库重做日志文件和归档日志 文件的结构、工作过程以及如何管理重做 日志和归档日志。 重做日志文件是用于数据库故障恢复的文 件,也是Oracle 数据库3 类重要的物理文件之 一。
【本章要点】
• 重做日志的结构和用途 • 日志切换和检查点的概念 • 复用重做日志文件 • 获取重做日志文件的信息
1.3.1.生成检查点 检查点(Checkpoint)是一个数据库事件,它用于同步所有 数据文件、控制文件以及重做日志文件。当后台进程 CKPT 发出检查点时,会执行以下两个任务: 1)后台进程CKPT 会修改控制文件和数据文件头部,并 将当前SCN 信息写入到这两种文件中,从而使得数据文 件、控制文件和重做日志处于一致状态,这就是为何在 执行了SHUTDOWN NORMAL、SHUTDOWN TRANSACTIONAL 和SHUTDOWN IMMEDIATE 之后不需要实 例恢复(执行这些操作会发出检查点),而执行了 SHUTDOWN ABORT(不强制发出检查点)之后需要进行 实例恢复的原因。当启动Oracle 服务器时,后台进程 SMON 总是会检查控制文件、数据文件以及重做日志的 一致性:
在Oracle 当中,事务对数据库所做的修改将以重做记 录的形式保存重做日志缓存中。 在提交事务时,由 LGWR 进程将缓存中该事务相关的重做记录全部写入重做 日志文件,这时,事务认为已经成功提交。这种机制称 为“快速提交”。
【本章大纲】
1.1 重做日志结构 重做日志文件具有以下特征: • 记录对数据所做的所有更改 • 提供恢复机制 • 可以划分成组 • 至少需要两个组 那么什么是日志组呢(Redo Log Group)? 重做日志组是一组相同的重做日志文件副本,LGWR 后台 进程向组内所有联机重做日志文件并发写入相同信息, 为保证数据库的正常操作,Oracle 服务器最少需要两个 联机重做日志文件组。
重做日志文件是以循环方式使用的。每个重做日志文件 组用一个递增日志序列号来标识,每次重新使用日志时 就会覆盖原来的序列号。
LGWR 按顺序向联机重做日志组写入重做信息。一旦当 前联机重做日志组被写满,LGWR 就开始写入下一个组。 这称为日志切换(Log Switch)。 当最后一个可用联机 重做日志文件已满时,LGWR 将返回第一个联机重做日志 文件组并开始重新写入。 假定数据库有三个重做日志组,第一个日志组为当前 日志组,当前日志序列号为56,LGWR 进程将事务变化 写入第一个重做日志组中,当第一个日志组写满后, LGWR 进程自动切换到第二个日志组,在进行日志切换 时,Oracle 服务器完成如下任务: • 日志序列号自动加1,即当前日志序列号变为57,并 且将日志序列号连同SCN 信息写入到控制文件的日志历 史记录中。
【本章大纲】
1.2 日志序列号和日志切换 Oracle 服务器将对数据库所做的所有更改按顺序记录到 重做日志缓冲区中。LGWR 进程把重做条目从重做日志缓 冲区写入联机重做日志组的其中一个组,这个组叫做当 前重做日志组。LGWR 进程将在以下情况下写入: • 当提交事务处理时(Commit) • 当重做日志缓冲区被写满三分之一时 • 当重做日志缓冲区内的已更改记录超过1MB 时 • 每隔3 秒 • 在DBWn 将数据库缓冲区高速缓存中修改的块写入数据 文件之前
•促使CKPT 进程发出检查点,从而使得后台进程 CKPT 将检查点时刻的SCN 信息写入到控制文件和 数据文件头部,并促使后台进程DBWR 将数据高 速缓存中的脏缓冲区写入到数据文件中。 • 当数据库处于ARCHIVELOG 模式时,日志切换还 会促使ARCH 进程开始归档。 当日志组写满之后Oracle Server 会自动进行日志 切换;另外,在一些特定情况DBA 还可以强制系 统进行日志切换,这要求用户必须具有ALTER SYSTEM 系统权限。
【本章大纲】
1.3 检查点 在介绍检查点之前,首先回顾一下实例恢复。 假定当前日志序列号为56,先前检查点时的SCN 值为 3456231,并且该SCN 值被记载到了控制文件和数据文件 头部,某用户执行了事务变化操作,并提交了事务,SCN 值变化为3456239,并且此时突然出现了系统断电,那么 首先应考虑控制文件、数据文件和重做日志的SCN 值分别 为多少。因为只有在发出检查点才会将SCN 信息写入到控 制文件和数据文件头部,所以控制文件和数据文件的SCN 值都是3456231,而当执行了提交操作后,重做记录连同 SCN 会写入到重做日志文件,所以此时重做日志文件的当 前SCN 值为3456239。
源自文库
因为数据文件、控制文件的SCN 一致,而与 重做日志所记录的SCN 不一致,所以在重新启动 Oracle Server 时后台进程SMON 会进行实例恢复,
此时SMON 程将自动重新执行从3456231 至 3456239 之间的所有事务变化,然后才会打开数 据库。 重做日志为何被称为“Redo Log File”?因为 在进行实例恢复或介质恢复时要重新执行日志文 件记录的所有事务变化。
3)切换日志 SQL> ALTER SYSTEM SWITCH LOGFILE; 系统已更改。 4)重新显示日志状态
SQL> SELECT GROUP#,SEQUENCE#,MEMBERS,STATUS FROM V$LOG; GROUP# SEQUENCE# MEMBERS STATUS ---------- ---------- ---------- ---------------1 309 1 CURRENT 2 307 1 INACTIVE 3 308 1 ACTIVE 由实例可见,数据库工作一共有3 个重做日志组,组号是1、2 和3,每个组有一个成员。日志切换前,当前日志组为3(状态为 CURRENT),对应的最大日志序号为308。日志切换后,最小日志 序号的日志组1 被覆盖,日志序号增一变为309,并成为新的当前 日志组。日志组就是这样被循环的使用。
利用重做日志文件,在数据库发生故障时,可 以重新处理事务。每个事务在处理的同时也会写 入重做日志缓冲区,然后由LGWR 进程写入到重 做日志文件,这样,如果发生介质故障,重做日 志文件将提供恢复机制。(但也存在例外情况, 例如,在启用NOLOGGING 子句的情况下对象中的 直接加载插入)。 重做日志文件用来在例程失败等情况下恢复尚 未写入数据文件的但是已提交的数据。重做日志 文件只用于恢复。
以下查询显示了当前数据库的重做日志文件的位 置和名称。当前数据库共有3 个日志文 件REDO01.LOG、REDO02.LOG 和REDO03.LOG,位 于D:\ORACLE\ORADATA\DB01\目录下。 SQL> SELECT member FROM v$logfile; MEMBER -----------------------------------------D:\ORACLE\ORADATA\DB01\REDO03.LOG D:\ORACLE\ORADATA\DB01\REDO02.LOG D:\ORACLE\ORADATA\DB01\REDO01.LOG
例如:如果要删除正在使用的日志组,那么首先强制日志切换;当 日志组很大,需要很长时间才能写满时,可以强制执行日志切换, 以避免重做日志损坏所带来的损失。强制日志切换的命令如下:
ALTER SYSTEM SWITCH LOGFILE。 【实例7-1】切换日志,显示日志状态。
1)以管理员身份登录 SQL> CONNECT / AS SYSDBA 已连接。 2)显示日志状态 SQL> SELECT GROUP#,SEQUENCE#,MEMBERS,STATUS FROM V$LOG; GROUP# SEQUENCE# MEMBERS STATUS ---------- ---------- ---------- ---------------1 306 1 INACTIVE 2 307 1 ACTIVE 3 308 1 CURRENT
【本章大纲】
【本章大纲】
一、 重做日志文件
在数据库的使用过程中,可能会出现断电、死机 等意外情况,在出现意外时如何保证数据的有效 性、一致性和完整性? Oracle 作为大型关系数据库管理系统,必须要 通过合理的机制确保在任何情况下都不会出现数 据丢失,通过合理的配置重做日志可以实现并完 成这项任务。
1.3.2.强制检查点
假定数据库包含两个日志组,每个日志组尺寸为100MB, 并且初始阶段只有在日志切换时才会发出检查点。假定当前 日志组为日志组一,当该日志组写满之后,系统会自动切换 到日志组二,并发出检查点将SCN 信息写入到数据文件和控 制文件。如果在日志组二记载 了90MB 事务变化之后,系统出现断电。 可以设想一下,数据库还能使用吗?答案是肯定的,将来在 重新启动Oracle Server 时后台进程SMON 会自动执行实例恢复 ,最终将数据文件、控制文件、重做日志转变为一致状态。 当进行实例恢复时, SMON 首先重新执行事务,然后打开数 据库,最后回退未提交的事务。因为SMON 需要重新执行日 志组二所记载的90MB事务变化,从而会使得实例恢复需要很 长时间。为了降低实例恢复时间,必须要增加检查点次数。
假定数据库包含三个日志组,在图7-1 中,初始阶段后 台进程LGWR 将事务变化写入到日志组一的两个成员中; 在日志组一写满之后,LGWR 进程切换到日志组二,并将 事务变化写入到日志组二的两个成员中;在日志组二写 满之后, LGWR 进程切换到日志组三,并将事务变化写 入到日志组三; 在日志组三写满之后,LGWR 又切换回日志组一,并将 事务变化写入到日志组一,覆盖原有记录。经过以上说 明,大家可以知道,所有事务变化都可以通过日志组予 以保留(归档方式下)。 这样,即使将来出现实例失败(Instance Failure)或介 质失败(Media Failure)时,DBA 将会使用这些已经保留下 来的事务变化进行实例恢复或介质恢复,最终可以确保 Oracle 不会出现数据丢失。