SCN:

简单介绍SCN可称为系统改变号或者系统提交号,是Oracle内部的一种时间机制。

SCN的作用:

(1)一致性读,比如Oracle在读取数据时会比较读开始的SCN值和数据块的SCN值,从而判断哪些数据块需要从业务数据文件中读取,哪些块需要从undo数据文件中读取

(2)事务的唯一性:Oracle会给每一个事务都分配一个唯一的SCN,按SCN进行严格排序.

(3)介质恢复起点判断:在数据库异常宕机之后,Oracle后台进程可以根据数据文件头的SCN值判断出哪些数据文件需要恢复,并从控制文件的SCN值中判断出至少需要恢复至哪一个SCN。

几种常见的SCN:

1.控制文件中的SCN

2.数据文件头中的SCN

3.数据块中的SCN

4.日志文件头中的SCN

5.事务SCN

6.内存中的SCN

一:控制文件中的SCN:

1.数据库SCN:

数据库SCN通常表示最近一次完全检查点操作时的SCN

SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------1115719

也可以DUMP控制文件获取数据库的SCN

SQL> alter session set events 'immediate trace name controlf  level 8';
Session altered.SQL> select value from v$diag_info where name='Default Trace File';
VALUE
--------------------------------------------------------------------------------
/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3215.trc
DATABASE ENTRY
***************************************************************************(size = 316, compat size = 316, section max = 1, section in-use = 1,last-recid= 0, old-recno = 0, last-recno = 0)(extent = 1, blkno = 1, numrecs = 1)07/19/2020 06:54:42DB Name "PROD"Database flags = 0x00404001 0x00001200Controlfile Creation Timestamp  07/19/2020 06:54:43Incmplt recovery scn: 0x0000.00000000Resetlogs scn: 0x0000.000e2006 Resetlogs Timestamp  07/19/2020 06:54:45Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp  08/24/2013 11:37:30Redo Version: compatible=0xb200400#Data files = 5, #Online files = 5Database checkpoint: Thread=1 scn: 0x0000.00110647Threads: #Enabled=1, #Open=1, Head=1, Tail=1可以从中看到database checkpoint=0x0000.00110647转换成10进制为1115719与通过v$database查询一致

2.数据文件SCN:

可以通过v$datafile查询保存在控制文件中的数据文件SCN,该SCN主要有以下三种形式
数据文件头SCN:判断控制文件和数据文件是否一致的标准之一,如果不对数据文件做额外的操作,那么数据文件文件头SCN值将和数据库SCN保持一致
数据文件停止SCN:STOP SCN,该值在数据库处于打开状态或者异常关闭时为无穷大.
数据文件创建SCN:CREATION SCN,如果数据文件被误删除,在重新创建该数据文件时,Oracle会根据该SCN值定位需要应用的第一个归档日志。
以上SCN也保存在控制文件中.

dump转储控制文件查看:

DATA FILE #1: name #7: /oracle/app/oradata/prod/system01.dbf
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1tablespace 0, index=1 krfil=1 prev_file=0unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00Checkpoint cnt:111 scn: 0x0000.00110647 10/13/2020 22:13:54Stop scn: 0xffff.ffffffff 10/13/2020 21:54:00Creation Checkpointed at scn:  0x0000.00000007 08/24/2013 11:37:33thread:0 rba:(0x0.0.0)数据文件头SCN:scn: 0x0000.00110647
数据文件停止SCN: Stop scn: 0xffff.ffffffff
数据文件创建SCN:Creation Checkpointed at scn:  0x0000.00000007

3.checkpoint progress records中的SCN:

checkpoint progress records中的on disk scn表示当前系统最新RBA对应的SCN,由CKPT进程每3秒更新一次。

on disk scn的含义是当数据库异常宕机时,进行实例恢复的终点(应用到该SCN)。

dump转储控制文件查看:

THREAD #1 - status:0x2 flags:0x0 dirty:48
low cache rba:(0xa.2c36.0) on disk rba:(0xa.2f1e.0)
on disk scn: 0x0000.00110939 10/13/2020 22:27:22
resetlogs scn: 0x0000.000e2006 07/19/2020 06:54:45
heartbeat: 1053695356 mount id: 465556623SQL> select to_number('00110939','xxxxxxxxx') from dual;
TO_NUMBER('00110939','XXXXXXXXX')
---------------------------------1116473SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------1115719由于CHECKPOINT PROGRESS RECORDS由CKPT进程负责更新,也可以从基表x$kcccp中获得
SQL> select CPODS from x$kcccp where rownum < 2;
CPODS
----------------
1120334SQL>  select last_redo_change# from v$thread;
LAST_REDO_CHANGE#
-----------------1120334

二:数据文件头中的SCN

1.CREATION_CHANGE#

数据文件创建时SCN,该 值也保存在控制文件中.

可以通过v$datafile_header查询

SQL> select file#,creation_change# from v$datafile_header;FILE# CREATION_CHANGE#
---------- ----------------1                72             18343           9233284            161435           952195

2.CHECKPOINT_CHANGE#

表示数据文件头当前SCN,该值也保存在控制文件中。由CKPT进程在完全检查点时更新.

可以通过v$datafile_header查询

SQL> select file#,checkpoint_change# from v$datafile_header;FILE# CHECKPOINT_CHANGE#
---------- ------------------1            11157192            11157193            11157194            11157195            1115719

3.RESETLOGS_CHANGE#

RESETLOGS_CHANGE#表示数据库以resetlogs方式打开时的SCN,也可以通过v$datafile_header查询

SQL> select file#,resetlogs_change# from v$datafile_header;FILE# RESETLOGS_CHANGE#
---------- -----------------1            9257022            9257023            9257024            9257025            925702

4.CHANGE#

CHANGE#表示数据文件头冻结时的SCN。在做数据文件在线热备份时,常用将数据文件头冻结,表明从change#这个点开始对数据文件进行备份,可以从$backup查询

SQL> alter database begin backup;
Database altered.SQL> select file#,change# from v$backup;FILE#    CHANGE#
---------- ----------1    11209462    11209463    11209464    11209465    1120946

dump数据文件头查看以上SCN:

SQL> alter session set events 'immediate trace name file_hdrs level 10';
Session altered.SQL>  select value from v$diag_info where name='Default Trace File';
VALUE
--------------------------------------------------------------------------------
/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3558.trcV10 STYLE FILE HEADER:Compatibility Vsn = 186647552=0xb200400Db ID=457994418=0x1b4c70b2, Db Name='PROD'Activation ID=0=0x0Control Seq=899=0x383, File size=96000=0x17700File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 - SYSTEM  rel_fn:1
Creation   at   scn: 0x0000.00000007 08/24/2013 11:37:33
Backup taken at scn: 0x0000.00111ab2 10/14/2020 00:25:29 thread:1reset logs count:0x3e5b1335 scn: 0x0000.000e2006prev reset logs count:0x3121c97a scn: 0x0000.00000001recovered at 10/13/2020 21:53:28status:0x2004 root dba:0x00400208 chkpt cnt: 113 ctl cnt:112
begin-hot-backup file size: 96000
Checkpointed at scn:  0x0000.00111ab2 10/14/2020 00:25:29thread:1 rba:(0xa.5a08.10)1.Creation at scn: 0x0000.000000072.Checkpointed at scn:  0x0000.00111ab23.reset logs count:0x3e5b1335 scn: 0x0000.000e20064.Backup taken at scn: 0x0000.00111ab2 10/14/2020 00:25:29 thread:1附:在bbed中
kcvfhcrs表示creation_change,偏移量为100;
kcvfhrls表示resetlogs_change,偏移量为116
kcvfhsc表示change,偏移量128
kcvcpscn表示checkpoint_change,偏移量484

三:数据块中的SCN

1.数据块变化时的SCN

数据块发生变化时记录的SCN,保存在数据块offset 8-14中

dump转储一个数据块查看数据块变化的SCN

SQL> alter system dump datafile 1 block 16;
System altered.
SQL> select value from v$diag_info where name='Default Trace File';
VALUE
--------------------------------------------------------------------------------
/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3558.trc截取部分内容
Start dump data blocks tsn: 0 file#:1 minblk 16 maxblk 16
Block dump from cache:
Dump of buffer cache at level 4 for tsn=0 rdba=4194320
Block dump from disk:
buffer tsn: 0 rdba: 0x00400010 (1/16)
scn: 0x0000.00000023 seq: 0x01 flg: 0x04 tail: 0x00231e01
frmt: 0x02 chkval: 0x80ab type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1数据块发生变化时记录的SCN
scn: 0x0000.00000023

2.数据块事务槽中的SCN

如果一个数据块中有多个事务槽,表明允许有多个事务对数据块进行并发修改,当其中一个事务发生变化时,会在相应的事务槽登记变化时的SCN。事务槽中的SCN也可以在数据块dump文件中找到。

Block header dump:  0x004171c9Object id on Block? Yseg/obj: 0x15587  csc: 0x00.e2ad8  itc: 2  flg: -  typ: 2 - INDEXfsl: 0  fnx: 0x0 ver: 0x01Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.000e2ad8

3.数据块中数据行的SCN

如果在表级别打开ROW DEPENDENCIES,业务数据行发生更改时会在数据块中进行登记。

(1)创建测试表,插入3条数据,插入一条提交一条。并调用dbms_rowid获取3条测试数据的数据文件和数据块.SQL> create table test (a number) rowdependencies;
Table created.SQL> insert into test values(1);
1 row created.SQL> commit;
Commit complete.SQL> insert into test values(2);
1 row created.SQL> commit;
Commit complete.SQL> insert into test values(3);
1 row created.SQL> commit;
Commit complete.SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from test;FILE#     BLOCK#
---------- ----------1      946651      946651      94665
(2)dump数据块
SQL> alter system dump datafile 1 block 94665;SQL> select value from v$diag_info where name='Default Trace File';
VALUE
--------------------------------------------------------------------------------
/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3885.trc
(3)查看trace
less /oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3885.trcdata_block_dump,data header at 0x7fb539467a5c
===============
tsiz: 0x1fa0
hsiz: 0x18
pbl: 0x7fb539467a5c76543210
flag=--R-----
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f7c
avsp=0x1f5b
tosp=0x1f5b
0xe:pti[0]      nrow=3  offs=0
0x12:pri[0]     offs=0x1f94
0x14:pri[1]     offs=0x1f88
0x16:pri[2]     offs=0x1f7c
block_row_dump:
tab 0, row 0, @0x1f94
tl: 12 fb: --H-FL-- lb: 0x0  cc: 1
dscn 0x0000.00111de3
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f88
tl: 12 fb: --H-FL-- lb: 0x0  cc: 1
dscn 0x0000.00111de7
col  0: [ 2]  c1 03
tab 0, row 2, @0x1f7c
tl: 12 fb: --H-FL-- lb: 0x1  cc: 1
dscn 0x0000.00000000
col  0: [ 2]  c1 04
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 94665 maxblk 94665--------------
dscn:表示数据行的SCNSQL> select a,ora_rowscn from test;A ORA_ROWSCN
---------- ----------1    11217632    11217673    1121770

四:日志文件头中的SCN

1.FIRST_CHANGE#

表示redo日志文件被使用时的起始SCN,也叫被重用时的SCN,可以从v$log_history中查询。

2.NEXT_CHANGE#

表示redo日志文件被使用时的结束SCN,也叫重用结束时的SCN,可以从v$log_history中查询。

3.RESETLOGS_CHANGE#

表示数据库以RESETLOGS方式打开时的SCN。通常和数据文件头的RESETLOGS_CHANGE#相同,可以从v$log_history中查询。

DUMP日志文件头获取上述SCN:

SQL> alter session set events 'immediate trace name redohdr level 10'
SQL> select value from v$diag_info where name='Default Trace File';
VALUE
--------------------------------------------------------------------------------
/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_2539.trc截取部分内容:FILE HEADER:Compatibility Vsn = 186647552=0xb200400Db ID=457994418=0x1b4c70b2, Db Name='PROD'Activation ID=458015666=0x1b4cc3b2Control Seq=932=0x3a4, File size=102400=0x19000File Number=1, Blksiz=512, File Type=2 LOGFormat ID is 2redo log key is 5995abea5d855956889b4ae1d59cc188redo log key flag is 5descrip:"Thread 0001, Seq# 0000000010, SCN 0x00000010fd57-0x000000117064"thread: 1 nab: 0x65e4 seq: 0x0000000a hws: 0x8 eot: 0 dis: 0reset logs count: 0x3e5b1335 scn: 0x0000.000e2006Low scn: 0x0000.0010fd57 10/13/2020 21:53:31Next scn: 0x0000.00117064 10/14/2020 17:01:36Enabled scn: 0x0000.000e2006 07/19/2020 06:54:45Thread closed scn: 0x0000.00117062 10/14/2020 01:30:32Disk cksum: 0xda64 Calc cksum: 0xda64Terminal Recovery Stop scn: 0x0000.00000000Terminal Recovery Stamp  01/01/1988 00:00:00Most recent redo scn: 0x0000.00000000Largest LWN: 0 blocksMiscellaneous flags: 0x800000Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000Low scn: 0x0000.0010fd57
Next scn: 0x0000.00117064
reset logs count: 0x3e5b1335 scn: 0x0000.000e2006

五:事务开始时的SCN

Oracle为每一个事务都分配一个唯一的SCN值,事务开始时的SCN可以从v$transaction中查询

SQL> update test set A='6' where rownum=1;
1 row updated.SQL> select xidusn,start_scnb,start_scnw from v$transaction;XIDUSN START_SCNB START_SCNW
---------- ---------- ----------2    1148003          0dump回滚段头进行观察事务开始时的SCN
SQL> alter system dump undo header '_SYSSMU2_2996391332$';
System altered.截取部分
index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt
0x1e    9    0x00  0x03c4  0x0021  0x0000.00118363  0x00c01104  0x0000.000.00000000  0x00000001   0x00000000  1602666762
0x1f   10    0x80  0x03c4  0x0013  0x0000.00118463  0x00c01104  0x0000.000.00000000  0x00000001   0x00000000  0state为10表示这是一个未提交的事务,SCN表示事务开始SCN
SQL> select to_number(00118463,'xxxxxxx') from dual;
TO_NUMBER(00118463,'XXXXXXX')
-----------------------------1148003  //与通过v$transaction视图查询得出一致state为9表示一个已提交的事务

六:数据库的CURRENT SCN

数据库的current scn是Oracle当前最大的SCN。

SQL> select current_scn from v$database;
CURRENT_SCN
-----------1149821

Oracle 数据库中的多种SCN汇总相关推荐

  1. 调整oracle scn,ORACLE数据库中使用ADJUST_SCN增进SCN及案例模拟

    天萃荷净 使用ADJUST_SCN增进SCN及案例模拟ORA-00600: internal error code, arguments: [2662], [0] 在oracle数据库中我们可以利用o ...

  2. oracle scn参数,【学习笔记】Oracle数据库使用_MINIMUM_GIGA_SCN推进SCN案例

    天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库SCN故障解决办法,使用_MINIMUM_GIGA_SCN推进SCN案例. 最近帮朋友弄一个WIN环境的数据库,需要增加SCN值, ...

  3. oracle 数据 导出 excel 自动分多个文件,从oracle数据库中导出大量数据到excel中为什么自动分成了好几个excel文件《excel表格新手入门》...

    EXCEL中一个单元格中多行文本如何导入或复制到SQL SERVER 数据库表中? 保留换行符保存进数据表啊,读取出来显示的时候根据需要进行转换就行了,比如要在网页上显示,可以把换行符转换成HTML的 ...

  4. oracle数据库中最小的逻辑结构,Oracle数据库中基本逻辑结构简介

    Oracle数据库中Oracle的逻辑结构主要包括 有,表空间(tablespace),段(Segment) 以及区间(Extent) .如果你想对上述的这些内容有所了解的话, 你不妨浏览下面的文章, ...

  5. oracle中md5算法,oracle数据库中存储过程使用MD5算法加密

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFU ...

  6. ef oracle 双引号,Oracle 数据库中字符串和日期必须使用双引号标识。

    Oracle 数据库中字符串和日期必须使用双引号标识. 更多相关问题 平面的投影规律是什么 下列有关生活给水管网水力计算的叙述中,错误的是( ). 下列______材料消耗不属于预算定额中材料必须消耗 ...

  7. Softing dataFEED OPC Suite将西门子PLC数据存储到Oracle数据库中

    一 背景 现代工业产品不仅生产批量大,而且过程自动化程度高,这对于用户追溯产品设计与制造过程中产生的数据而言,无疑是个新的挑战.与此同时,制造商们对产品制造过程中产生的大量工艺数据也愈发重视,并不断寻 ...

  8. Oracle数据库中字符串相关字段类型辨析

    本文来自李明子csdn博客(http://blog.csdn.net/free1985),商业转载请联系博主获得授权,非商业转载请注明出处! 1 引子 字符串类型的字段在各关系数据库中均占有重要地位. ...

  9. Oracle数据库中对误删数据的快速恢复

    如果一不小心对Oracle数据库中的数据进行了误删除操作,那么如何进行数据恢复呢(不考虑全库备份和利用归档日志)?如果使用的是9i以及之后的版本,那么我们可以采用闪回技术对误删除的数据进行恢复.方式有 ...

最新文章

  1. 时间自适应卷积:比自注意力更快的特征提取器
  2. 又一次回到追寻梦想的地方
  3. 【OJ】洛谷顺序结构题单题解锦集
  4. React Native运行原理解析
  5. cmd合并多个ts文件,ffmpeg快速转ts为mp4文件,通过m3u8合并文件
  6. [学习笔记]在数据库层面应对并发访问产生的问题
  7. mongoDB在centos7上的安装
  8. ubuntu下取代ping的好工具tcpping
  9. 安装程序提示本地计算机已存在源,MSI文件安装错误码不再烦
  10. ucGUI3.9版本快速移植构建
  11. could not resolve property: qid of: org.lxh.myzngt.vo.Answer
  12. android 电脑 共享文件夹,安卓手机如何访问电脑局域网共享的文件
  13. 世界坐标、相机坐标、图像坐标、像素坐标的原理、关系,并用matlab仿真
  14. python3.6library 学习 1.introduction,2.built-infunction
  15. 找不到anaconda prompt
  16. 如何在企业不同发展阶段开展绩效管理?
  17. nacos注册中心死活发现不了服务问题
  18. root账号无法通过SSH登录阿里云ECS
  19. 活着,我们都想要别人的理解
  20. c语言实现五子棋人人对战教程

热门文章

  1. 哈佛区块链最新研究:NFT 2.0投资指南
  2. Go MD5加密解密用法
  3. Scalar Evolution
  4. [darknet源码系列-3] 在darknet中,如何根据解析出来的配置进行网络层构建
  5. 北极没冰川了。。。南极下起了冻雨。。。
  6. 网页上ajax异步加载数据,网页的异步请求(Ajax)
  7. mysql2000日期加减,SQL日期处理函数DATEADD和DATEDIFF详解
  8. pycharm左侧的导航栏有时候不见了
  9. 未来的计算机漫画,漫画电脑
  10. 泛微ecology 会签与非会签