Oracle SCN与检查点

2024-02-14 16:08
文章标签 oracle scn 检查点

本文主要是介绍Oracle SCN与检查点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.SCN 的定义

SCN(System Change Number ),也就是通常所说的系统改变号,是数据库中非常重要的 一个数据结构。本文地址:http://blog.csdn.net/sunansheng/article/details/51917941

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。

1
2
3
4
5
6
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 可以从数据库中查询得到:

1
2
3
4
5
6
7
8
9
10
11
12
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与检查点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708970

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计