ITPUB论坛-专业的IT技术社区

标题: 实例恢复相关原理精简总结 [打印本页]

作者: zcs0237    时间: 2013-1-30 16:40
标题: 实例恢复相关原理精简总结
本帖最后由 zcs0237 于 2014-1-9 08:53 编辑





下载彩色原稿.带书签实例恢复相关原理精简总结(原创).pdf
[attach]825997[/attach]
a.欢迎对本帖补充、建议、更正
b.测试环境rhel5.4+Ora10.2.0.1.0
c.为节省篇幅,部分输出结果做了精简




第一部分 相关基础知识——脏链、CKPT


***************************************************************************************
一、 CKPTQ脏链(按照访问顺序进入CKPTQ)
=检查点队列
=包含所有脏块
=任何块一变脏一定立即进入
=脏块第一次进入ckptq就决定了其顺序
=与接脏块的buffer header关联
=块改多次关联redo buffer中多个rba:心跳将第一次的lrba写到控制文件,不写hrba
(控制文件中的redo byte address用以标志Recovery需要从日志中哪个地方开始)
===================================================================
各数据块在被读入buffer cache时,会先在buffer cache中构造一个buffer header,buffer header与数据块一一对应。buffer header包含的主要信息有:
a)该数据块在buffer cache中实际的内存地址。
b)该buffer header所在的LRU、LRUW、CKPTQ等链表。
c)正在等待该buffer header的进程列表(waiter list)和正在使用该buffer header的进程列表(user list)。

************************************************************************************************
二、LRUW脏链(按照访问频率进入LRUW)
=只包含一部分脏块
=挂在LRU链上的脏块在被写回磁盘前,它是不能被新读入的块覆盖的。经过一定算法会把一部分脏块转到脏LRU链(即LRUW链)中。
=挂在LRUW链中的块被dbwn写入dbfile后自动从ckptq队列中摘除

*****************************************************************************************
三、 CKPT发送CHECKPOINT信号的触发条件
1. log_checkpoint_timeout时间达到
2.当前redo日志已经写够log_checkpoint_internavl操作系统块大小
3. redo log switch :日志文件满或alter  system  switch  logfile
4. 手工检查点操作:alter system checkpoint
5. alter tablespace XXX begin backup,end backup时
6. alter tablespace , datafile offline,
7.关闭实例(SHUTDOWN ABORT除外)。
8.direct path read时(11g全表扫描);

******************************************************************************************
四、 增量检查点
增量检查点并不会去更新数据文件头,而只是每3秒由CKPT进程去更新控制文件中的LRBA和SCN(日志切换检查点、完全检查点时写数据文件头及数据文件头)。
1.增量检查点主要包含以下步骤
①亲自物理写
CKPT每3秒心跳一次记录检查点位置的工作(更新RBA至控制文件)
②指挥别人写
CKPT定期触发DBWn去写checkpoint queue中的脏数据
2.增量检查点的意义有以下两个:
①减少发生完全检查点时DBWn进程的工作负担
②提高实例恢复的速度

*************************************************************************************
五、检查点心跳原理、检查点队列原理
检查点发生后,触发dbwr,CKPT获取发生检查点时对应的SCN,通知DBWr要写到这个SCN为止。
dbwr 根据 buffer 在被首次修改的时候的时间的顺序批量地写出dirty buffer到datafile。
checkpoint 发生时:
一方面通知dbwr进行下一批写操作。
另一方面,oracle 采用了一个心跳的概念,以3秒的频率将dbwr 写的进度反应到控制文件中,也就是把dbwr当前刚写完的dirty buffer对应的scn和lrba写入数据文件头和控制文件,这就是检查点scn。
3秒只是在控制文件中,ckpt 进程去更新当前dbwr写到哪里了,这个对于ckpt 进程来说叫 heartbeat ,heartbeat是3秒一次:  3秒可以看作不停的检查并记录检查点执行情况(DBWR的写进度)。
检查点发生之后数据库的数据文件、控制文件处于一致状态的含义是不需要进行介质恢复,只表示数据文件头一致,但是并不表示数据文件内容一致,因为数据文件内容可能在没有发生检查点的其他情况下的dbwr写数据文件,这样数据文件内容就不一致,若掉电需要进行崩溃恢复(前滚+回滚)。

*************************************************************************************
第二部分 相关基础知识——Block Address
*************************************************************************************
一、block address(ondisk rba在9.2后作废)
1.uba=Undofile BA
2.dba=Datafile BA=dbfile文件号、块号、行号
rdba=tablespace Relative Database BA
3.rba=Redofile BA=logfile 序列号,logfile 块号,偏移长度

**************************************************************************************
二、low cache rba与low rba
1.low cache rba
=检查点位置
=就是CKPT记录的DBWR写的进度
=low cache rba 以前的更前的已经写入数据文件
2. 当前redo logfile的low scn(first_change#)
SQL> select sequence#,status,first_change# from v$log;
SEQUENCE# STATUS           FIRST_CHANGE#
---------- ---------------- -------------
         5 INACTIVE                566751
         6 CURRENT                 589819
         4 INACTIVE                531541
first_change#表示当前redo log的low scn,
实例恢复只会用到当前redo log file(原因:日志切换时触发CKPT写了脏块)
3.补充知识:
next_change#表示当前redo log的high scn
select sequence#,first_change# from v$log;
select sequence#,first_change from  v$log_history;
Redo log会顺序纪录数据库的各个变化。一组redo log文件写满后,会自动切换到下一组redo log文件。则上一组redo log的high scn就是下一组redo log的low scn。

**********************************************************************
第三部分 相关基础知识——scn
**********************************************************************
说明:文中的名词stop scn名词end scn均指代"select name,last_change# from v$datafile;"

一、计数器
1.scn计数器(未保存)
=是不断向前累加的的,系统当前的逻辑时钟
=数据库越忙变化越快
=可与时间相互转换
=select CURRENT_SCN from v$database;
2.检查点scn时间点(已保存的)
=已提交到数据文件头或控制文件中的scn值
=有end scn,start scn,system scn等很多种
=保存在数据块头中、控制文件头中、数据文件头中等很多位置
3.为什么用scn而不用时间来界定呢?
在9:00的时执行一条DML语句,
然后修改机器上的时间为8:00,再执行一条DML语句。
机器上的时间区分的话,Oracle区分不出来这两条DML语句的执行顺序
——所以它采用自己产生的SCN计数来区分所有操作的先后顺序。

***********************************************************************************************
二、全局SCN/局部SCN(保存在控制文件中)
1.全局SCN(系统检查点SCN)
=控制文件中自身的SCN
=select checkpoint_change# from v$database;
2.局部SCN(有些表空间的是只读的,故与全局SCN不同)
=控制文件中各文件的SCN
=select name,checkpoint_change# from v$datafile;

*************************************************************************
四、控制文件头中数据文件stop scn和数据文件头中的start scn
1.end scn
=在控制文件中
=正常关闭数据库或正常将表空间置为read only或offline时将修改的
=select name,last_change# from v$datafile;
2.start scn
=在数据文件头中
=select checkpoint_change# from v$datafile_header     

================================================================
重要说明:
a.正常关机时(Normal或Immediate)
发出完全检查点,这将为各数据文件设置控制文件中的结束SCN,使其等于数据文件头中对应的开始SCN。
b.异常关机
控制文件中的数据文件头信息(ckpt cnt)与数据文件头一致(ckpt cnt),所以不需要介质恢复,数据文件和控制文件一致。
此时控制文件中的数据文件stop scn=null,与数据文件头中的start scn不相等,说明数据文件和日志文件不一致,所以需要进行实例恢复。

**********************************************************************************************
第四部分 启动过程中的一致性检查
1.对比start scn与checkpoint scn
2.对比start scn与end scn

***************************************************************************
一、第一次检查是决定是否做media recover(难点)
1.对比控制文件中记录的数据库全局检查点Checkpoint SCN
数据文件头部所记录的数据文件的Start SCN 是否相等,从而确定是否需要进行介质恢复。

两者不相等需介质恢复时,
介质恢复的起始点是各数据文件头部所记录的Start SCN对应的RBA
终点是控制文件中记录的数据库全局检查点Checkpoint SCN对应的RBA
2.两者若相等则进行第二次检查是决定是否做instance recover

====================================================================
补充知识:日志切换检查点
在控制文件中,只记录日志切换时的SCN,不记录RBA.
日志切换时,被写进数据文件头的并不只有SCN信息,还有RBA信息.这个RBA是新的连机重做日志文件第一条重做记录的RBA.

**********************************************************************************
二、第二次检查是决定是否做instance recover
对每个数据文件都作这样的检查,然后打开数据库:
1.检查对数据文件头中的中对应文件的Start SCN
控制文件中对应文件的end SCN
2.分两种情况
a.如果end SCN等于start SCN,则不需要对那个文件进行redo恢复。
b.如果上次数据库用ABORT等非正常关闭的,数据库没进行检查点处理,而结束SCN仍然为无穷大或null。
在下次启动期间,发现开始SCN和结束SCN不同,需要进行实例恢复:
前滚,online,后滚
3.作为打开过程的一部分,要将结束SCN重新设置为无穷大或null。

*******************************************************************************
三、只读表空间的问题
1.alter tablespace tbs1 read only;此信息会存到控制文件中
此表空间的数据文件包括数据文件头中及控制文件中的scn等信息被冻结
2. shutdown immediate;所有read write的数据文件对应scn,rba等更新一致
3.实例启动时仅对在控制文件中标记为read write的表空间做一致性检查


*******************************************************************
近期文章:
欢迎支持我的帖子::p
7 月27号:全面解析11GR2中的BTree索引(含视频)
http://www.itpub.net/thread-1805377-1-1.html
分析演示各种监听器配置与加固技术(含视频)
http://www.itpub.net/thread-1804092-1-1.html
10gUNDO的10个实验(含视频)
http://www.itpub.net/thread-1793265-1-1.html
表空间日常管理及核心文件搬迁技术(含视频)
http://www.itpub.net/thread-1796584-1-1.html
深入分析并发控制之——事务隔离与锁机制(含视频)
http://www.itpub.net/thread-1795446-1-1.html
*******************************************************************

作者: vage    时间: 2013-1-30 16:43
支持原创。楼主辛苦,
作者: 最爱二锅头    时间: 2013-1-30 16:54
好帖要顶起的,V5啊!
作者: paynefu    时间: 2013-1-30 16:57

作者: yanhl_jn    时间: 2013-1-30 16:57
楼主辛苦了!
作者: wzz123snow    时间: 2013-1-30 17:12
支持!
作者: nature_zl    时间: 2013-1-30 17:20
楼主辛苦,感谢
作者: lichengdao    时间: 2013-1-30 18:32
支持原创分享
作者: icoolyoucool    时间: 2013-1-30 19:31
周兄,我是笨笨狗,看到这篇文章调理清晰,错落有致,一向是你做学问的风范,特来捧场.
作者: guoyJoe    时间: 2013-1-30 19:44
LZ辛苦了,支持原创!
作者: sheep_yang678    时间: 2013-1-30 20:05
技术贴,必须顶,慢慢研究
作者: luashin    时间: 2013-1-30 20:28
他一向都在用心学习和写作原创作品,先赞一个。
作者: kelsoncong    时间: 2013-1-30 22:19
支持原创
作者: tszyztc110    时间: 2013-1-30 22:25
老周就是老周。。。。  啥时候回誉天贡献下文档啊??
作者: tanjiaping    时间: 2013-1-30 22:33
大力支持,楼主辛苦了啊
作者: xteitxu    时间: 2013-1-30 22:51
支持原创
作者: brucewoo_cu    时间: 2013-1-31 00:00
Up
作者: chinaliukai    时间: 2013-1-31 10:08
支持原创!LZ辛苦了!
作者: lovehewenyu    时间: 2013-2-1 10:13
lz辛苦,收藏!谢谢
作者: ses19828    时间: 2013-2-1 14:22
言简意赅

精品

这些东西 都可以写一本书    而你只用了这么点字  就表达完了
作者: tianya_2011    时间: 2013-2-1 14:29
楼主 v5
作者: njlrs    时间: 2013-2-1 20:55
好文章,启动的三个状态,每个状态都要一定条件,楼主把知识点都指出来了,还有一些原理也解释了
作者: mikean    时间: 2013-2-4 09:23
支持原创。
作者: jinjintaozi    时间: 2013-2-20 14:04
本帖最后由 jinjintaozi 于 2013-2-20 14:25 编辑

支持原创~
作者: appleman1983    时间: 2013-2-22 16:10
支持下
作者: cdbdp    时间: 2013-2-22 18:07
支持
作者: lyc-vip    时间: 2013-2-22 21:02
支持原创,必须顶
作者: zcs0237    时间: 2013-3-8 13:47
ses19828 发表于 2013-2-1 14:22
言简意赅

精品

多谢
作者: miaocbin    时间: 2013-4-3 13:31
学习ing,多谢分享。
作者: 边-城    时间: 2013-4-3 15:06
顶起
作者: 边-城    时间: 2013-4-8 18:42
本帖最后由 边-城 于 2013-4-23 14:28 编辑

占个位,待以后评论

作者: lengxf    时间: 2013-4-16 12:52
这个必须支持,谢谢分享。
作者: huangxuemail    时间: 2013-4-16 15:01
顶一个~~~
作者: lee04018    时间: 2013-4-18 09:49
學習了!
感謝!
作者: zcs0237    时间: 2013-4-18 10:18
本帖最后由 zcs0237 于 2013-4-18 10:19 编辑
lee04018 发表于 2013-4-18 09:49
學習了!
感謝!


相互学习,感谢您的回复
欢迎继续关注我的帖子,一般每周一篇

作者: e_fox    时间: 2013-4-18 19:13
楼主辛苦,很专业
作者: 边-城    时间: 2013-4-23 14:24
对于第四部分的第1点我不同意楼主的理解

楼主是这样写的:
一、第一次检查是决定是否做media recover(难点)
1.对比控制文件中记录的数据库全局检查点Checkpoint SCN

数据文件头部所记录的数据文件的Start SCN 是否相等,从而确定是否需要进行介质恢复。


oracle在判断是否需要介质恢复的时候,比较的是控制文件中记录的检查点计数器和数据文件头记录的检查点计数器。如果不一致则需要介质恢复。

而在判断是否需要实例恢复的时候,比较的是控制文件记录的end SCN和数据文件头的start SCN,如果不一致则需要实例恢复。

作者: zcs0237    时间: 2013-4-24 00:17
边-城 发表于 2013-4-23 14:24
对于第四部分的第1点我不同意楼主的理解

楼主是这样写的:

控制文件中记录的检查点计数器和数据文件头记录的检查点计数器是不用检查的,是最后open数据库的时候对比一下就可以了。。。
欢迎更多专家讨论、指导
作者: coloredice    时间: 2013-4-25 09:02
对于第四部分的第1点我有疑问:
到底是对比控制文件中记录的数据库全局检查点Checkpoint SCN
和数据文件头的Checkpoint SCN
还是对比控制文件中记录的数据文件检查点Checkpoint SCN
和数据文件头的Checkpoint SCN呢
作者: zcs0237    时间: 2013-4-25 11:10
coloredice 发表于 2013-4-25 09:02
对于第四部分的第1点我有疑问:
到底是对比控制文件中记录的数据库全局检查点Checkpoint SCN
和数据文件头 ...

1.介质恢复的本质:恢复数据库文件丢失的数据

2.介质恢复的基础:
恢复结束点以控制文件中的end scn为准

3.是否需要介质恢复的判断依据:一一对比各数据文件的
start scn(在数据文件头中)

end scn(在控制文件中)

在京出差,可加好友,回去后探讨,共同学习

作者: chmchang    时间: 2013-6-27 07:44
good for use
作者: lium37    时间: 2013-6-27 08:56
顶啊!
作者: 胃疼小小小    时间: 2013-6-28 11:28
谢谢分享~
作者: ls15801738872    时间: 2013-6-28 11:54
看看好东西
作者: pengdong352    时间: 2013-6-28 14:14
经典,学习一下
作者: lampharejinte    时间: 2013-6-28 14:45
good

作者: heizistudio    时间: 2013-6-28 17:24
看了下帖子很给力
作者: apporacle    时间: 2013-6-28 21:37
思路清晰,一看就理解很深啊,up
作者: 88198724    时间: 2013-6-29 09:53
  好玩意
作者: quhp1978    时间: 2013-6-29 10:30

作者: 99willicn    时间: 2013-7-1 11:15
多谢楼主分享!!
作者: jitt89    时间: 2013-7-1 11:46
支持!!!
作者: 宝儿小萱    时间: 2013-7-1 11:47
支持楼主
作者: wf_rmyy    时间: 2013-7-1 13:50
xiexie
作者: golden_zhou    时间: 2013-7-1 13:52
好东西,一睹为快
作者: ORA_WOLF    时间: 2013-7-1 14:56
不错,谢谢分享。
作者: wangjianz87    时间: 2013-7-1 15:04
楼主辛苦了
作者: cwjl11    时间: 2013-7-1 15:09
支持楼主。。。。
作者: debian365    时间: 2013-7-1 15:14
这个必须回帖。。。
作者: lin6234    时间: 2013-7-1 16:08
学习,收藏。
作者: 九头鸟_feng    时间: 2013-7-1 16:23
学习下、
作者: hkcydnb02    时间: 2013-7-1 16:40
great book
作者: only18    时间: 2013-7-1 16:45
学习了
作者: zcs0237    时间: 2013-7-1 16:49
kelsoncong 发表于 2013-1-30 22:19
支持原创


传说中的虫大师回复了我的第一篇oracle文章,竟然刚发现
作者: b2c_user    时间: 2013-7-1 17:34
感谢楼主奉献
作者: lywfbg    时间: 2013-7-1 23:52
                  
作者: sniper_bullet    时间: 2013-7-2 09:17
很好的學習資料,Tks!
作者: gy_second    时间: 2013-7-2 11:00
这个测试环境我学习一下
作者: november31    时间: 2013-7-2 11:44
我看看
作者: jsyvj2008    时间: 2013-7-2 12:37
支持楼主
作者: 孤独长剑    时间: 2013-7-2 13:49
谢谢楼主分享
作者: feng1009    时间: 2013-7-2 14:09
学习了
作者: dbasun    时间: 2013-7-2 15:19
看看,支持
作者: cow977    时间: 2013-7-2 15:45
支持!!!
作者: ec402003    时间: 2013-7-2 16:07
楼主辛苦了。
作者: sure188    时间: 2013-7-2 16:15
支持原创分享
作者: ericcrg    时间: 2013-7-3 08:28
感谢分享!!!!!
作者: ocp8i8i10g11g    时间: 2013-7-3 10:02
it is good
作者: 学徒伟    时间: 2013-7-3 10:37
楼主辛苦!!
作者: lexiaoyao    时间: 2013-7-3 10:59
顶!好贴,支持!!!
作者: guiay5493    时间: 2013-7-3 12:29
LZ辛苦, 多谢分享
作者: 一叶之舟    时间: 2013-7-3 13:42
向高手学习!
作者: linger_52102    时间: 2013-7-3 16:23
看上去相似不错的样子
作者: baizhaoxian    时间: 2013-7-3 16:33
蛮好的
作者: bigun11    时间: 2013-7-3 17:02
支持原创!
作者: oracle_yn_365    时间: 2013-7-3 17:36
下载下来看看,学习
作者: vict_    时间: 2013-7-3 22:45

作者: moseslin    时间: 2013-7-3 23:41
感谢分享。
作者: sundoglit    时间: 2013-7-4 08:48
支持原创。楼主辛苦
作者: 紫电清霜320    时间: 2013-7-4 09:01
谢谢分享。
作者: patrickyang5210    时间: 2013-7-4 12:55
good

作者: wqyxx    时间: 2013-7-4 15:05
thanks
作者: jasonzhaojian    时间: 2013-7-4 15:23
谢谢…………
作者: iwowya    时间: 2013-7-4 16:44
楼主辛苦了!
作者: summitlau    时间: 2013-7-4 17:24
需要学习之
作者: guobaoyin    时间: 2013-7-4 18:21
好的东东!
作者: sayqieplz    时间: 2013-7-4 19:46
感谢分享
作者: kingtsi    时间: 2013-7-4 20:11
支持原创,支持深入研究
作者: FLY112    时间: 2013-7-4 21:31
不错的贴子,谢谢!!!
作者: bestinter2010    时间: 2013-7-4 23:11
感谢,很有帮助




欢迎光临 ITPUB论坛-专业的IT技术社区 (http://www.itpub.net/) Powered by Discuz! X3.2