Know more about RBA redo block address

A “Redo Block Address” (RBA) describes a physical location within a redo log file. An RBA consists of the following:

Log sequence number
Block number within log file
Byte offset within block

The structure of the redo block address is given below :
1 – The number of the redo log.
[4 bytes]

2 – The block offset from the beginning of the redo log file.
[4 bytes]

3 – The byte offset within the block.
[2 bytes]

Log sequence number v$logmnr_contents.RBASQN
Block number within log file v$logmnr_contents.RBABLK
Byte offset within block v$logmnr_contents.RBABYTE
So in this case, RBA [0x19.2.10] maps to Log squence 25, Block number 2 with byte offset 16.
With this information you should be able to find the details from v$logmnr_contents.

In particular, the buffer header information includes two fields: low-RBA and high-SCN. The low-RBA field indicates the point in the redo-log corresponding to the block’s first update after it came into the buffer cache. The high-SCN field indicates the SCN of the last update to the block.

***************************************************************************
CHECKPOINT PROGRESS RECORDS
***************************************************************************
 (size = 8180, compat size = 8180, section max = 11, section in-use = 0,
  last-recid= 0, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 2, numrecs = 11)
THREAD #1 - status:0x2 flags:0x0 dirty:47
low cache rba:(0x37a.11c.0) on disk rba:(0x37a.151.0)
on disk scn: 0x0000.0045d2f2 12/19/2011 01:03:21
resetlogs scn: 0x0000.00080634 11/07/2011 04:08:50
heartbeat: 770246919 mount id: 2811012380
THREAD #2 - status:0x0 flags:0x0 dirty:0
low cache rba:(0x0.0.0) on disk rba:(0x0.0.0)
on disk scn: 0x0000.00000000 01/01/1988 00:00:00
resetlogs scn: 0x0000.00000000 01/01/1988 00:00:00
heartbeat: 0 mount id: 0

logfile switch causes incremental checkpoint?

不少Oracle的初学者都会因为checkpoint这个知识点而头痛,绝大多数Oracle文档对完全检查点和增量检查点的描述又都略显朦胧;譬如在线日志的切换引起的是完全检查点还是增量检查点这个问题,就有不少的争论。实际上增量检查点与完全检查点有一个显著的区别:完全检查点发生时控制文件和数据文件头中的checkpoint scn都会被更新,而增量检查点发生时只有控制文件中的checkpoint scn更新;
我们可以通过以下演示证明日志切换引发的到底是何种检查点?:

SQL> select checkpoint_change# from v$datafile_header where status='ONLINE';
CHECKPOINT_CHANGE#
------------------
           1665476
           1665476
           1665476
           1665476
           1665476
           1665476
6 rows selected.

SQL> alter system checkpoint;
System altered.

SQL> select checkpoint_change# from v$datafile_header where status='ONLINE';
CHECKPOINT_CHANGE#

------------------
           1697131
           1697131
           1697131
           1697131
           1697131
           1697131
6 rows selected.

/* 手动执行checkpoint,数据文件头的checkpoint scn立即更新了 */

SQL> alter system flush buffer_cache;
System altered.

SQL> select checkpoint_change# from v$datafile_header where status='ONLINE';
CHECKPOINT_CHANGE#
------------------
           1697131
           1697131
           1697131
           1697131
           1697131
           1697131
6 rows selected.

/* 单纯flush buffer cache冲刷数据库高速缓存不会更新数据文件头的checkpoint scn */

SQL> alter system set log_checkpoints_to_alert=true;
System altered.

SQL> alter system set log_checkpoint_timeout=20;
System altered.

/* 设置log_checkpoint_timeout为20s,频繁引发增量检查点 */

alert log:
Wed Nov  3 20:24:49 2010
Incremental checkpoint up to RBA [0x3d.dff1.0], current log tail at RBA [0x3d.dff6.0]
Wed Nov  3 20:25:07 2010
Incremental checkpoint up to RBA [0x3d.dff7.0], current log tail at RBA [0x3d.dffc.0]
Wed Nov  3 20:25:25 2010
Incremental checkpoint up to RBA [0x3d.dffd.0], current log tail at RBA [0x3d.e002.0]
Wed Nov  3 20:25:43 2010
Incremental checkpoint up to RBA [0x3d.e003.0], current log tail at RBA [0x3d.e008.0]
Wed Nov  3 20:26:01 2010
Incremental checkpoint up to RBA [0x3d.e009.0], current log tail at RBA [0x3d.e00e.0]

SQL> set time on;

20:26:38 SQL> select checkpoint_change# from v$datafile_header where status='ONLINE';
CHECKPOINT_CHANGE#
------------------
           1697131
           1697131
           1697131
           1697131
           1697131
           1697131

6 rows selected.

/* 可以看到增量检查点并不会引起数据文件头的checkpoint scn 被更新 */

20:26:43 SQL>  alter system set log_checkpoint_timeout=1800;
System altered.

/* 那么日志文件切换就会引起数据文件头的checkpoint scn被更新吗?*/

20:28:10 SQL> alter system switch logfile;
System altered.

20:29:16 SQL> select checkpoint_change# from v$datafile_header where status='ONLINE';
CHECKPOINT_CHANGE#
------------------
           1697131
           1697131
           1697131
           1697131
           1697131
           1697131
6 rows selected.

/* logfile switch 日志文件切换引起的是一种slow慢的完全检查点,它不同于alter system checkpoint(ASC),
   ASC要求的脏块写出和控制文件及数据文件头更新时要立即完成的,也就是说当alter system checkpoint语句返回"System altered."
   后以上工作都已经完成了;而alter system switch logfile或者自然的日志切换引发的是一种慢的完全检查点,
   它在返回"System altered"时不要求写脏块等工作必须已经完成
*/

/* 我们可以用冲刷高速缓存的方式保证脏块写出的工作被督促完成 */

20:33:39 SQL> alter system flush buffer_cache;
System altered.

20:33:45 SQL> select checkpoint_change# from v$datafile_header where status='ONLINE';
CHECKPOINT_CHANGE#
------------------
           1697544
           1697544
           1697544
           1697544
           1697544
           1697544

6 rows selected.

/* 虽然日志切换所引发的slow checkpoint(慢的检查点)并无立即完成的要求,但也并非全无限制;
   当某次日志切换由1号日志组切换到2号日志组时,
   将引发一个slow checkpoint,之后日志连续切换又要切到1号日志组时要求之前的那个slow checkpoint在切换前必须完成
*/

20:41:35 SQL> set timing on;

20:42:02 SQL>  select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------------
         1          1         67   52428800          2 YES INACTIVE               1698288 2010-11-03 20:41:19
         2          1         68   52428800          2 YES INACTIVE               1698292 2010-11-03 20:41:21
         3          1         69   52428800          2 NO  CURRENT                1698302 2010-11-03 20:41:35
Elapsed: 00:00:00.00

20:42:17 SQL> delete tv;
51134 rows deleted.
Elapsed: 00:00:01.68

20:42:34 SQL> commit;
Commit complete.
Elapsed: 00:00:00.00

20:42:36 SQL> alter system switch logfile;
System altered.
Elapsed: 00:00:00.01

20:42:40 SQL> alter system switch logfile;
System altered.
Elapsed: 00:00:00.01

20:42:43 SQL> alter system switch logfile;
System altered.
Elapsed: 00:00:02.00

20:45:28 SQL>  select checkpoint_change# from v$datafile_header where status='ONLINE';
CHECKPOINT_CHANGE#
------------------
           1700686
           1700686
           1700686
           1700686
           1700686
           1700686
6 rows selected.
Elapsed: 00:00:00.00

alter.log告警日志中的内容:

Wed Nov  3 20:42:40 2010
Beginning log switch checkpoint up to RBA [0x46.2.10], SCN: 1700686
...........................
Wed Nov  3 20:42:45 2010
Thread 1 cannot allocate new log, sequence 72
Checkpoint not complete
....................
Completed checkpoint up to RBA [0x46.2.10], SCN: 1700686

/* 最近一次的日志切换耗费2s,在告警日志中可以看到此次slow checkpoint的相关记录 */

沪ICP备14014813号-2

沪公网安备 31010802001379号