您的位置:首页 > 数据库 > Oracle

深入解析Oracle学习笔记(第七章)

2015-08-17 15:07 471 查看
redo 可恢复性,可重演。

undo 可回退性

redo entries(redo records)被数据库进程从用户的内存空间(PGA)复制到SGA中的redo log buffer中。redo log buffer也是循环使用的。

no-force-at-commit 提交时不强制写。通过redo的连续的,顺序的写出,使得随机分散的数据块的写出推延,获得批量效应等性能提升。

log switch触发检查点,检查点完成之前,日志文件不能被重用。

redo copy latch 用于写redo内容到redo log buffer过程的保护

redo allocation latch 用于管理log buffer内存空间分配

一个进程在修改数据时产生redo,redo首先在PGA中保存。获得redo copy latch。将redo信息copy到redo log buffer。

redo copy latch表明进程正在把redo拷贝入log buffer。

latch数量:78=CPU数量,8.1.3=2* CPU数量

redo copy latch获取后,进程接着获取redo allocation latch,分配redo空间,空间分配完成后,redo allocation latch即被释放,进程把PGA中临时存放的redo信息copy到redo log buffer,copy完成后,redo copy latch释放。此时LGWR才能去写出。

redo writing latch检查LGWR是否已经激活或被通知,避免LGWR被不必要的通知去写出。如果竞争过多,可能意味着用户提交过于频繁。

在执行redo copy的过程中,进程以log file sync事件处于等待

9i中,redo log buffer多池技术,多个子池,每个都有独立的redo allocation latch保护。提高的redo的并发。

多redo log buffer机制又被成为public redolog strands (PBRS)

处理器超过16个,并且经历非常高的redo allocation latch竞争,可以考虑并行redo。

如果misses / gets超过1%,通常认为存在latch竞争。

当主机拥有16--64个CPU时,推荐设置LOG_PARALLELISM在2--8之间,从低值开始,以1位步长增进直到redo allocation latch竞争不再激烈。不推荐超过8.

10g中LOG_PARALLELISM变为隐含参数。

_log_parallelism_dynamic 设置为true,动态调整。

_log_parallelism_max 不超过。

注意:日志并行读设置大于1之后,logminer将不能解析日志文件。

10g中引入了PVRS,在共享池中分配,而不是PGA中,独立的redo allocation latch保护,不再需要额外的内存拷贝过程,redo copy latch不再需要。而redo copy正是引发redo allocation latch竞争的根源。

RAC环境中不适用PVRS。

private strand flush not complete 从内存到redo log file的写出尚未完成。

改变向量(Vector):改变向量表示对数据库内某一个数据块所做的一次变更。例如数据块的修改是一个改变向量,回滚段的修改又是一个改变向量。

重做记录(Redo record):重做记录通常由一组改变向量组成,是改变向量的集合,代表一个数据库的变更,构成数据库变更的最小恢复单位。

update操作过程 P308页。

数据块加载到buffer cache。

在undo表空间,相应回滚段事务表上分配事务槽。记录redo。

从回滚段读入或者在buffer cache中创建前镜像。记录redo。

修改数据。记录redo。

用户提交,在redo记录提交信息,并在回滚段标记该事物为非激活。

redo写出触发条件:

1.每3秒超时 log file parallel write等待事件

2.阈值达到

min(1M,1/3 log buffer size)

隐含参数 _log_io_size

3.用户提交

进程通知LGWR写,并且以log file sync事件开始休眠,等待事务返回成功标志,超时时间为1秒。

组提交:多个提交在唤醒LGWR之前发生

4.DBWn写之前

DBWn需要写出的数据的High RBA超过LGWR的on-disk RBA

8i之前 log file sync事件

8i开始,DBWR把需要写出的block放入一个延迟队列,同时通知LGWR写出redo,DBWR可以继续执行无需等待的数据写出。

redo log buffer大小设置

如果log buffer space等待事件出现并且较为显著时,可以考虑增大log buffer以减少竞争

粒度

current状态日志文件,当前正在使用,崩溃恢复时必须用到。

active状态,检查点尚未完成,crash恢复时会被用到,可能已经完成归档,也可能没有归档,如果日志循环使用再次到达该文件,数据库将处于等待的停顿状态。checkpoint not complete在数据库中体现为等待事件log file switch(checkpoint incomplete)

inactive状态,实例恢复不需要,但是介质恢复可能需要。可能被归档,也可能没归档。归档完成之前,不允许被覆盖,这时进程处于log file switch(archiving needed)等待事件中。

日志文件块的大小为512byte,源代码中规定,与操作系统无关,与数据文件块大小不同。LGWR以日志文件块大小为单位写出redo。

手工热备,为了解决SPLIT BLOCK的问题,需要在日志文件中记录修改的行所在的数据块的前镜像,而不仅仅是修改信息。

RMAN可以在备份时,通过反复读取获得一致的BLOCK,从而避免了SPLIT BLOCK的生成,所以不会产生额外的redo。

NOLOGGING可以使得生成日志大幅降低,但是必要日志(如数据字典表的修改)仍然会被记录。

当使用DG作为数据库的备份或容灾模式时,日志变的不可缺少,可以将数据库至于强制日志模式 force logging,在强制日志模式下,所有操作都将被记录。

inactive日志组丢失

alter database clear [unarchived] logfile group 2; 清除日志组

损失当前日志时,如果是正常关闭的,需要recover database until cancel,然后alter database open resetlogs。

如果是异常关闭的,如果想要恢复,则必须需要当前日志,否则无法保证数据不丢失。这种情况,需要从备份恢复数据文件,然后应用归档日志文件向前推演,知道最后一个完好的日志文件,然后open resetlogs。丢失的数据就是损坏的日志文件中的数据。

如果要强制性打开数据库,忽略一致性,参数_allow_resetlogs_corruption。使用所有数据文件最旧的SCN打开数据库。然后exp导出数据,重新建库,imp导入。

此方法应在oracle技术支持的指导下进行,否则oracle将不对采用此方式进行恢复的数据库进行支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: