1.oracle正常运行时,control文件的SCN是个很大的数,与redo log文件、数据文件的SCN不同,正常关闭时,做完checkpoint后,三者的SCN值相同;

Biti:日志文件中scn有起始和结束2个(高低),在current log中高scn同样为无穷大。2.当一个事务commit成功时,redo log文件中的SCN+1,当该事务所做的修改写入数据文件后,数据文件的SCN+1;

Biti:commit的时候加1,其他很多时候也会加1,只要数据库发生了变化都会增加。数据写入数据文件时scn不是加1而是由ckpt更新,检查点发生的时候才修改数据文件头的检查点计数并更新scn。3.疑问:

是不是如果一个事务比较大,在事务提交前就发生redo log entries、data buffer的写入,此时断电,则数据文件、redo log文件的SCN没有+1,且相同,但控制文件SCN不同,数据库startup时发生回滚。

Biti:数据文件是由ckpt进程更新文件头的,scn不是加1,而是更新为检查点发生那时的scn,回滚是根据回滚段头的事务表状态来进行的。

4.数据写入数据文件scn不是加1而是ckpt 更新,检查点发生的时候才修改数据文件头的 检查点计数和更新scn

是不是应该这么说?:

当ckpt 更新时发生数据写入,同时修改数据文件头的 检查点计数和更新scn 。当出现其他情况下的数据写入时(如无空闲缓冲等),不发生ckpt ,但SCN会增加。

Biti:这个时候修改的是数据块但不是数据文件头,只有检查点发生的时候才更新数据文件头,也就是说只有ckpt进程更新数据文件头(oracle8以前如果没有ckpt进程就是lgwr更新),dbwr只写数据块。

BTW:看样DBWR只是些数据块,只有CKPT进程才能更新数据文件头;5.commit的时候加一,其他很多时候也会加1,只要数据库发生了变化都会增加。

很多时候,能否举一些例子

Biti:dml一发生即使没有提交也会增加scn, job进程一样产生scn,只要对数据库中文件发生任何的改变都有可能产生scn,SCN: system change number, not system commit number .也就是系统发生变化时所产生的一个时间点

标志。不是提交的标志,只是因为提交也是系统的变化之一而已。

6.Biti:检查点的发生,跟写日志文件是没有必然联系的

检查点通知 DBWR 写数据文件,写完后ckpt更新控制文件头和数据文件头。

当DBWR写数据块的时候若发现数据块的相关 RDBA (位于日志文件的位置) 的 log block 还没有被写入日志文件,则在dbwr写块之前必须通知lgwr把log buffer 中日志写入日志文件。

7.data block 里面的SCN是当 block 被更改的时候的SCN

而数据文件有那么多 block,自然不同的 block有不同的SCN

block中存在 block SCN 和 ITL 中的commit SCN

block SCN 又在块头和块尾都有,若不一致意味着block损坏(热备可能出现这个情况,需要从redo log中拷贝回来,若是正在修改的过程中由于进程死掉则 pmon负责清理。若 由于一些以外发生这样的不一致的情况,则查询的时候出现 1578 错误,当然该错误号也可能是物理磁盘损坏,这里表示逻辑的损坏!)这个头和尾的SCN的检查时机跟这两个参数有关:

db_block_checking boolean FALSE

db_block_checksum boolean FALSE

该2参数信息请查阅http://tahiti.oracle.com

而ITL 中的 commit SCN 则跟 consistent gets and delay block cleanout 有关

数据文件头的 SCN 是检查点发生时更新的

代表着 当 恢复的时候从这个 SCN 点 开始在 log file 中寻找 redo 开始做恢复

8.According to Rama Velpuri's book, CKPT updates controlfiles, not their headers. It makes sense because if you look at a controlfile dump, the header doesn't even have an SCN. But the file body has sections for each datafile, and therefore each of them has an SCN to be updated.

It's odd that most books and also documentation don't even say CKPT updates controlfiles.

Follow-up to bellsz's original message. In controlfiles, the stop SCN is not a very big number; it's in fact set to infinity when the database is open. Also, SCNs are incremented for many reasons, mostly due to recursive transactions. Read Steve Adams and Hemant Chitale's answers athttp://groups.google.com/groups?sel...t_nospam.com.sg

9.

系统检查点scn(v$database(checkpoint_change#))

数据文件检查点(v$datafile(checkpoint_change#))

数据文件终止scn(v$datafile(last_change#))

数据文件中存放的检查点

启动scn (v$datafile_header(checkpoint_change#)

1>系统检查点scn

当一个检查点动作完成之后,Oracle就把系统检查点的SCN存储到控制文件中。

select checkpoint_change# from v$database

2>数据文件检查点scn

当一个检查点动作完成之后,Oracle就把每个数据文件的scn单独存放在控制文件

中。

select name,checkpoint_change# from v$datafile

3>启动scn

Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为启动scn,

因为它用于在数据库实例启动时,检查是否需要执行数据库恢复。

select name,checkpoint_change# from v$datafile_header

4>终止scn

每个数据文件的终止scn都存储在控制文件中。

select name,last_change# from v$datafile

在正常的数据库操作过程中,所有正处于联机读写模式下的数据文件的终止scn都为null.

5>在数据库运行期间的scn值

在数据库打开并运行之后,控制文件中的系统检查点、控制文件中的数据文件检查点scn

和每个数据文件头中的启动scn都是相同的。控制文件中的每个数据文件的终止scn都为null.

在安全关闭数据库的过程中,系统会执行一个检查点动作,这时所有数据文件的终止scn

都会设置成数据文件头中的那个启动scn的值。在数据库重新启动的时候,

Oracle将文件头中的那个启动scn与数据库文件检查点scn进行比较,

如果这两个值相互匹配,oracle接下来还要比较数据文件头中的启动scn和控制文件

中数据文件的终止scn。如果这两个值也一致,就意味着所有数据块多已经提交,所有

对数据库的修改都没有在关闭数据库的过程中丢失,因此这次启动数据库的过程

也不需要任何恢复操作,此时数据库就可以打开了。当所有的数据库都打开之后,

存储在控制文件中的数据文件终止scn的值再次被更改为null,

这表示数据文件已经打开并能够正常使用了。

10.

找了一些网页,发现SCN确实不只在事务提交时增加,以下是网页上的摘要:

1)

SCN means "System Change Number" not "System Commit Number".

However, because the SCN is always incremented at commits and seldom otherwise, it is OK to use the two terms interchangeably.

2)

The SCN is incremented whenever a transaction commits. However, this is not the only source of increments. In a seemingly idle database, the SCN gets incremented also through AQ, SMON, job queues...

1中说了oracle seldom操作也会引起SCN的增加,2中更明确说了AQ, SMON, job queues... 会导致SCN的增加,因此应该得出结论,在ORACLE中除了COMMIT会导致SCN增加外还有其它的ORACLE后台进程会导致SCN增加.

但是,是否是普通的DML导致了SCN的增加,还是由于DML操作过程中后台进程导致了SCN增加的假象?请大家踊跃讨论!

还有ORACLE后台进程在何时,何种情况下导致了SCN增加,也请大家踊跃讨论!

Biti:这句话我应该更准确第表达一下

如果一个dml导致产生事务,则会产生一个scn。这个意思是说

如果一个事务包含多个dml,则只有第一个初始产生事务的dml产生scn,提交的时候又是一个scn

如果一个事务只有一个dml,拿看起来就是dml产生一个scn,提交或者回滚产生一个scn

这是经过实验测试过的,如果你又兴趣,不紧紧是要找资料看,还可以动手证明。

你可以理解为 begin transaction and commit tansaction

至于没有dml的commit ,那不叫一个 transaction

你不做任何dml 而发出rollback命令 将会发现 v$sysstat 中 user rollbacks 将会增加 而 transactions 不会增加

所以你可以把结论定义为 事务的开始 和事务的结束都会导致 SCN 的增加,其他如 AQ/JOB 等也会产生SCN ……

同一个block上在一个事务中连续发生255个DML后scn也会增加

……

11.sys@DBAP01>select max(ktuxescnw*power(2,32)+ktuxescnb)from x$ktuxe;MAX(KTUXESCNW*POWER(2,32)+KTUX------------------------------52211024

已用时间:00:00:00.00

sys@DBAP01>alter system checkpoint;系统已更改。

已用时间:00:00:00.06

sys@DBAP01>select CHECKPOINT_CHANGE# from v$database;CHECKPOINT_CHANGE#------------------52211055

已用时间:00:00:00.00

sys@DBAP01>select max(ktuxescnw*power(2,32)+ktuxescnb)from x$ktuxe;MAX(KTUXESCNW*POWER(2,32)+KTUX------------------------------52211053

x$ktuxe 计算出来的是已经结束的最新的事务的commit scn ,所以可小于当前系统scn。 检查点scn 自然也小于当前系统scn。 但是 检查点scn 和 x$ktuxe 计算出来的大小却倚赖于 系统状况了。

current scn 是 系统当前所产生的最大 scn ,可能是当前未结束事务所产生的scn。 在9i 的dbms_flashback.get_system_change_number可以得到这个值,这个值应该是大于等于 x$ktuxe SCN (这个view 记录的是 当前数据库结束事务的最大scn)

mysql中的scn_关于SCN的理解(全面)相关推荐

  1. mysql scn_关于scn的理解

    系统检查点scn(v$database(checkpoint_change#)) 数据文件检查点(v$datafile(checkpoint_change#)) 数据文件终止scn(v$datafil ...

  2. mysql中having的意思_正确理解MySQL中的where和having的区别

    展开全部 1.where和having都可以使用的32313133353236313431303231363533e4b893e5b19e31333363383964场景select goods_pr ...

  3. Mysql中各种与字符编码集(character_set)有关的变量含义

    mysql涉及到各种字符集,在此做一个总结. 字符集的设置是通过环境变量来设置的,环境变量和linux中的环境变量是一个意思.mysql的环境变量分为两种:session和global.session ...

  4. MySQL时间戳和unix时间戳区别、MySQL中的时间类型

    文章目录 1 时间戳 1.1 unix时间戳(unix timestamp) 1.2 MySQL时间戳(timestamp) 2 MySQL中timestamp和datetime的不同点 3 MySQ ...

  5. MySQL笔记3:深入理解MySQL中的NULL

    深入理解MySQL中的NULL NULL:表示没有值,无法比较两个没有值的量.

  6. 第一百三十七期:一个简单的小案例带你理解MySQL中的事务

    事务又叫做TCL,全称是transaction control language,意思是事务控制语言. 作者:Java的架构师技术栈 事务又叫做TCL,全称是transaction control l ...

  7. buffer pool mysql_理解Mysql中的Buffer pool

    Buffer Pool在数据库里的地位 1.回顾一下Buffer Pool是个什么东西? 数据库中的Buffer Pool是个什么东西?其实他是一个非常关键的组件,数据库中的数据实际上最终都是要存放在 ...

  8. mysql中的事务_mysql中的事务,你理解嘛?

    事务又叫做TCL,全称是transaction control language,意思是事务控制语言.这篇文章还是属于我的mysql基础文章,在前面我们介绍了下面这些基础知识: 1.数据库的增查改删操 ...

  9. mysql中的scn,oracle数据库SCN概念

    目录 1.SCN的介绍 2.SCN的工作机制 3.SCN的增加 4.其他的SCN 5测试 6小结 7问题 1.SCN的介绍 Oracle中的SCN有下面几种: 1)系统检查点scn(v$databas ...

最新文章

  1. asp创建mysql表_asp创建数据库表
  2. Windows xp/Vista/Linux的内核映射以及内存置换算法
  3. X会员“圈养”长沙胃,盒马鲜生“有备而来”的会员制
  4. 52次课(mysql用户管理、常用sql语句、 mysql数据库备份恢复)
  5. 【01背包】最大约数和(jzoj 2126)
  6. MySQL+多线程+Redis+算法+网络
  7. dz论坛php.ini设置,Discuz!X1.5至3.2论坛Win主机与Linux主机伪静态设置方法
  8. 谷歌、微软、OpenAI等巨头七大机器学习开源项目 看这篇就够了
  9. mysql初级知识梳理与练习
  10. Android 性能分析岗位,2021Android最新大厂面试真题总结,架构师必备技能
  11. VSphere服务器ESXI4.1.0设置虚拟主机来电开机自启动
  12. 谐波小波 matlab,基于谐波小波的电力系统谐波分析
  13. 创建Oracle本地数据库详细步骤
  14. temp不停生成临时文件 win10_桌面出现temp文件夹|桌面出现大量临时文件|win10桌面temp文件夹是什么...
  15. 用python祝节日快乐_节日快乐祝福语有哪些?
  16. 《CornerNet: Detecting Objects as Paired Keypoints》之 corner pooling 解读
  17. 元素周期表的118个化学元素
  18. 【原创】C#玩高频数字彩快3的一点体会
  19. 计算机网络笔记及思维导图(1)——概述
  20. C51模拟PS2键盘(四)

热门文章

  1. 智能红绿灯是如何识别车牌的_百度文字识别
  2. 电大计算机基础应用操作题,2016年电大-电大 网考 计算机应用基础 操作题大全.doc...
  3. 最最简单的ensp拓扑图
  4. 利用chrome浏览器的F12功能提取网页中的视频、音乐
  5. 8163 android8,联发科MT8163V/A怎么样 MT8163V/A参数介绍
  6. 优雅安装电脑或手机实用软件与分享(持续更新)
  7. 别再翻了,面试二叉树看这 11 个就够了~
  8. 重磅 | 李飞飞最新演讲:ImageNet后,我专注于这五件事——视觉理解、场景图,段落整合、视频分割及CLEVR数据集...
  9. windows读写linux文件,【转载】在Windows下使用Ext2Fsd极速读写Linux硬盘
  10. 拒绝访问:终端上运行的LabVIEW版本,与主机计算机上运行的LabVIEW版本不同。对于实时终端,可通过MAX修改终端的语言环境,确保终端语言与主机语言一致。