oracle scn跳变是什么意思,Oracle block scn什么时候发生变化

news/2025/1/25 19:34:30

我们知道block scn存在 block头中,其具体位置在block offset 8-13中,即占用6个字节。

用bbed查看,可以看到scn处于kcbh结构体中,其中offset 8-11属于scn的低8位,offfset 12-13属于scn的高4位。

struct kcbh, 20 bytes                      @0

ub1 type_kcbh                           @0

ub1 frmt_kcbh                           @1

ub1 spare1_kcbh                         @2

ub1 spare2_kcbh                         @3

ub4 rdba_kcbh                           @4

ub4 bas_kcbh                            @8           ub2 wrp_kcbh                            @12         ub1 seq_kcbh                            @14          ub1 flg_kcbh                            @15          ub2 chkval_kcbh                         @16          ub2 spare3_kcbh                         @18 那我们不禁有个疑问?此scn是什么时候产生的呢?是该block发生变化时,还是该block从buffer_cache刷到数据文件时产生的呢? 我们先做简要分析 假设会话开始于scn 1000,block scn记录的是block变化时scn (1)不论引起该block变化的事务提交与否,当block scn大于1000时,那么会话将读取该block后,为保证事务一致性会话将读取undo block(即consistent read)。 (2)不论引起该block变化的事务提交与否,当block scn小于1000时,那么会话将读取该block后,如果事务已提交,将直接读取结果。如果事务未提交,那再次读取undo block,构造一致性block。 采用此方法,当有多并发事务时,原理相似,并不会导致事务不一致。 如果block scn记录的是内存刷到数据文件时的current scn,那会有什么样的后果? 假设block变化scn为1500。block scn记录的是从block从buffer_cache刷到数据文件时产生,其scn为2000并已记录在block head中,且此block已不在内存中。 假设会话开始于scn 1600,当已引起该block变化的事务已提交,从事务一致性角度来讲,将直接读取block(即current read),但由于block head记录为scn 2000, 1600<2000,又满足consistent read条件(一直读到scn<1600,且事务已提交的scn为止),这样又会引起事务不一致。 经过以上分析,我们得出以下结论,block head记录的是该引起该block变化时的scn。 下面通过实验来解答上述结论。以下测试来自测试环境,数据库极少事务变化量。 首先查看表格zhoul在数据库的存放位置,由以下查询可知zhoul表格数据存放在7号文件block号为15511的数据块中。 SQL> col file# for 999 SQL> col block# for 99999 SQL> set linesize 300 SQL> select  dbms_rowid.ROWID_RELATIVE_FNO(rowid) file#,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#,i,name from zhoul; FILE# BLOCK#          I NAME ----- ------ ---------- --------------------     7  15511          1 aaa     7  15511          2 bbb     7  15511          3 ccc 为了获得比较干净的测试环境,首先切换一个归档日志,这样可以将其他事务的变化条目排除在这个online redolog之外。 SQL> alter system switch logfile; System altered. SQL> select * from zhoul;          I NAME ---------- --------------------          1 uuu          2 bbb          3 ccc 在内存中修改表格zhoul数据,注意将字段i=1修改成系统最新的scn值,并进行提交。这样该数据文件头在buffer_cache存储的scn将会比10995251185389略大 但应该会比10995251185563小。 SQL>  update zhoul set i=(select current_scn scn from v$database) where i=1; 1 row updated. SQL> commit; Commit complete. SQL> col i for 999999999999999999 SQL> select * from zhoul;                   I NAME ------------------- --------------------      10995251185389 uuu                   2 bbb                   3 ccc SQL> select current_scn i from v$database;                   I -------------------      10995251185563 打开statistic跟踪,可以看到全部为8个consistent gets,也就意味着15511号还在buffer_cache中。 SQL> set autot traceonly stat SQL> select * from zhoul; Statistics ----------------------------------------------------------           0  recursive calls           0  db block gets           8  consistent gets           0  physical reads           0  redo size         523  bytes sent via SQL*Net to client         400  bytes received via SQL*Net from client           2  SQL*Net roundtrips to/from client           0  sorts (memory)           0  sorts (disk)           3  rows processed 现在将buffer_cache中数据块刷出至数据文件中。 SQL> alter system flush buffer_cache; System altered. 获得包含此事务的online redolog SQL> set autot off      SQL> select member from v$log a,v$logfile b where a.group#=b.group# and a.status='CURRENT'; MEMBER -------------------------------------------------------------------------------- /oradata/mcstar/redo01.log 将redo01.log dump出来,由于本文只研究数据块写出操作,固只需dump layer为23,opcode为1的change。 SQL> alter system dump logfile '/oradata/mcstar/redo01.log' layer 23 opcode 1; System altered. 打开跟踪文件可以看到,其scn为 0x0a00.080a86ef,此值和bbed结果一致。 CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:  0 OP:23.1 Block Written - afn: 7 rdba: 0x01c03c97 BFT:(1024,29375639) non-BFT:(7,15511)                    scn: 0x0a00.080a86ef seq: 0x03 flg:0x06                                       BBED> dump block 15511 offset 0 count 20 File: /oradata/mcstar/zhoul01.dbf (0) Block: 15511            Offsets:    0 to   19           Dba:0x00000000 ------------------------------------------------------------------------ 06a20000 973cc001 ef860a08 000a0306 3f130000 进一步将0x0a00.080a86ef转换成10进制之后为10995251185391,此值比10995251185389略大,但小于10995251185563,也就证明了我们的猜想: block head的scn记录的是该block改变时的scn,并非从buffer_cache时刷出的scn。 SQL> col scn for 999999999999999 SQL> select to_number('0a00080a86ef','xxxxxxxxxxxx') scn from dual;              SCN ----------------   10995251185391


https://dhexx.cn/news/show-2301489.html

相关文章

oracle创建64位序列号,Oracle创建序列号

Oracle中的序列号顾名思义就是创建一个序列号&#xff0c;可以在插入或者更新的时候调用&#xff0c;相当于是一个生成器创建语法&#xff1a;create sequence myseincrement by 1 --增长度start with 1 --从哪里增加&#xff0c;就是说下一个获取的值从这个值开…

oracle t7 1,Oracle SPARC t7-1服务器介绍及配置参数

Oracle的SPARC t7 - 1服务器是一个单处理器系统&#xff0c;它使组织能够以相比其他方案更低的成本、更高的安全性和性能来响应IT需求。它是理想的企业类工作负载&#xff0c;包括数据库、应用程序、Java和中间件&#xff0c;特别是在云环境中。这个系统是基于SPARCM7处理器&am…

求列累计oracle rollup,oracle-rollup 跟cube分组累计求和

oracle--rollup 和cube分组累计求和group by 语句支持基本的having条件&#xff0c;还支持rollup和cube提供信息汇总功能&#xff0c;类似小计。rollup&#xff1a;纵向小计&#xff0c;从右向左逐个对每一列进行小结并在结果中生成独立的一行。只返回第一个分组条件指定的列的…

linux中打开php文件,如何从php文件重启Linux

我在Linux系统上有一个brftv用户&#xff0c;并且我有运行nginx的www-data。从终端我可以让我的brftv用户运行sudo /sbin/reboot自从我将以下内容添加到我的/ etc / sudoers文件的“ #user权限规范”部分后&#xff0c;它就可以正常工作&#xff1a;brftv ALLNOPASSWD: /sbin/h…

linux ssh 命令 密码错误,linux中ssh密钥登录失败解决办法

今天我在设置ssh密钥登录的时候&#xff0c;发现这个奇怪的情况&#xff0c;我将我的id_rsa.pub密钥内容拷贝到远程linux主机的A用户的.ssh下的authorized_keys(这个文件我手动建立的)下&#xff0c;但是再次登录时&#xff0c;发现还需要输入密码&#xff0c;额&#xff1f;这…

windows挂载linux共享文件夹,windows 挂载linux搭建的nfs共享文件夹目录

linux搭建nfs共享磁盘参考&#xff1a;linux配置NFS网络共享文件夹目录 ,下面详细说明windows如何挂载linux搭建的nfs共享文件夹。1.打开控制面-程序 打开或关闭windows功能-角色-添加角色-文件服务2.继续选择角色服务-网络文件系统服务-然后点击下一步安装3.挂载linux nfs共享…

Linux中用时较长的命令,超有用!20个 Unix/Linux 命令技巧

作者&#xff1a;nixCraft让我们用这些Unix/Linux命令技巧开启新的一年&#xff0c;提高在终端下的生产力。我已经找了很久了&#xff0c;现在就与你们分享。删除一个大文件我在生产服务器上有一个很大的200GB的日志文件需要删除。我的rm和ls命令已经崩溃&#xff0c;我担心这是…

linux 监视目录文件夹,linux文件文件夹递归监控

linux文件文件夹递归监控开发了一个规范的php composer包&#xff0c;使用的时候直接require即可。实现php版本的实现沿用了shell版本的思想&#xff0c;通过管道命令传递shell命令的结果&#xff0c;然后对结果做各种处理&#xff0c;达到我们监控文件的目的。为了完成这个功能…

linux 字符串格式化,Python 字符串的格式化两种方式

Python字符串的格式化分为两种&#xff1a;1)% 方式 2)str.format() 方式。str.format() 是比 % 较新的方式&#xff0c; 大多数的 Python 代码仍然使用 % 操作符。但最终会被str.format()代替&#xff0c;推荐使用str.format()1、% 方式1)用法%[(name)][flags][width].[pr…

linux中r语言操作,【R数据科学读书笔记】R语言中的管道操作

R语言中的管道操作这是R数据科学的读书笔记之一&#xff0c;《R数据科学》是一本教你如何用R语言进行数据分析的书。即便我使用R语言快2年多了&#xff0c;但是读这本书还是受益颇多。这一篇学习笔记对应第13章:使用magrittr进行管道操作。关于管道这个概念&#xff0c;我最早在…