热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

OracleSCN与检查点详解

这篇文章主要介绍了OracleSCN与检查点的相关内容,涉及SCN的定义,获取方式,以及检查点的相关介绍,需要的朋友可以了解下。

1.SCN 的定义

SCN(System Change Number ),也就是通常所说的系统改变号,是数据库中非常重要的 一个数据结构。

SCN 用以标识数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个惟一的 标识事务的SCN。SCN 同时被作为 Oracle数据库的内部时钟机制,可被看作逻辑时钟,每个 数据库都有一个全局的 SCN 生成器。

作为数据库内部的逻辑时钟,数据库事务依 SCN 而排序,Oracle 也依据 SCN 来实现一致性读 (Read Consistency )等重要数据库功能。另外对于分布式事务(Distributed Transactions), SCN 也极为重要,这里不作更多介绍。

SCN 在数据库中是惟一的,并随时间而增加,但是可能并不连贯。除非重建数据库,SCN 的值永远不会被重置为 0。

一直以来,对于 SCN 有很多争议,很多人认为 SCN 是指 System Commit Number ,而通常 SCN 在提交时才变化,所以很多时候,这两个名词经常在文档中反复出现。即使在Oracle 的 官方文档中,SCN 也常以 System Change/Commit Number 两种形式出现。 到底是哪个词其实不是最重要的,重要的是需要知道 SCN 是Oracle内部的时钟机制, Oracle通过SCN 来维护数据库的一致性,并通过 SCN 实施Oracle至关重要的恢复机制。 SCN 在数据库中是无处不在的,常见的事务表、控制文件、数据文件头、日志文件、数 据块头等都记录有 SCN 值。

冠以不同前缀,SCN 也有了不同的名称,如检查点SCN(Checkpoint SCN )、Resetlogs SCN 等。

2.SCN 的获取方式

可以通过如下几种方式获得数据库的当前或近似 SCN。

SQL> SELECT dbms_flashback.get_system_change_number FROM DUAL; 
GET_SYSTEM_CHANGE_NUMBER
------------------------
      6051905241299
SQL>

3.SCN 的进一步说明

系统当前SCN 并不是在任何的数据库操作发生时都会改变,SCN 通常在事务提交或回滚 时改变。在控制文件、数据文件头、数据块、日志文件头、日志文件 change vector 中都有 SCN,但其作用各不相同。

(1)数据文件头中包含了该数据文件的 Checkpoint SCN,表示该数据文件最近一次执行 检查点操作时的 SCN。

对于每一个数据文件都包含一个这样的条目,记录该文件的检查点 SCN 的值以及检查点 发生的时间,这里的Checkpoint SCN 、Stop SCN以及 Checkpoint Cnt 都是非常重要的数据 结构.

4.检查点

许多文档把Checkpoint 描述得非常复杂,为我们正确理解检查点带来了障碍,结果现在 检查点变成了一个非常复杂的问题。实际上,检查点只是一个数据库事件,它存在的根本意 义在于减少崩溃恢复(Crash Recovery )时间。

当修改数据时,需要首先将数据读入内存中(Buffer Cache),修改数据的同时,Oracle 会记录重做信息(Redo)用于恢复。因为有了重做信息的存在,Oracle 不需要在提交时立即 将变化的数据写回磁盘(立即写的效率会很低),重做(Redo)的存在也正是为了在数据库崩 溃之后,数据可以恢复。

最常见的情况,数据库可能因为断电而 Crash,那么内存中修改过的、尚未写入文件的 数据将会丢失。在下一次数据库启动之后,Oracle 可以通过重做日志(Redo)进行事务重演 (也就是进行前滚),将数据库恢复到崩溃之前的状态,然后数据库可以打开提供使用,之后 Oracle可以将未提交的事务进行回滚。

在这个过程中,通常大家最关心的是数据库要经历多久才能打开。也就是需要读取多少 重做日志才能完成前滚。当然用户希望这个时间越短越好,Oracle 也正是通过各种手段在不 断优化这个过程,缩短恢复时间。

检查点的存在就是为了缩短这个恢复时间。

当检查点发生时(此时的SCN 被称为Checkpoint SCN ),Oracle会通知DBWR进程,把 修改过的数据,也就是此Checkpoint SCN之前的脏数据(Dirty Data)从Buffer Cache 写入磁盘,当写入完成之后,CKPT进程更新控制文件和数据文件头,记录检查点信息,标 识变更。

Checkpoint SCN 可以从数据库中查询得到:

SQL> select file#,NAME,CHECKPOINT_CHANGE#,to_char(CHECKPOINT_TIME,'yyyy -mm-dd hh24:mi:ss') CPT from v$datafile; 
   FILE# NAME                                       CHECKPOINT_CHANGE# CPT
---------- -------------------------------------------------------------------------------- ------------------ --------------------
     1 /u01/app/oracle/oradata/orcl/system01.dbf                       6051905239995 2016 -05-05 04:14:32
     2 /u01/app/oracle/oradata/orcl/sysaux01.dbf                       6051905239995 2016 -05-05 04:14:32
     3 /u01/app/oracle/oradata/orcl/undotbs01.dbf                      6051905239995 2016 -05-05 04:14:32
     4 /u01/app/oracle/oradata/orcl/users01.dbf                       6051905239995 2016 -05-05 04:14:32
     5 /u01/app/oracle/oradata/orcl/example01.dbf                      6051905239995 2016 -05-05 04:14:32
     6 /u01/app/oracle/oradata/orcl/DEV_odi_user.dbf                     6051905239995 2016 -05-05 04:14:32
     7 /u01/app/oracle/oradata/orcl/apex_01.dbf                       6051905239995 2016 -05-05 04:14:32
     8 /u01/app/oracle/oradata/orcl/APEX_6121090681146232.dbf                6051905239995 2016 -05-05 04:14:32
8 rows selected

在检查点完成之后,此检查点之前修改过的数据都已经写回磁盘,重做日志文件中的相 应重做记录对于崩溃/实例恢复不再有用。

检查点的频度对于数据库的恢复时间具有极大的影响, 如果检查点的频率高,那么恢复时需要应用的重做日志就相对得少,恢复时间就可以缩短。 然而,需要注意的是,数据库内部操作的相关性极强,过于频繁的检查点同样会带来性能问 题,尤其是更新频繁的数据库。所以数据库的优化是一个系统工程,不能草率。

更进一步可以知道,如果Oracle 可以在性能允许的情况下,使得检查点的SCN 逐渐逼近 Redo的最新变更,那么最终可以获得一个最佳平衡点,使得 Oracle 可以最大化的减少恢复 时间。

为了实现这个目标,Oracle 在不同版本中一直在改进检查点的算法。

总结

以上就是本文关于Oracle SCN与检查点详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以参考:oracle 数据库启动阶段分析 、 Oracle EBS工具选项:关闭其他表单修改方法  、 oracle 虚拟专用数据库详细介绍   等。有什么问题可以随时留言,小编会及时回复大家的。


推荐阅读
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 在使用dedecms过程中,添加自定义字段变量很有用,但删除并不容易。本文介绍了两种常用的删除方法:执行SQL语句和手动SQL删除。 ... [详细]
author-avatar
黄可麟66032
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有