楼主: chencheng523523

[笔记] ORACLE之实例恢复——前滚和回滚小结

[复制链接]
求职 : 数据库管理员
论坛徽章:
21
itpub2007年荐股参与纪念徽章
日期:2008-04-03 16:54:14itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50复活蛋
日期:2014-12-01 15:10:24蓝锆石
日期:2015-02-03 13:52:432015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31知识
日期:2015-05-27 16:53:28itpub13周年纪念徽章
日期:2014-09-28 10:55:55
11#
发表于 2012-9-4 09:17 | 只看该作者
chencheng523523 发表于 2012-9-3 20:48
LGWn的触发条件:1.用户进行直接的commit操作;2.距离上次LGWn写入操作超过三秒;3.Redo Buffer数据超过1 ...

你错了
写没有写到数据文件    和COMMIT操作没有关系的。。。  
举例:
create table t2 tablespace users as select * from dba_objects;
insert into t2 select * from t2; 不停的执行该DDL语句   (注意没有COMMIT)
观察users.dbf 文件在变大,说明没有递交  也写入了数据文件。。。。

所以你这个观点,是误区。。。。

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
21
itpub2007年荐股参与纪念徽章
日期:2008-04-03 16:54:14itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50复活蛋
日期:2014-12-01 15:10:24蓝锆石
日期:2015-02-03 13:52:432015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31知识
日期:2015-05-27 16:53:28itpub13周年纪念徽章
日期:2014-09-28 10:55:55
12#
发表于 2012-9-4 09:20 | 只看该作者
commit 字只可以保证一定写到日志文件中去了
至于有没有写入数据文件,这个是不一定的

日志优先于写数据文件,写到日志文件里面,但是没有写到数据问,数据库来的时候,可以通过日志来构造出来

使用道具 举报

回复
论坛徽章:
5
ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥运会纪念徽章:垒球
日期:2012-10-16 11:23:38双黄蛋
日期:2013-01-30 15:58:152013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-03-12 14:09:24
13#
 楼主| 发表于 2012-9-4 10:10 | 只看该作者
ses19828 发表于 2012-9-4 09:20
commit 字只可以保证一定写到日志文件中去了
至于有没有写入数据文件,这个是不一定的

受教了,

使用道具 举报

回复
论坛徽章:
5
ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥运会纪念徽章:垒球
日期:2012-10-16 11:23:38双黄蛋
日期:2013-01-30 15:58:152013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-03-12 14:09:24
14#
 楼主| 发表于 2012-9-4 11:58 | 只看该作者
本帖最后由 chencheng523523 于 2012-9-4 13:59 编辑

3、事务未结束,没有commit。这种时候,数据块Dirty Block上面是有事务槽信息,表示未结束事务,是不会将数据写入到数据文件中。但是,日志Log Buffer可能将部分未提交的DML操作项目写入到Log File中;

这句话确实不对。经过大家的指点,明白了commit和写数据到磁盘没有一毛钱关系。

数据从内存到磁盘,由DBWR进程执行将缓冲区写入数据文件,由LGWR进程将重做条目写入联机日志文件。

LGWn的触发条件:
用户进行直接的commit操作;
距离上次LGWn写入操作超过三秒;
Redo Buffer数据超过1/3或者超过1M大小;
DBWn启动,将Buffer Cache中的脏数据写入到文件中,在这之前会触发LGWn,将log buffer中的日志写入online redolog中。

DBWn的触发条件:
当Buffer Cache中缺少用于写入数据的clean block的时候,DBWn会开始将一些脏块“Dirty Block”写入到文件中,清理出一些可以使用的Clean Block;
CKPT进程启动会促使DBWn进程进行数据写入以及检查点的建立。

而执行COMMIT命令时,只执行如下操作:
1.为事务生成SCN:SCN是Oracle数据库的一种计时信息,用以保证事务的顺序性,
同时还用于失败恢复和保证数据库的读一致性和检查点,无论何时何人提交,SCN
自动加1;
2.将事务相关的未写入redo log file中的redo信息从redo log buffer写入到redo log
file,这才是真实的COMMIT,这步操作完成,说明我们已经完成COMMIT,事务从
V$TRANSACTION中移除;
3.V$LOCK中记录的SESSION关于该事务的锁会释放,其他需要这些锁的事务被唤醒;
4.执行块清理,清理块头保存的事务信息;

所以当满足DBWn的触发条件时,DBWn进程就会准备写数据到磁盘,此时他会触发LGWn,等把LGWR进程将重做条目写入联机日志文件完成后,,将在后台执行DBWn.
同时,oracle 采用了一个心跳的概念,以3秒的频率将dbwr 写的进度反应到控制文件中,也就是把dbwr当前刚写完的dirty buffer对应的scn 写入数据文件头和控制文件,这就是检查点scn。


本人对ORACLE体系结构认知甚浅,如果还有不对的,希望大师们继续指点

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
1
优秀写手
日期:2014-10-30 06:00:12
15#
发表于 2012-9-6 17:38 | 只看该作者
ses19828 发表于 2012-9-4 09:17
你错了
写没有写到数据文件    和COMMIT操作没有关系的。。。  
举例:

DDL语句隐式包含了commit

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
21
itpub2007年荐股参与纪念徽章
日期:2008-04-03 16:54:14itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50复活蛋
日期:2014-12-01 15:10:24蓝锆石
日期:2015-02-03 13:52:432015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31知识
日期:2015-05-27 16:53:28itpub13周年纪念徽章
日期:2014-09-28 10:55:55
16#
发表于 2012-9-7 10:29 | 只看该作者
Damon__Li 发表于 2012-9-6 17:38
DDL语句隐式包含了commit

是的,DDL命令  前后都个有一个commit....
这个举例的实验 只是说明当插入的大量的数据的时候,即使没有commit,也会写如数据文件。
试想:如果ORACLE不这么设计,不停的insert数据,内存根本就存不下那么大量的数据?

这些没有commit写入数据文件的数据,就当作了垃圾数据存放了。

使用道具 举报

回复
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
17#
发表于 2012-9-7 10:55 | 只看该作者
ses19828 发表于 2012-9-7 10:29
是的,DDL命令  前后都个有一个commit....
这个举例的实验 只是说明当插入的大量的数据的时候,即使没有 ...

ses19828 ===说的有道理;

以前我也以为 完成的事务没commit,,,,,,就不会写数据文件,,,,,,,那时所以一直困恼的的一个问题是: DDL产生的大量数据,它不存datafile里 存哪里? ---unduo 表空间?不可能,,,,,临时表空间? 也不可能,,,,,,,


所以只能暂存在数据表对应的表空间,,,,,,如果commit就标记完成,,,,如果未commit,此时实例崩溃,,,,则写入的数据就当垃圾数据!
-----不知我的理解是否正确! 请指正

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
21
itpub2007年荐股参与纪念徽章
日期:2008-04-03 16:54:14itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50复活蛋
日期:2014-12-01 15:10:24蓝锆石
日期:2015-02-03 13:52:432015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31知识
日期:2015-05-27 16:53:28itpub13周年纪念徽章
日期:2014-09-28 10:55:55
18#
发表于 2012-9-7 11:40 | 只看该作者
rabinwang 发表于 2012-9-7 10:55
ses19828 ===说的有道理;

以前我也以为 完成的事务没commit,,,,,,就不会写数据文件,,,,,,,那时所以一直 ...

是的, 未commit,此时实例崩溃。  oracle实例启来的时候,Rolling back 到未commit之前的状态。而这些已经写入数据文件的垃圾数据 ,还是保存在数据文件中,空间不会释放的。。。
有人会问为什么不释放空间? 因为如果立即释放需要消耗oracle一系列的资源,所以它不会这样干。以空间换高可用性。。oracle设计的多么巧妙。。。  当以后空间不够的时候,才会再去使用这些垃圾数据占用的空间。

使用道具 举报

回复
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
19#
发表于 2012-9-7 11:46 | 只看该作者
ses19828 发表于 2012-9-7 11:40
是的, 未commit,此时实例崩溃。  oracle实例启来的时候,Rolling back 到未commit之前的状态。而这些已经 ...

这些已经写入数据文件的垃圾数据 ,还是保存在数据文件中,空间不会释放的。。。有人会问为什么不释放空间? 因为如果立即释放需要消耗oracle一系列的资源,所以它不会这样干。以空间换高可用性
==================

你这样解释,有相关的文档或是做过实验或是........吗?

使用道具 举报

回复
论坛徽章:
5
ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥运会纪念徽章:垒球
日期:2012-10-16 11:23:38双黄蛋
日期:2013-01-30 15:58:152013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-03-12 14:09:24
20#
 楼主| 发表于 2012-9-7 13:25 | 只看该作者
求解惑

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表