暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle异常恢复实战第2讲 - 深入理解Controlfile_笔记

四九年入国军 2024-09-03
96
  感兴趣的还是记得去看原帖子,笔记有删减,原作者微信公众号:  1、关于SCN的一些基本概念和知识点
     SCN,即为system commit number(也有人说是system change number),它是一个递增的数字,可以理解为一个递增非连续的sequence,
最大值为0xffff.ffffffff(转换10进制是281474976710655)。

    对于单实例:scn值是存放于SGA中的,是通过system commit number latch来保护的,要获得scn,就需要先得到这个latch。
	对于RAC环境: scn是通过排队机制(enqueue)来实现各节点之间的顺序增长的。其中的算法有2种,就是大家所熟知的lamport和commit广播。
	可以通过参数 max_commit_propagation_delay 来控制2种算法的切换,该值默认是700(厘秒),
	lamport算法;如果该值小于100(厘秒),oracle会使用commit广播算法。
	
	关于scn增速:
	在2012年第1季度cpu推出后,引发了不少关于scn 的问题,其中引发了网上关于scn 相关bug的讨论。当scn增长出现异常,可以导致scn耗尽的情况:
	  在11.2.0.2版本之前,scn 的最大增长频率是16k,
	  在11.2.0.2版本开始,为32k,有如下参数进行控制:_max_reasonable_scn_rate

11.2.0.4和19c显示一样:	
	NAME                                     VALUE                D S S M A DESCRIPTION
---------------------------------------- -------------------- - - - - - ----------------------------------------------------------------------
_max_reasonable_scn_rate                 32768                Y N N N N Max reasonable SCN rate
	


 2、SCN的分类有哪些?   在oracle中存在很多种scn,但是只有如下几种,是我们比较关注的:

Commit scn/cleanout scn                                                 --主要存在于data block中
database scn/on disk scn/thread scn/datafile checkpoint scn/start scn   --存在于controlfile和datafile中
offline scn/online scn
resetlogs scn
stop scn
low/high scn


下面我们通过实验来展示,描述上述几种scn,便于大家加深理解。

2.1 Commit scn/cleanout scn
 create table t1(a number);
 insert into t1 values(1);
 insert into t1 values(2);
 insert into t1 values(3);
 commit;
 select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) blk#   from t1;
     FILE#       BLK#
---------- ----------
         4        179
         4        179
         4        179
		 
--dump block 
sqlplus / as sysdba
alter system checkpoint;--让脏数据落盘,要不dump的数据不准确
oradebug setmypid
alter system dump datafile 4 block 179;
oradebug tracefile_name


---此时的dump trace如下
Start dump data blocks tsn: 4 file#:4 minblk 179 maxblk 179
........
buffer tsn: 4 rdba: 0x010000b3 (4/179)
scn: 0x0000.0011983a seq: 0x01 flg: 0x06 tail: 0x983a0601                         --scn: 0x0000.0011983a 是block scn,转换成10进制是 1153082
frmt: 0x02 chkval: 0x2c1d type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00002AAAADD26A00 to 0x00002AAAADD28A00
..........                                                                        --cleanout scn 和事务有关系,Oracle更新数据块时,会产生一个Cleanout SCN
 seg/obj: 0x1553f  csc: 0x00.119839  itc: 2  flg: E  typ: 1 - DATA                --csc: 0x00.119839,这个是cleanout scn,最后一次 full cleanout时的scn,转换成10进制是1153081
     brn: 0  bdba: 0x10000b0 ver: 0x01 opc: 0
     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc          --Scn/Fsc 表示commit scn或者 fast commit scn,和事务一一对应:1153082
0x01   0x000a.01f.00000294  0x00c00116.0073.37  --U-    3  fsc 0x0000.0011983a
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000



/*************修改第二条数据后再次dump block查看变化********************/
update t1 where a=4 where a=2;
commit;
alter system checkpoint;
................................
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc        --这里有2条记录
0x01   0x000a.01f.00000294  0x00c00116.0073.37  C---    0  scn 0x0000.0011983a   
0x02   0x0001.00b.00000294  0x00c0206f.0086.0d  --U-    1  fsc 0x0000.0011a0cf  


Flag:事务标志位含义:
C--- = transaction has been committed and locks cleaned out
-B-- = this undo record contains the undo for this ITL entry
--U- = transaction committed (maybe long ago); SCN is an upper bound
---T = transaction was still active at block cleanout SCN的分类有哪些? 


--备注:
   1、cleanout分为2钟,一种是fast commit cleanout,另一种是delayed block cleanout;  
   2、COMMIT或者rollback时,如果块仍在块缓冲区中,Oracle会执行一个很快的清理,这叫做 快速块清除(FAST BLOCK CLEANOUT);
     反之,modified block已经被写回磁盘,当发生commit时oracle并不会把block重新读入做cleanout,这样成本太高,而是把cleanout留到下一次对此块的dml时来完成-延迟清理
   3、如果该事务没有涉及延时块清除,那么显示的FSC。 如果是延时块清除(delayed block cleanout),那么显示的就是SCN。
       
   
   
2.2 database checkpoint scn/on disk scn/thread scn/datafile checkpoint scn --存在于controlfile和datafile中

所谓检查点scn(checkpoint scn),也就是指在检查点发生的时候,产生的scn值,该值是相当重要的,在我们进行文件头修复等数据库恢复时,起着至关重要的作用


select file#,STATUS,CHECKPOINT_CHANGE#,ONLINE_CHANGE# from v$datafile;

     FILE# STATUS         CHECKPOINT_CHANGE# ONLINE_CHANGE#
---------- -------------- ------------------ --------------
         1 SYSTEM                    1155938         925702
         2 ONLINE                    1155938         925702
         3 ONLINE                    1155938         925702
         4 ONLINE                    1155938         925702

select file#,STATUS,CHECKPOINT_CHANGE#,CHECKPOINT_COUNT from v$datafile_header order by 1;

     FILE# STATUS         CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------- -------------- ------------------ ----------------
         1 ONLINE                    1155938              140
         2 ONLINE                    1155938              140
         3 ONLINE                    1155938               61
         4 ONLINE                    1155938              139

  
--v$datafile的checkpoint信息是来自controlfile   
--v$datafile_header的checkpoint 信息是来自数据库文件头

我们首先来dump controlfile和datafile header的信息,进行观察

oradebug setmypid
alter session set events 'immediate trace name CONTROLF level 4';
alter session set events 'immediate trace name FILE_HDRS level 3';
oradebug close_trace
oradebug tracefile_name


此时的控制文件dump 信息如下所示:
   

DATA FILE #1:
  name #7: /oradata/orcl/system01.dbf
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:140 scn: 0x0000.0011a362 09/02/2024 12:16:25     --1155938
 Stop scn: 0xffff.ffffffff 08/29/2024 18:21:01
 Creation Checkpointed at scn:  0x0000.00000007 08/24/2013 11:37:33
 thread:0 rba:(0x0.0.0)
 
这里重点解释一下几个关键点:
Checkpoint cnt:           表示checkpoint count值
scn: 0x0000.0011a362   这就是存于datafile 头部的checkpoint scn. 也被称为start scn
Stop scn: 0xffff.ffffffff   在数据库open的情况下,该值是被置于无穷大的,因为数据库不知道最后的值是什么,而当你正常停库时,该值会等于database checkpoint scn和datafile checkpoint scn.


2.3 offline scn/online scn
当表空间或数据文件被offline时,其对应的数据文件的scn会写入一个值,被称为offline scn:



select file#,checkpoint_change# from v$datafile where ts#=6;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         5            1168392

select file#,checkpoint_change# from v$datafile_header where ts#=6;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         5            1168392
		 
alter tablespace test offline;		 

此时我们分别使用前面的命令dump控制文件和数据文件头,这里省略dump命令,trace内容如下:

--controlfile

DATA FILE #5:
  name #9: /oradata/orcl/test01.dbf
creation size=12800 block size=8192 status=0x80 head=9 tail=9 dup=1
 tablespace 6, index=6 krfil=5 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:13 scn: 0x0000.0011d538 09/02/2024 17:32:19                    --0011d538 十进制是1168696
 Stop scn: 0x0000.0011d538 09/02/2024 17:32:19                                --stop scn =checkpoint scn 
 Creation Checkpointed at scn:  0x0000.0011ce7f 09/02/2024 17:03:33
 thread:1 rba:(0x18.73eb.10)
 ......
 Offline scn: 0x0000.0011d32e prev_range: 1                                   --当数据文件offline的时候 ,offline scn 并不等于stop scn   
 Online Checkpointed at scn:  0x0000.0011d341 09/02/2024 17:29:12            --online scn 这个值是历史的,如果online这个值会被更新
 
--datafile HEADER
DATA FILE #5:
  name #9: /oradata/orcl/test01.dbf
creation size=12800 block size=8192 status=0x80 head=9 tail=9 dup=1
 tablespace 6, index=6 krfil=5 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:13 scn: 0x0000.0011d538 09/02/2024 17:32:19
 Stop scn: 0x0000.0011d538 09/02/2024 17:32:19
 Creation Checkpointed at scn:  0x0000.0011ce7f 09/02/2024 17:03:33
 thread:1 rba:(0x18.73eb.10)
 .............
 Offline scn: 0x0000.0011d32e prev_range: 1
 Online Checkpointed at scn:  0x0000.0011d341 09/02/2024 17:29:12
 thread:1 rba:(0x18.75d5.10)
 
 
 Stop scn = Checkpoint scn
 
 此时我们切换一次日志,再次观察checkpoint的变化情况:
 alter system switch logfile;
 select file#,STATUS,CHECKPOINT_CHANGE#,ONLINE_CHANGE# from v$datafile;
     FILE# STATUS         CHECKPOINT_CHANGE# ONLINE_CHANGE#
---------- -------------- ------------------ --------------
         1 SYSTEM                    1168392         925702
         2 ONLINE                    1168392         925702
         3 ONLINE                    1168392         925702
         4 ONLINE                    1168392         925702
         5 OFFLINE                   1168696        1168193


select file#,STATUS,CHECKPOINT_CHANGE#,CHECKPOINT_COUNT from v$datafile_header order by 1;
     FILE# STATUS         CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------- -------------- ------------------ ----------------
         1 ONLINE                    1168392              146
         2 ONLINE                    1168392              146
         3 ONLINE                    1168392               67
         4 ONLINE                    1168392              145
         5 OFFLINE                         0                0

 我们可以看到一旦文件被offline之后,查询v$datafile_header就看不到该文件检查点信息了,但是实际上文件头上的信息仍然存在。我们来试试能否正常online文件。

alter  tablespace test online;		 

--control trc
DATA FILE #5:
  name #9: /oradata/orcl/test01.dbf
creation size=12800 block size=8192 status=0xe head=9 tail=9 dup=1
 tablespace 6, index=6 krfil=5 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:14 scn: 0x0000.0011d5f1 09/02/2024 17:40:34
 Stop scn: 0xffff.ffffffff 09/02/2024 17:32:19                                   --stop scn 变成无穷大   
 Creation Checkpointed at scn:  0x0000.0011ce7f 09/02/2024 17:03:33
 thread:1 rba:(0x18.73eb.10)
........
 Offline scn: 0x0000.0011d538 prev_range: 2                                      --offline scn 是历史上一次的scn
 Online Checkpointed at scn:  0x0000.0011d5f1 09/02/2024 17:40:34                --online  checkpoin scn  更新成了checkpoint scn 
 thread:1 rba:(0x19.5.10)
 
 
 
 从上面的小实验,我们可以得出如下结论:   
 1. archivelog模式下,当表空间offline时,其对应数据文件头stop scn会更新,
     offline scn不等于stop scn.   
 2. 当online后,对应的数据文件头的online scn等于datafile checkpoint scn值。   
 3. 当online后,controlfile中关于该表空对应的datafile和对应的数据文件头的stop scn都会重新被置于最大值,即为无穷大.
 

2.4 resetlogs scn

 什么是resetlogs scn呢?顾名思义,就是当我们以open resetlogs方式打开数据库时对应的scn值。我们在进行数据库恢复时,经常遇到这个,
可能需要通过bbed来修改文件头的resetlogs scn。那什么时候会遇到呢?
   比如当你空间文件丢失或者损坏时,重建控制文件时遗留了数据文件,并resetlogs操作过数据库(即使open resetlogs失败),
   那么你也会发现,此时你数据库的数据文件的resetlogs scn会不一致。要想进行恢复,就必须要去修改文件头resetlog scn
   
--来观察resetlog scn:

***************************************************************************
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)
 08/29/2024 10:19:44
 DB Name "ORCL"
 Database flags = 0x00404001 0x00001200
 Controlfile Creation Timestamp  08/29/2024 10:19:44
 Incmplt recovery scn: 0x0000.00000000
 Resetlogs scn: 0x0000.000e2006 Resetlogs Timestamp  08/29/2024 10:19:46      --Resetlogs scn 
 Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp  08/24/2013 11:37:30  --Prior resetlogs scn 是上一次resetlogs的scn
 Redo Version: compatible=0xb200400
 #Data files = 5, #Online files = 4
 Database checkpoint: Thread=1 scn: 0x0000.0011d77a
 Threads: #Enabled=1, #Open=1, Head=1, Tail=1
 
同样,我们如果去观察数据库文件头的话,也能看到resetlogs scn等结构,这里我用bbed来查看更方便(注意这些结构都存在于数据文件头),如下:

BBED> info all;
 File#  Name                                                        Size(blks)
 -----  ----                                                        ----------
     1  /oradata/orcl/system01.dbf                                       94720
     2  /oradata/orcl/sysaux01.dbf                                       66560
     3  /oradata/orcl/undotbs01.dbf                                       8960
     4  /oradata/orcl/users01.dbf                                          640
     5  /oradata/orcl/test01.dbf                                         12800

BBED> set file 2 block 1                                     
        FILE#           2
        BLOCK#          1

BBED> p kcvfhrls
struct kcvfhrls, 8 bytes                    @116     
   ub4 kscnbas                              @116      0x000e2006    -- 对应上面trc的 Resetlogs scn: 0x0000.000e2006
   ub2 kscnwrp                              @120      0x0000

BBED> p kcvfhprs
struct kcvfhprs, 8 bytes                    @420     
   ub4 kscnbas                              @420      0x00000001    --对应上面的 Prior resetlogs scn: 0x0000.00000001 
   ub2 kscnwrp                              @424      0x0000

BBED> 

至少在如下几种情况下,我们可以利用到resetlogs scn.   
1)  修复controlfile和datafile header时   
2)  当我们resetlogs 后失败会,该值会更新,如果需要重新恢复到原始状态,需要进行修复。  
 


2.5 Stop scn
   首先一个问题,什么是stop scn?stop scn 值在什么地方?它有什么作用  ?s
     答: stop scn,顾名思义是指数据库或数据文件在某个时刻处于停止状态时的scn值,当处于run状态时,该值是被设置为无穷大的。
	 
shutdown immediate;
startup mount;
select file#,name,last_change# from v$datafile order by 1;
     FILE# NAME                                               LAST_CHANGE#
---------- -------------------------------------------------- ------------
         1 /oradata/orcl/system01.dbf                              1170472
         2 /oradata/orcl/sysaux01.dbf                              1170472
         3 /oradata/orcl/undotbs01.dbf                             1170472
         4 /oradata/orcl/users01.dbf                               1170472
         5 /oradata/orcl/test01.dbf                                1170472

DATA FILE #1:
  name #7: /oradata/orcl/system01.dbf
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:149 scn: 0x0000.0011dc28 09/02/2024 18:14:22               --0011dc28 十进制 1170472
 Stop scn: 0x0000.0011dc28 09/02/2024 18:14:22                             --Checkpoint scn = stop scn  
 Creation Checkpointed at scn:  0x0000.00000007 08/24/2013 11:37:33
 thread:0 rba:(0x0.0.0)
 enabled  threads:  00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000 00000000 00000000 00000000 00000000
 Offline scn: 0x0000.000e2005 prev_range: 0
 Online Checkpointed at scn:  0x0000.000e2006 08/29/2024 10:19:46
 thread:1 rba:(0x1.2.0)

 我们发现此时database checkpoint scn和stop scn是相同的
 
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)
 08/29/2024 10:19:44
 DB Name "ORCL"
 Database flags = 0x00404001 0x00001000
 Controlfile Creation Timestamp  08/29/2024 10:19:44
 Incmplt recovery scn: 0x0000.00000000
 Resetlogs scn: 0x0000.000e2006 Resetlogs Timestamp  08/29/2024 10:19:46
 Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp  08/24/2013 11:37:30
 Redo Version: compatible=0xb200400
 #Data files = 5, #Online files = 5
 Database checkpoint: Thread=1 scn: 0x0000.0011dc28      --控制文件 scn
 Threads: #Enabled=1, #Open=0, Head=0, Tail=0
 

	    对于正常停库的情况下,stop scn值是等于datafile checkpoint scn值的。数据库启动时,Oracle将数据文件头中的stop scn与datafile checkpoint scn比较,
	如果这两个值匹配,Oracle接下来再比较数据文件头中的SCN和控制文件中数据文件的stop scn,如果这个值也匹配,就意味着所有数据块已经提交,
	因此数据库不需要进行恢复,此时数据库直接打开。

     如果stop scn为null,那么就需要进行实例恢复。如果stop  scn小于datafile checkpoint scn或database checkpoint scn,
	 

2.6 high scn/low scn
    oracle的redo log日志文件中,其实也存在着一种scn,那就是high scn/low scn。我们首先通过试图来查询了解一下:
	
	select recid,sequence#,first_change#,next_change# from v$log_history;
     RECID  SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
         1          1        925702       925968
         2          2        925968       928868
         3          3        928868       941331
.....................................
        23         23       1152366      1154604
        24         24       1154604      1168865
        25         25       1168865      1169270
	
那么什么是low scn呢?什么是high scn?如果用上面的查询来解释,那么就可以简单的理解为:     
   first_change#就是low scn,而next_change#值就是high scn. 
 简单的讲,redo log scn,是指redo log在进行切换时刻对应的scn值,而scn又对应着时间,在进行实例恢复时,是需要通过该值来确认需要应用哪些archivelog或redo log的.


oradebug setmypid
ALTER SESSION SET EVENTS 'immediate trace name loghist level 1';
oradebug tracefile_name
oradebug close_trace

--trc

Oradebug command 'setmypid' console output: <none>
DUMP OF LOG HISTORY: 25 history records
Earliest record:
 RECID #1 Recno 1 Record timestamp  08/29/24 10:19:52 Thread=1 Seq#=1 Link-Recid=0 kccic-Recid=2
  Low scn: 0x0000.000e2006 08/29/24 10:19:46 Next scn: 0x0000.000e2110                                   --Low scn: 0x0000.000e2006=925702     Next scn: 0x0000.000e2110=925968
Latest record:
 RECID #25 Recno 25 Record timestamp  09/02/24 17:47:20 Thread=1 Seq#=25 Link-Recid=24 kccic-Recid=2
  Low scn: 0x0000.0011d5e1 09/02/24 17:39:53 Next scn: 0x0000.0011d776                                   --Low scn: 0x0000.0011d5e1=1168865    Next scn: 0x0000.0011d776= 1169270 

从上面的log history dump可以看到,有2条record记录,分别是最早和最新. 	

  这些信息其实在controlfile中也是存在的,下面我们来dump controlfile来寻找下low scn等信息:

--查询redo log信息
select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIV STATUS                           FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- ------------------- ------------ -------------------
         1          1         25   52428800        512          1 YES    INACTIVE                               1168865 2024-09-02 17:39:53      1169270 2024-09-02 17:47:20
         2          1         26   52428800        512          1 NO     CURRENT                                1169270 2024-09-02 17:47:20   2.8147E+14
         3          1         24   52428800        512          1 YES    INACTIVE                               1154604 2024-09-02 11:39:28      1168865 2024-09-02 17:39:53
		 
SQL> select member from v$logfile;

MEMBER
------------------------------
/oradata/orcl/redo03.log
/oradata/orcl/redo02.log
/oradata/orcl/redo01.log
		 


oradebug setmypid
alter session set events 'immediate trace name CONTROLF level 4';
oradebug close_trace
oradebug tracefile_name


--log file trc:

***************************************************************************
LOG FILE RECORDS
***************************************************************************
 (size = 72, compat size = 72, section max = 16, section in-use = 3,
  last-recid= 3, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 10, numrecs = 16)
LOG FILE #1:
  name #3: /oradata/orcl/redo01.log
 Thread 1 redo log links: forward: 2 backward: 0
 siz: 0x19000 seq: 0x00000019 hws: 0x3 bsz: 512 nab: 0x16a flg: 0x1 dup: 1
 Archive links: fwrd: 0 back: 0 Prev scn: 0x0000.00119e2c    --1154604
 Low scn: 0x0000.0011d5e1 09/02/2024 17:39:53      --1168865
 Next scn: 0x0000.0011d776 09/02/2024 17:47:20     --1169270
LOG FILE #2:
  name #2: /oradata/orcl/redo02.log
 Thread 1 redo log links: forward: 3 backward: 1
 siz: 0x19000 seq: 0x0000001a hws: 0x4 bsz: 512 nab: 0xffffffff flg: 0x8 dup: 1
 Archive links: fwrd: 0 back: 0 Prev scn: 0x0000.0011d5e1
 Low scn: 0x0000.0011d776 09/02/2024 17:47:20       --1169270
 Next scn: 0xffff.ffffffff 01/01/1988 00:00:00
LOG FILE #3:
  name #1: /oradata/orcl/redo03.log
 Thread 1 redo log links: forward: 0 backward: 2
 siz: 0x19000 seq: 0x00000018 hws: 0x9 bsz: 512 nab: 0x7787 flg: 0x1 dup: 1  -seq: 0x00000018=24
 Archive links: fwrd: 0 back: 0 Prev scn: 0x0000.0011956e
 Low scn: 0x0000.00119e2c 09/02/2024 11:39:28       --1154604
 Next scn: 0x0000.0011d5e1 09/02/2024 17:39:53      --1168865
 
 
 
 上面的内容较多,这里重点将说明其中几点: 
Prev scn: 0x0000.00119e2c    --前一个日志的FIRST_CHANGE#
Low scn: 0x0000.0011d5e1      --这里的low scn对应上面的next change值.(因为我这里是查看的current log信息,前面是dump的redo log history)
Next scn: 0x0000.0011d776    --注意这里next scn其实有点类似datafile的stop scn,对于current log来讲,总是被置于无穷大的.
 
 
从上面的dump 信息,我们可以得到如下几个小结论:
1) 对于非current redo,low scn就是上一组redo的最后scn,同时也是next组redo log的起始scn。
2)如果next scn为无穷大,那么就可以判断出,该组redo是处于current 模式。
3)redo log被删除,仍然可以从controlfile中看到,不过其状态是deleted。
4) 另外,我们还可以看到每组redo log的大小,对应的sequence等等.
 

--补充:      
      Oracle从 12c开始扩展了scn,也称为extend scn或者Big scn。简单的讲,就是将scn结构的低位进一步扩展了。
  后面在讲文件头结构时我们会进一步讲解。 我们知道scn的结构是:kscnwrp.kscnbas,前面wrp是低位,bas值是高位。
  所谓big scn就是进一步扩展了低位,增加了 wrp2 .这里给大家看看19c的的数据文件头检查点就知道了:


--11.2.0.4 bbed 查看 scn:


BBED> set dba 1,1                      
        DBA             0x00400001 (4194305 1,1)

BBED> p kcvfhckp
struct kcvfhckp, 36 bytes                   @484     
   struct kcvcpscn, 8 bytes                 @484     
      ub4 kscnbas                           @484      0x0011dc2b    --对应 scn:1170475
      ub2 kscnwrp                           @488      0x0000
   ub4 kcvcptim                             @492      0x4641aed1
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500     
      struct kcvcprba, 12 bytes             @500     
         ub4 kcrbaseq                       @500      0x0000001a
         ub4 kcrbabno                       @504      0x00000aa2
         ub2 kcrbabof                       @508      0x0010
   ub1 kcvcpetb[0]                          @512      0x02
   ub1 kcvcpetb[1]                          @513      0x00
   ub1 kcvcpetb[2]                          @514      0x00
   ub1 kcvcpetb[3]                          @515      0x00
   ub1 kcvcpetb[4]                          @516      0x00
   ub1 kcvcpetb[5]                          @517      0x00
   ub1 kcvcpetb[6]                          @518      0x00
   ub1 kcvcpetb[7]                          @519      0x00
 



--19.3 bbed查看 scn  
BBED> set dba 1,1
        DBA             0x00400001 (4194305 1,1)
BBED> p kcvfhckp
struct kcvfhckp, 36 bytes                   @484     
   struct kcvcpscn, 8 bytes                 @484     
      ub4 kscnbas                           @484      0x00356b2a
      ub2 kscnwrp                           @488      0x8000             --这个对比11g变了
   ub4 kcvcptim                             @492      0x46405b12
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500     
      struct kcvcprba, 12 bytes             @500     
         ub4 kcrbaseq                       @500      0x00000014
         ub4 kcrbabno                       @504      0x00000002
         ub2 kcrbabof                       @508      0x0010
   ub1 kcvcpetb[0]                          @512      0x02
   ub1 kcvcpetb[1]                          @513      0x00
   ub1 kcvcpetb[2]                          @514      0x00
   ub1 kcvcpetb[3]                          @515      0x00
   ub1 kcvcpetb[4]                          @516      0x00
   ub1 kcvcpetb[5]                          @517      0x00
   ub1 kcvcpetb[6]                          @518      0x00
   ub1 kcvcpetb[7]                          @519      0x00

 --SCN扩展之后,变得更大了,以前担心的SCN 增长过快的问题,大家再也不需要担心了( 高位1,就表示2的32次方,扩展4位,大家可以脑补一下最大值是多少了)
 
   
--11g 数据库查看数据文件scn:

SQL> select name,checkpoint_change# from v$datafile_header;

NAME                                               CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/oradata/orcl/system01.dbf                                    1170475
/oradata/orcl/sysaux01.dbf                                    1170475
/oradata/orcl/undotbs01.dbf                                   1170475
/oradata/orcl/users01.dbf                                     1170475
/oradata/orcl/test01.dbf                                      1170475




复制
最后修改时间:2024-10-10 12:31:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论