- 浏览: 978843 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
孤星119:
好熟悉的数据库字段啊, 上家公司做的项目每天都跟这些字段打招呼 ...
Oracle exp compress参数引起的空间浪费 -
itspace:
quxiaoyong 写道遇到个问题,网上一搜,全他妈这篇文章 ...
数据库连接错误ORA-28547 -
quxiaoyong:
遇到个问题,网上一搜,全他妈这篇文章。你转来转去的有意思吗?
数据库连接错误ORA-28547 -
hctech:
关于version count过高的问题,不知博主是否看过ey ...
某客户数据库性能诊断报告 -
itspace:
invalid 写道写的不错,我根据这个来安装,有点理解错误了 ...
AIX 配置vncserver
我们知道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
用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
发表评论
-
buffer cache 的内部结构
2020-03-18 14:21 579BUFFER CACHE作为数据块的 ... -
Oracle OMC介绍
2020-03-18 13:19 487Oracle管理云服务(OMC)的大数据平台,自动收集的企业 ... -
参加Oracle勒索病毒防范专题培训会议
2019-09-27 17:15 5132019年7月22日,受邀参加Oracle勒索病毒防范专题培训 ... -
记一次内存换IO的Oracle优化
2019-09-27 16:50 827某客户数据库从P595物理 ... -
如何定位Oracle SQL执行计划变化的原因
2019-07-03 14:49 1460性能优化最难的是能够 ... -
如何定位Oracle SQL执行计划变化的原因
2018-10-30 09:24 1185性能优化最难的是能够 ... -
数据库性能优化目标
2018-10-08 10:59 518从数据库性能优化的场 ... -
数据库无法打开的原因及解决办法
2018-10-05 20:45 2120数据库的启动是一个相当复杂的过程。比如,Oracle在启动之前 ... -
怎么样彻底删除数据库?
2018-09-18 11:10 599Oracle提供了drop database命令用来删除数据库 ... -
Oracle减少日志量的方法
2018-09-10 10:17 867LGWR进程将LOG BUFFER中的 ... -
如何快速关闭数据库
2018-09-09 13:14 1233“一朝被蛇咬,十年怕井绳”。在没被“蛇”咬之前,很多DBA喜欢 ... -
关于《如何落地智能化运维》PPT
2018-05-17 10:19 1129在DTCC 2018发表《如何落地智能化运维》演讲,主要内容如 ... -
记录在redhat5.8平台安装oracle11.2容易忽视的几个问题
2018-05-11 19:58 578问题一:ping不通问题 在虚拟机上安装好linux系统后, ... -
《Oracle DBA实战攻略》第一章
2018-05-11 10:42 947即日起,不定期更新《OracleDBA实战攻略》一书电子版,请 ... -
Oracle 12c新特性
2018-05-11 10:33 900查询所有pdb [oracle@gj4 ~]$ sqlplu ... -
关于修改memory_target的值后数据库无法启动的问题
2017-02-28 12:24 3983操作系统:RHEL6.5 数据库版本:11.2.0.4 ... -
10g rac安装error while loading shared libraries libpthread.so.0 问题
2017-02-28 12:22 69511g rac安装在二节点跑脚本一般会报此错误: 解决这个问 ... -
记一次Oracle会话共享模式故障处理过程
2017-02-27 19:16 801故障简述 XXX第八人民医院HIS数据库7月13日11点左右从 ... -
RESMGR:cpu quantum等待事件处理过程
2017-02-27 18:23 2615由于数据库上线过程中出现大量的RESMGR:cpu quant ... -
谈谈log file sync
2014-03-19 14:18 1759数据库中的log file sync等待事件指的是,当user ...
相关推荐
每次数据块发生变化时,SCN都会递增。SCN在Oracle的事务管理中起到关键作用,用于判断数据的一致性和完整性。当同一个SCN影响超过254行数据时,将会为这个事务分配一个新的SCN。 Oracle数据块还可能包含数据的校验...
为什么 Oracle 不使用时间来界定操作的顺序?这是因为如果使用机器上的时间来区分操作顺序,将会出现问题。例如,在北京时间 8:00 执行一条 DML 语句,然后修改机器上的时间为 7:00,再执行一条 DML 语句。如果用...
Oracle Recovery Tools是惜分飞(www.xifenfei.com)开发的使用于Oracle数据库恢复的小工具 主要功能: 1. Oracle 单个/批量坏块修复 2. Oracle 单个block...8. 修改oracle进程内存中内容,常见使用于修改oracle scn等
在增量备份过程中,RMAN会比较当前数据块的SCN与上一次备份时的Checkpoint SCN,如果当前数据块的SCN大于或等于Checkpoint SCN,则认为该数据块已发生变化,需要被备份。 - **变化跟踪文件 (Change Tracking File):...
SCN是Oracle内部使用的数字序列,每当数据库发生变化时(如插入、更新、删除等操作),SCN就会递增。SCN在恢复过程中扮演着关键角色,特别是在处理Checkpoint机制时。 **Checkpoint** 是一种重要的维护机制,它确保...
在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢?...但是,默认情况下,每行记录的ORA_ROWSCN是基于Block的,除非在建表的时候开启行级跟踪。 SELECT MAX(ORA_ROWSCN), SCN_TO_TIMESTAMP(MAX(ORA
Oracle Recovery Tools是惜分飞(www.xifenfei.com)开发的使用于Oracle数据库恢复的小工具 主要功能: 1. Oracle 单个/批量坏块修复 2. Oracle 单个block...8. 修改oracle进程内存中内容,常见使用于修改oracle scn等
oracle 11g 数据文件头block 1解析 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ##powered by :黄林杰_Huanglinjie ##version : 2023-v11 ##联系方式:17767151782 ##blog: https://blog.csdn.net/lixora/ ##info: ...
17. DBWR undo block writes (V$SESSTAT1/[SYS]/ABCDEF/ORACLE.EXE) (绝对) DBWR写入回滚块的次数,用于回滚未完成的事务。 18. DDL statements DDL(数据定义语言)语句,如CREATE、ALTER和DROP,用于创建、修改和...
oracle数据块修复工具 修复单个block 坏块 标记单个block为坏块 查看数据块内容 修改数据块中数据 修复数据文件头SCN信息 修复数据文件头resetlogs 信息 修复数据文件头fuzzy信息 数据块拷贝
DBVERIFY 工具的参数包括 FILE、START、END、BLOCKSIZE、LOGFILE、FEEDBACK、PARFILE、USERID、SEGMENT_ID、高SCN 等。其中,FILE 指定要验证的文件,START 指定起始块,END 指定结束块,BLOCKSIZE 指定逻辑块大小,...
- **Block Size**: 数据块大小由`DB_BLOCK_SIZE`初始化参数决定,需为操作系统块大小的倍数。 以上内容涵盖了Oracle原厂培训笔记中的关键知识点,从认证体系、课程安排、产品技术概述到数据库架构与性能优化等方面...
Block Change Tracking是Oracle 10g引入的一项新技术,其主要作用在于记录数据文件中发生更改的数据块的信息。通过这种方式,可以在进行增量备份时仅备份那些已更改的数据块,从而提高备份效率。 - **工作原理**: ...
在Oracle数据库管理中,遇到REDO文件block损坏的情况是一种较为复杂且紧急的问题,尤其是在Oracle 8版本中。本文将详细解析此类问题的成因、影响以及解决方案,旨在为数据库管理员提供一套行之有效的应对策略。 ###...
一个数据块(Block)是 Oracle 数据库中的最小存储单元,它是数据文件(Datafile)中的一部分。每个数据块的大小可以是 2k、4k、8k 或 16k 等,取决于数据库的设置。 在 Oracle 数据库中,数据块的结构主要包括以下...
5. **修复数据文件头 SCN 信息**:SCN(System Change Number)是Oracle数据库中用于跟踪事务顺序的关键信息。如果SCN出现异常,工具可以帮助用户设置一个新的checkpoint SCN,然后修复相关文件头,确保数据库的一致...
- **定义**: SCN(System Change Number)是Oracle数据库用来跟踪所有数据更改的一个内部序列号,它是一个递增的数字,每当数据库发生任何变化时都会更新。 - **存储位置**: SCN存在于控制文件(Controlfile)、重做...
Oracle原理学习笔记 Oracle是一种关系数据库...如果数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交。如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚。
Oracle数据库有两种Checkpoint:一种是Consistent Checkpoint,它出现在日志的末尾,用于保证Oracle可以在任何时候打开数据库;另一种是Inconsistent Checkpoint,它和数据文件的检查点对应,用于崩溃恢复。 驱动...