ITPub博客

首页 > Linux操作系统 > Linux操作系统 > OCP-032-Chapter07 实例和介质恢复结构(zt)

OCP-032-Chapter07 实例和介质恢复结构(zt)

原创 Linux操作系统 作者:tolywang 时间:2006-08-23 00:00:00 0 删除 编辑
OCP-032-Chapter07 实例和介质恢复结构
目的
完成本课后,应该可以做下列事情:
描述Oracle的进程、内存结构和与恢复相关的文件
了解检查点、重做日志文件和归档日志文件的重要性
描述调整实例恢复的方法

一些常用的视图:v$sga, v$instance, v$process, v$bgprocess, v$database, v$datafile
大型共享池用于从共享内存分配顺序 I/O 缓冲区。对于 I/O 从属和 Oracle 备份与还原,RDBMS 分配大

小为几百KB的缓冲区。
当设置了DBWR_IO_SLAVES和BACKUP_TAPE_IO_SLAVES参数模拟异步I/O时,恢复管理器(Recovery Manager

-- RMAN)会使用大型池来执行备份和恢复。
如果设定了LARGE_POOL_SIZE,Oracle尝试从大型池中取得内存,如果这个值不够大,Oracle也不会从共享

池中取得内存。如果没有设定这个参数,Oracle会尝试从SGA中取得内存。如果Oracle不能取得足够的内存

,它会从本地进程内存中获得I/O缓冲区内存,同时向alert.log文件写入一条信息表明备份采用了同步I/O


DBWR_IO_SLAVES:该参数指定 DBWn 进程使用的 I/O 从属的数量。DBWn 进程及其从属总是写入磁盘。缺

省情况下,该值为 0,即不使用 I/O 从属。
如果 DBWR_IO_SLAVES 设置为非零值,则由 ARCn 进程、LGWR 进程和恢复管理器使用的 I/O 从属的数量

都设置为 4。
在不支持或不能有效实施异步 I/O 的平台上,通常使用 I/O 从属来模拟异步 I/O。不过,即使在使用异

步 I/O 时也可以使用 I/O 从属。在这种情况下,I/O 从属将使用异步 I/O。
BACKUP_TAPE_IO_SLAVES:它指定恢复管理器是否使用 I/O 从属将数据备份、复制或还原到磁带上。
当 BACKUP_TAPE_IO_SLAVES 设置为 TRUE 时,I/O 从属进程用于对磁带设备进行读写操作。
当该参数设置为 FALSE(缺省值)时,I/O 从属不用于备份;相反,参与备份的影子进程将访问磁带设备


注:由于在任一特定时刻只能有一个进程访问磁带设备,因此该参数值是一个布尔值,它控制对 I/O 从属

进程的部署,允许或禁止该进程访问磁带设备。
要执行双重备份,则需要启用该参数,否则将发出一个错误。启用该参数后,恢复管理器将根据所请求的

备份副本数来配置所需的从属进程的数量

尽管一个数据库写入器进程对于大多数系统已足够,但如果系统需要修改大量数据,您还可以配置附加的

进程(从 DBW1 到 DBW9)以提高写入性能。这些附加的数据库写入器进程对单处理器系统不起作用。
例程启动后,数据文件可能会包含未提交的数据。这种情况发生在数据已更改但尚未提交时(已更改的数

据正处在高速缓存中),此时高速缓存中需要更多空间,从而强制未提交的数据转存入磁盘。
表空间包含一个或多个数据文件。认真创建表空间对于提供灵活且易管理的备份和恢复策略非常重要。以

下是一种典型的表空间配置,其中考虑了备份和恢复操作的要求:
系统:如果将系统数据和用户数据分放在不同的表空间中,则可以更灵活地进行备份和恢复操作。
临时:如果含有临时段(用于排序等)的表空间丢失,可以重建它,而不是恢复它。
还原:备份还原表空间的过程与备份其它任何读/写表空间的过程完全相同。由于自动还原表空间对于恢复

和读一致性至关重要,您应该经常对它进行备份。
只读数据:可以缩短备份时间,因为只有当表空间设为只读时,才必须对它进行备份。
频繁变更的数据:应该频繁地备份这种表空间,这样也可以缩短恢复时间。
索引数据:应当创建仅用来存储索引段的表空间。可以经常重建而不是恢复这些表空间。

Oracle 服务器进程将重做条目从用户的内存空间复制到重做日志缓冲区
尽管它至少必须拥有两个日志组以支持循环特性,在大多数情况下,您可能需要两个以上的重做日志组。
您可以使用以下 SQL 命令创建附加的日志文件组:
ALTER DATABASE [database]
ADD LOGFILE [GROUP integer] filespec
[, [GROUP integer] filespec]...]
要删除整个联机重做日志组,可使用以下 SQL 命令:
ALTER DATABASE [database]
DROP LOGFILE
{GROUP integer|('filename'[,'filename']...)}
[,{GROUP integer|('filename'[,'filename']...)}]...
V$LOG:列出每个组中成员的数量,包含组号、当前日志序列号、组大小、成员数、状态、检查点更改号
V$LOGFILE:列出每个日志文件成员的名称、状态(STALE 或 INVALID)和组别。
V$LOG_HISTORY:包含有关控制文件中的日志历史记录的信息。
通过重命名联机重做日志文件,可以更改联机重做日志文件的位置。在重命名联机重做日志文件之前,请

确保新的联机重做日志文件存在。Oracle 服务器仅更改控制文件内的指针,并不从物理上重命名或创建任

何操作系统文件。如果旧文件是 Oracle 管理文件并且它确实存在,则它会被删除。
如何重新定位重做日志文件
1.如果日志文件是当前日志,通过以下命令进行日志切换:
ALTER SYSTEM SWITCH LOGFILE;
2.使用操作系统的复制实用程序(Unix 中的 cp 或 Windows NT 中的 COPY)将 重做日志文件

从先前位置复制到新位置
3.使用 ALTER DATABASE RENAME FILE 命令在控制文件中进行更改:
ALTER DATABASE [database]
RENAME FILE 'filename'[, 'filename']...
TO 'filename'[, 'filename']...
注:您也可以向组中添加新成员,然后删除旧成员。
如何向组中添加成员
您可以使用下面的 SQL 命令向现有的重做日志文件组中添加新成员:
ALTER DATABASE [database]
ADD LOGFILE MEMBER
['filename' [REUSE]
[, 'filename' [REUSE]]...
TO {GROUP integer
|('filename'[, 'filename']...)
}
]...
如何从组中删除成员
如果一个联机重做日志成员处于 INVALID 状态,您也许希望删除该成员。请使用下列 命令:
ALTER DATABASE [database]
DROP LOGFILE MEMBER 'filename'[, 'filename']...
注:您不能从当前或活动的重做日志文件组中删除成员。

检查点位置
重做日志中开始恢复的位置称为检查点位置。在该检查点之前的所有引用数据块都已由 DBWn 写入磁盘。

该位置定义为它与重做日志末尾之间的 “距离”。还可以将它看成是检查点队列中第一个条目的 “年龄

”,该队列是按照数据块最初变灰时的顺序排列的灰数据块链接列表。
检查点队列
检查点队列中的每个条目包含对应数据块的标识符(即文件编号与块编号),以及该数据块最初变灰时在

重做日志中所处的位置(称为重做字节地址或 RBA)。它还包括上一次更改该数据块时在重做日志中所处

的位置。检查点队列中的第一个条目标识数据库缓冲区高速缓存中最早的灰数据块。DBWn 按检查点队列中

的顺序从缓冲区高速缓存中写入块,随着数据块的写入,对应的每个条目将被删除。
当关闭数据库(异常关闭除外)或通过 ALTER SYSTEM CHECKPOINTA 命令手动启动检查点操作时,将执行

称为完全检查点的过程。在完全检查点操作中,DBWn 将数据库缓冲区高速缓存中的所有灰缓冲区数据写入

数据文件。
增量检查点(也称为快速启动检查点)是持续活动的检查点。DBWn 定期从检查点队列写出缓冲区数据,从

而不断推进内存中的增量检查点操作。增量检查点操作使 DBWn 写入缓冲区高速缓存中的块,这样,最早

变灰的缓冲区会被最先写入。增量检查点不更新数据文件头。增量检查点记录在控制文件中。
ALTER TABLESPACE BEGIN BACKUP 命令仅对缓冲区高速缓存中属于该表空间的灰缓冲区启动部分检查点操

作。
ALTER TABLESPACE tablespace OFFLINE NORMAL 命令也可用于启动部分检查点操作。
检查点进程 (CKPT) 负责在执行各个检查点操作时向 DBWn 发出通知,并更新数据库的数据文件和控制文

件以指明最新的检查点。
每隔三秒,CKPT 就会在控制文件中记录检查点队列中最旧条目的 RBA。出现例程故障后,通过该 RBA 可

以在重做日志中找到例程恢复操作的起点。之所以能够做到这一点,是因为系统能够保证通过 DBWn 将先

前重做记录中表示的所有数据块都写入磁盘。
只有在出现日志切换的情况下,CKPT 才另外将该信息写入数据文件头。要提高性能,不要一次写入所有文

件头,而是按照所谓的 “惰性写入” (Lazy Write) 的方式进行分组更新。日志切换并不强制将所有灰缓

冲区都写入磁盘。
检查点确保所有编辑过的数据库缓冲都被写到数据库文件中,这样数据库文件头被标记为当前数据文件,

同时检查点顺序号写入控制文件。检查点通过把缓冲区中已经被检查点记录过的所有缓存写入磁盘来达到

同步。增量检查点是连续不断的,低负载的检查点作为后台进程不断的把缓冲数据写入磁盘。
检查点进程的特性:
CKPT进程总是启用;在检查点完成后,CKPT进程负载更新文件头;频繁的检查点可以减少恢复实例的时间
什么时候发生检查点?
每一次日志切换
当设定了快速启动检查点,这会强制DBWn提前写入缓冲以缩短实例恢复的时间
当LOG_CHECKPOINT_INTERVAL初始化参数设定的频率到达时。定义了上次完全备份和当前要进行的增量备份之间的重做日志文件的块数。

当设定了LOG_CHECKPOINT_TIMEOUT初始化参数,并且发生超时(从当前检查点位置开始写入重做块算起,逝去的时间超过了设定的秒数)。这个参数设定了上次增量检查点写入重做日志文件后(有时也称为日志尾部),已经过去的时间。这个参数同时设定了缓存中脏数据的保留最长时间。
实例关闭时,除非是abort选项
由DBA手动发出alter system checkpoint命令
当表空间离线或者在线备份开始时
注意:只读数据文件例外,它们的检查点号是固化的,和控制文件里面的并不匹配。

同步
在每一个检查点,检查点序号会在每一个数据库文件头和控制文件中更新
检查点序号作为重做日志文件、控制文件和数据文件之间的同步标记。如果它们拥有同样的检查点序号,则认为数据库处于一致的状态。
控制文件中的信息用来确保其它文件在数据库启动的所拥有的检查点序号一致。任何的不一致都会导致数据库无法打开,需要恢复。
实例恢复
检查点加速实例的恢复,这是因为在每一个检查点所有改变的数据都写入磁盘,这样子实例恢复时,最后的检查点之前的数据都不需要回滚。

多工控制文件
控制文件的内容:数据库名、数据库创建的时间戳、恢复需要的同步信息、数据文件和日志文件的名字和位置、数据库的归档模式、当前的日志序列号、RMAN的相关数据
v$controlfile
如何多工控制文件:
1. 关闭数据库
2. 拷贝控制文件
3. 更改或者添加CONTROL_FILES参数
4. 启动数据库

归档日志的用处:
一个数据库备份和归档日志文件,可以保证所有提交的数据可以被恢复
在数据库在线时也可以进行备份
在数据库恢复时,Oracle服务器会自动寻求日志文件(包括归档的),所以要保证它们在设定的位置

实例恢复的各个阶段:
1. 文件不同步
Oracle服务器检测当不同步的文件出现时哪个数据库需要恢复。实例故障可能会导致这种情况发生,这时没有提交的数据都会丢失,从而发生文件不同步
2. 前滚
DBWR把所有已提交和未提交的数据都写入数据文件,目的是要把日志文件中所有记录的改变都写入数据块。

回滚段在前滚阶段产生。因为重做日志保存着数据改变前后的镜像,如果在数据文件中发现未提交的块而且没有回滚时,就会添加一个回滚段。
重做日志都会应用到日志缓冲。被标记为用于恢复的缓冲不会参与一般的事务,知道它们被恢复进程释放掉。
如果只读文件和控制文件的状态发生冲突,那么重做日志会应用于只读文件。
3. 数据文件中包含提交和未提交的数据
4. 回滚阶段:为了去除没有提交的数据,会使用到前滚阶段或者是故障发生前产生的回滚段。数据块会根据Oracle服务器或者是用户的请求回滚,看谁先请求数据块。之后数据库就可以使用,即使回滚仍然在进行。只有那些参与回滚的数据块不可使用。
5. 数据文件只包含提交的数据:当前滚和回滚都结束后,磁盘中只包含提交的数据
6. 同步数据文件:所有的数据文件此时都完成同步
优化实例恢复的性能:
优化实例恢复和故障恢复的时间
优化实例恢复的阶段
实例故障后,实例恢复或者故障恢复会自动把重做日志项应用于Oracle数据块
要在例程恢复的持续时间与日常性能之间取得平衡,采用的主要手段就是影响 Oracle 执行检查点操作的频率。您可以尽量减少恢复过程中所处理的块的数量,方法是让检查点处于最新重做日志记录之后的若干块处。但是,频繁地执行检查点操作将会给正常操作带来更大的性能开销。

要将实例恢复和故障恢复的持续时间保持在用户指定的范围内,可以采用以下手段:
设置初始化参数以影响恢复过程中所涉及的重做日志记录和数据块的数量
调整重做日志文件的大小以影响检查点操作的频率
发出SQL语句以启动检查点操作
并行执行例程恢复操作
快速启动故障恢复功能可用来控制例程恢复。该功能通过设定前滚时间的范围并使其可以预知,从而缩短前滚时间,同时还节省了执行回退所需的时间。快速启动故障恢复的基础是快速启动检查点体系结构。通过初始化参数可指定完成恢复操作的前滚阶段的目标时间。
重做日志文件的大小直接影响检查点操作。最小日志的大小越小,Oracle 服务器越可以频繁地将灰缓冲区写入磁盘,以确保在当前日志完全填满之前,使检查点的位置前进到该当前日志;这样,就可以重新使用该日志。
您可以使用这三个初始化参数来影响 Oracle 执行检查点的频率。
快速启动检查点可持续进行,只要写入块,检查点时间即会前移。完成恢复前滚阶段的目标(限定)时间可通过参数 FAST_START_MTTR_TARGET 来指定,Oracle 将按照该目标时间要求自动调整检查点的写入频率。
建议您只使用 FAST_START_MTTR_TARGET 参数,而不要再象在先前版本中那样组合使用 FAST_START_IO_TARGET、LOG_CHECKPOINT_INTERVAL 和 LOG_CHECKPOINT_TIMEOUT。FAST_START_MTTR_TARGET 可以最精确地控制恢复持续时间,而且不需要手动为 LOG_CHECKPOINT_INTERVAL 和 LOG_CHECKPOINT_TIMEOUT 设置值。
动态视图 V$INSTANCE_RECOVERY 提供了当前的恢复参数设置。
V$INSTANCE_RECOVERY中的列值定义:
RECOVERY_ESTIMATED_IOS:高速缓冲中包含的脏数据的数量(在标准版中,总是NULL)
ACTUAL_REDO_BLKS:用于恢复所需要的重做日志块
TARGET_REDO_BLKS:恢复阶段使用的重做日志的最大块数。是下面三个参数的最小值(LOG_FILE_SIZE_REDO_BLKS,LOG_CHKPT_TIMEOUT_REDO_BLKS,LOG_CHKPT_INTERVAL_REDO_BLKS).
LOG_FILE_SIZE_REDO_BLKS:恢复时要处理的重做块的数量,相当于最小日志文件尺寸的90%
LOG_CHKPT_TIMEOUT_REDO_BLKS:为了满足LOG_CHECKPOINT_TIMEOUT参数,恢复时要处理的日志块数
LOG_CHKPT_INTERVAL_REDO_BLKS:和上面的参数类似
FAST_START_IO_TARGET_REDO_BLKS:过时的参数,总是NULL
TARGET_MTTR:有效的MTTR时间,一般等于设定的FAST_START_MTTR_TARGET参数
ESTIMATED_MTTR:基于当前的脏缓冲和日志块估算出来的MTTR值,即使没有设定FAST_START_MTTR_TARGET参数也会存在
CKPT_BLOCK_WRITES:由检查点写入操作写入的块数
RECOVERY_PARALLELISM 初始化参数用来指定例程或崩溃恢复操作中并发进程的数量。使用多个进程实际上相当于提供并行块恢复。在前滚阶段,不同的进程分配给不同的块。
RECOVERY_PARALLELISM 初始化参数仅指定例程或崩溃恢复中并发恢复进程的数量。介质恢复不受此参数影响。对于介质恢复,可在 RECOVER DATABASE 语句中使用 PARALLEL 子句。
快速启动按需回退是一种自动功能,借助此功能,恢复操作的前滚阶段一结束,就可以立即开始新的事务处理。如果用户试图访问被死事务处理锁定的行,则仅回退完成该事务处理所需的更改。回退是根据需要进行的。
用户事务处理仅对该事务处理试图访问的块启动回退。剩余的块由 SMON 在后台恢复(可能是并行的)。这样做的优势在于:不必等到一个较长事务的处理工作被全部回退即可完成另一个事务处理。
快速启动并行回退使 SMON 可以充当协调程序并使用多个服务器进程来完成回退操作。当 SMON 确定死事务处理已生成大量的还原块时,它会自动启动并行回退。
对于长时间运行事务处理的系统,特别是对执行并行的 INSERT、UPDATE 和 DELETE 操作的系统,该功能非常有用。
事务处理恢复中所涉及的进程数量由动态初始化参数 FAST_START_PARALLEL_ROLLBACK 设置。
FALSE:无
LOW(缺省值):CPU数量*2
HIGH:CPU数量*4
使用以下查询可以监视将并行查询从属用于快速启动并行回退的情况:
SELECT * FROM v$fast_start_servers;
STATE UNDOBLOCKSDONE PID
---------- -------------- ---
RECOVERING 99 10
IDLE 0 11
IDLE 0 12
IDLE 0 13
使用以下查询可以确认快速启动回退的状态:
SELECT usn, state, undoblksdone, undoblkstotal
FROM v$fast_start_transactions;
USN STATE UNDOBLOCKSDONE UNDOBLOCKSTOTAL
--- ---------- -------------- ---------------
2 RECOVERING 82 365
USN 列指定回退发生在哪个还原段,而 UNDOBLKSDONE 和 UNDOBLKSTOTAL 则分别指定已完成的工作量和总工作量。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84433/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 的后遗症--語錄
请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13380445