Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

65

积分

0

好友

31

主题
1#
发表于 2014-8-10 23:00:22 | 查看: 4920| 回复: 6
本帖最后由 etl2007 于 2014-8-10 23:07 编辑

http://blog.itpub.net/17203031/viewspace-716353/

http://blog.csdn.net/robinson1988/article/details/4721605

http://blog.csdn.net/robinson1988/article/details/5046712

http://blog.csdn.net/tianlesoftware/article/details/6573988

http://blog.itpub.net/17203031/viewspace-716353/

在这些资料中,都介绍了ITL


如果是这样子
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0007.02a.000085d4  0x00800ca8.35fc.09  C---    0  scn 0x078c.7f2ddad3

0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000


这个时候Scn/Fsc为0,是正常,因为这仅仅是个预留的ITL位置,还没有事务操作

但是

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0007.02a.000085d4  0x00800ca8.35fc.09  C---    0  scn 0x078c.7f2ddad3

0x02   0x0009.019.000085e2  0x00800c4e.306a.2c  ----    1  fsc 0x0000.00000000


这样的结果就让人困惑了,此时明显已经有实际的事务存在了,为何 Scn/Fsc 还是0 呢?

而且按照

ITL:Interested Transaction List,很多人都把它叫做事务槽。它位于BLOCK Header,下面来看看DUMP出来的一个BLOCK

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0006.02d.000027cc  0x00809de3.0266.02  --U-    1  fsc 0x0000.00d96fac
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000


       可以看到ITL包含了SCN,undo地址,事物信息,事物影响该block的条数。

       从上面的信息可以看到block中也会记录SCN的信息,每个ITL对应一个SCN,由于一个事物的操作可能会涉及到多个BLOCK的更改,所以一个事物可能在多个BLOCK中产生ITL信息。SCN是根据systimestamp转化而来的,精确程度相当高,顺便提一下,控制文件会记录3个SCN,数据文件头也会记录一个SCN,想要了解更多SCN内容,查看前面的文章。ITL中另外一个相当重要的就是Uba,它记录了UNDO的信息,这个是consistant read的基础,我们知道用户发出一条SQL语句,ORACLE就知道了它的结果,为什么ORACLE有这个先知功能呢?事实上ORACLE的另外一个中文翻译也是先知。其实答案就在于ITL中记录的SCN,和Uba.当发出一条sql语句时,ORACLE会记录下这个时刻(SCN),然后在buffer cache中查找需要的BLOCK,或者从磁盘上读,当别的会话修改了数据,或者正在修改数据,就会在相应的block上记录ITL,此时ORACLE发现ITL中记录的SCN大于SELECT时刻的SCN,那么ORACLE就会根据ITL中的Uba找到UNDO信息获得该block的前镜像,然后在buffer cache 中构造出来,此时ORALCE 也会检查构造出来的BLOCK中ITL记录的SCN,如果SCN还大于select时刻的SCN,那么一直重复构造前镜像,然后ORACLE找到前镜像BLOCK中的ITL的SCN是否小于select的SCN,同时检查这个事物有没有提交或者回滚,如果没有,那么继续构造前镜像,直到找到需要的BLOCK,如果在构造前镜像的过程中所需的UNDO信息被覆盖了,就会报快照过旧的错误,这样ORACLE就实现了多版本,这就是ORACLE多版本的本质,我们现在也知道了为什么发出一条select 语句总是会看到consistant gets了。




的说法

正在修改数据,就会在相应的block上记录ITL,此时ORACLE发现ITL中记录的SCN大于SELECT时刻的SCN


现在ITL中记录的SCN ,应当就是指  Scn/Fsc 的值吧,都是0
这又如何去比较SELECT时刻的SCN呢?

麻烦指点迷津?
2#
发表于 2014-8-11 17:06:59
“正在修改数据,就会在相应的block上记录ITL,此时ORACLE发现ITL中记录的SCN大于SELECT时刻的SCN”

这个说法来源于哪里?

回复 只看该作者 道具 举报

3#
发表于 2014-8-11 17:12:11
诗檀软件-Oracle数据块损坏知识.pdf (2.67 MB, 下载次数: 856)

回复 只看该作者 道具 举报

4#
发表于 2014-8-11 21:28:00
Maclean Liu(刘相兵 发表于 2014-8-11 17:06
“正在修改数据,就会在相应的block上记录ITL,此时ORACLE发现ITL中记录的SCN大于SELECT时刻的SCN”

这个说 ...

这句话来自这个
http://blog.csdn.net/robinson1988/article/details/4721605

而且我看到其他blog ,也是这个意思
但是我确实没有 英文资料证实这个说法
但我觉得这是对的啊

例如 9点2分 事务T_1 修改了数据块 block_1
   但是9点1分 事务T_2已经发出了查询,但在9点3分才找到block_1

这时怎么保证一致性读呢?这时怎么比较当前数据块的数据是9点1分还是其他时间的呢?
只有比较ITL中的SCN吧?

回复 只看该作者 道具 举报

5#
发表于 2014-8-11 21:42:14
只有比较ITL中的SCN吧?==> 对于锁定,没有任何形式提交的事务 需要具体去查undo,而不需要这里的fsc/scn

回复 只看该作者 道具 举报

6#
发表于 2014-8-11 22:02:22
Maclean Liu(刘相兵 发表于 2014-8-11 21:42
只有比较ITL中的SCN吧?==> 对于锁定,没有任何形式提交的事务 需要具体去查undo,而不需要这里的fsc/scn ...


只有比较ITL中的SCN吧?==> 对于锁定,没有任何形式提交的事务 需要具体去查undo,而不需要这里的fsc/scn

那岂不是这种说法

当别的会话修改了数据,或者正在修改数据,就会在相应的block上记录ITL,此时ORACLE发现ITL中记录的SCN大于SELECT时刻的SCN

这种说法就不对?

因为ITL 中的SCN (我指的是scn/fsc)不一定有值啊?

那我的问题是 scn/fsc 什么时候有值呢? 一定要这个事务提交后吗?

我测试的时候,有时事务不提交,也是有值 的啊?

难道是我测试有误?

回复 只看该作者 道具 举报

7#
发表于 2014-8-11 23:25:53
etl2007 发表于 2014-8-11 22:02
只有比较ITL中的SCN吧?==> 对于锁定,没有任何形式提交的事务 需要具体去查undo,而不需要这里的fsc/scn ...

见3楼文档

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-21 02:15 , Processed in 0.052992 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569