[20170407]关于增量检查点的一个疑问.txt

[20170407]关于增量检查点的一个疑问.txt

--//oracle现在写脏块基本采用增量检查点,除非执行alter system checkpoint,或者shutdown immediate(normal)正常关闭数据库.
--//别人的疑问,如果如果写增量检查点时,current log tail at RBA=Incremental checkpoint up to RBA时,如下情况

1.环境:
SYS@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SYS@book> alter system set log_checkpoints_to_alert=true scope=memory;
System altered.

SYS@book> alter system set log_checkpoint_timeout=120 scope=memory;
System altered.
--//这样设置出现current log tail at RBA=Incremental checkpoint up to RBA概率大一些.
--//检查alert.

Incremental checkpoint up to RBA [0x31a.c823.0], current log tail at RBA [0x31a.c823.0]
Fri Apr 07 15:38:00 2017

--//这时查看视图x$kcccp:
column on_disk_rba16 format a20
column rtckp_rba format a20
column diff_date format 999999.99
column CPOSD_ono_disk_rba_scn format 99999999999999999999999999999999
column cpdrt heading "检查点队列|脏块数量|CPDRT"
column cpodt_on_disk_rba heading "检查点队列|on disk rba|时间戳|CPODT"
column cpods heading "检查点队列|on disk rba scn|CPODS"
column cphbt heading "检查点心跳|CPHBT"
column current_sysdate heading "当前时间|SYSDATE"

PROMPT
PROMPT REDO ( Hexadecimal ):
PROMPT

SELECT cpdrt ,
       '0x'||to_char(cplrba_seq,'FMxxxxxxxx') || '.' || to_char(cplrba_bno,'FMxxxxxxxx')|| '.' || to_char(cplrba_bof,'FMxxxx') "low_rba16",
       '0x'||to_char(cpodr_seq,'FMxxxxxxxx') || '.' || to_char(cpodr_bno,'FMxxxxxxxx') || '.' || to_char(cpodr_bof,'FMxxxx') "on_disk_rba16",
       TO_DATE (CPODT, 'MM-DD-YYYY HH24:MI:SS') cpodt_on_disk_rba,
       SYSDATE current_sysdate,
       ROUND ( (SYSDATE - TO_DATE (CPODT, 'MM-DD-YYYY HH24:MI:SS')) * 86400,
              2)
          diff_date,
       CPODS ,
           CPHBT,
       current_scn,
       current_scn - cpods diff_scn,
       indx
  FROM x$kcccp, v$database
WHERE CPLRBA_SEQ <> 0;

SYS@book> @ &r/checkpoint
REDO ( Hexadecimal ):
                                                       检查点队列
  检查点队列                                           on disk rba                                        检查点队列
    脏块数量                                           时间戳              当前时间                       on disk rba scn    检查点心跳
       CPDRT low_rba16            on_disk_rba16        CPODT               SYSDATE              DIFF_DATE CPODS                   CPHBT  CURRENT_SCN     DIFF_SCN         INDX
------------ -------------------- -------------------- ------------------- ------------------- ---------- ---------------- ------------ ------------ ------------ ------------
           0 0xffffffff.ffffffff. 0x31a.c838.0         2017-04-07 15:37:59 2017-04-07 15:38:46      47.00 13277192191         940697982            0 -13277192191            0
             ffff

--//low_rba = 0xffffffff.ffffffff.ffff.如果这时异常关闭数据库会出现什么情况呢?oracle如何确定恢复的起点呢low_rba ? (这也
--//是别人问的问题)
--//执行shutdown abort,再重新启动数据库,观察alrt文件:

Fri Apr 07 15:39:24 2017
alter database open
Beginning crash recovery of 1 threads
parallel recovery started with 23 processes
Started redo scan
Completed redo scan
read 0 KB redo, 0 data blocks need recovery
Started redo application at
Thread 1: logseq 794, block 51256, scn 13277192191
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recovery of Online Redo Log: Thread 1 Group 1 Seq 794 Reading mem 0
  Mem# 0: /mnt/ramdisk/book/redo01.log
Completed redo application of 0.00MB
Completed crash recovery at
Thread 1: logseq 794, block 51257, scn 13277212192
0 data blocks read, 0 data blocks written, 0 redo k-bytes read
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Fri Apr 07 15:39:25 2017
LGWR: STARTING ARCH PROCESSES
Fri Apr 07 15:39:25 2017
ARC0 started with pid=45, OS id=21810
ARC0: Archival started
LGWR: STARTING ARCH PROCESSES COMPLETE
ARC0: STARTING ARCH PROCESSES
Thread 1 advanced to log sequence 795 (thread open)
Thread 1 opened at log sequence 795
  Current log# 2 seq# 795 mem# 0: /mnt/ramdisk/book/redo02.log
Successful open of redo thread 1

--//0x31a = 794
--//0xc838 = 51256
--//正好是on_disk_rba地址.注意看下划线内容.

--//噢明白了.如果出现这样的情况,不需要恢复.
--//实际上如果出现脏块,仅仅将low_rba16设置为当前的on_disk_rba16.以这个作为异常恢复的起点.
--//简单写一个例子:
]$ cat a.sql
alter system checkpoint;
alter system checkpoint;
alter system checkpoint;
@ &r/checkpoint
update scott.t1 set object_name=object_name where rownum<100 ;
commit;
host sleep 3
@ &r/checkpoint
--//很奇怪,必须加入sleep 3,然后看不到变化.

--//结果如下:
REDO ( Hexadecimal ):

                                                       检查点队列
  检查点队列                                           on disk rba                                        检查点队列
    脏块数量                                           时间戳              当前时间                       on disk rba scn    检查点心跳
       CPDRT low_rba16            on_disk_rba16        CPODT               SYSDATE              DIFF_DATE CPODS                   CPHBT  CURRENT_SCN     DIFF_SCN         INDX
------------ -------------------- -------------------- ------------------- ------------------- ---------- ---------------- ------------ ------------ ------------ ------------
           0 0xffffffff.ffffffff. 0x31c.14f4.0         2017-04-07 16:16:42 2017-04-07 16:16:44       2.00 13277216046         940700230  13277216052            6            0
             ffff

--//执行一些事务后,出现脏块:

REDO ( Hexadecimal ):

                                                       检查点队列
  检查点队列                                           on disk rba                                        检查点队列
    脏块数量                                           时间戳              当前时间                       on disk rba scn    检查点心跳
       CPDRT low_rba16            on_disk_rba16        CPODT               SYSDATE              DIFF_DATE CPODS                   CPHBT  CURRENT_SCN     DIFF_SCN         INDX
------------ -------------------- -------------------- ------------------- ------------------- ---------- ---------------- ------------ ------------ ------------ ------------
           4 0x31c.14f5.0         0x31c.150c.0         2017-04-07 16:16:45 2017-04-07 16:16:47       2.00 13277216057         940700233  13277216060            3            0

--//注意看low_rba16 ,on_disk_rba16就明白了.

时间: 2024-09-20 00:54:43

[20170407]关于增量检查点的一个疑问.txt的相关文章

[20160527]快速提交的一个疑问.txt

[20160527]快速提交的一个疑问.txt --这个是我前几天恢复update没有加where条件的恢复,记录不多,但是我发现一个"奇怪"的问题,或者讲我以前没有注意的问题, --我在itpub上问了,没人解答.链接http://www.itpub.net/thread-2060064-1-2.html Block header dump:  0x0180239c Object id on Block? Y seg/obj: 0x1da20  csc: 0x03.8fc12309 

[20170515]数据库启动的一个疑问.txt

[20170515]数据库启动的一个疑问.txt --//别人问的问题我自己以前也没有注意,做一个记录. 1.环境: SYS@book> startup   mount ORACLE instance started. Total System Global Area  634732544 bytes Fixed Size                  2255792 bytes Variable Size             197133392 bytes Database Buffe

ORACLE CheckpointQueue和增量检查点

<p style="margin:0in;font-size:20.0pt;"> ORACLE CheckpointQueue和增量检查点 </p> <p style="margin:0in;font-size:10.0pt;color:gray;"> <br /> </p> <p style="margin:0in;line-height:15pt;font-family:微软雅黑;fon

[20150911]关于增量检查点.txt

[20150911]关于增量检查点.txt --昨天被人问及我们的测试库,增量检查点的问题,我告诉对方,我设置了参数log_checkpoints_to_alert=true,当写增量检查点时会 --同时写入alert*.log日志文件,被问及时间间隔问题,实际上增量检查点的写入与许多因素相关,比如如果数据库修改很多,数据缓存 --大小,redo file的大小以及数量都存在关系. --但是我的测试库基本我自己用,没事看看增量检查点的间隔是多少,会与什么参数有关. $ grep -B1 "^In

[20160529]快速提交的一个疑问3.txt

[20160529]快速提交的一个疑问3.txt --链接 http://blog.itpub.net/267265/viewspace-2108017/ --在上一次链接里面提到在快速提交时,itl槽的_ktbitun._ktbitfsc记录是dml记录长度减少的长度. --如果清除后,会kdbh.kdbhavsp相加写回kdbh.kdbhavsp,以前一直对快速提交没有很好的理解,我一直以为会清除数据信息里面的lock,实 际上在下次ITL覆盖时清除,还是通过一个例子来说明: 1.环境: S

[20160528]快速提交的一个疑问2.txt

[20160528]快速提交的一个疑问2.txt --链接 http://blog.itpub.net/267265/viewspace-2108017/ --在上一次链接里面提到在快速提交时,itl槽的_ktbitun._ktbitfsc记录是dml记录长度减少的长度. --如果清除后,会kdbh.kdbhavsp相加写回kdbh.kdbhavsp,这样就很容易联想到另外的问题,如果修改记录长度增加呢? --会出现什么情况呢?还是通过例子来说明: 1.环境: SCOTT@test01p> @

[20150913]文件检查点-表空间offline.txt

[20150913]文件检查点-表空间offline.txt --oracle从8i以后基本使用增量检查点取代原来的检查点模式,但是如果一个表空间处于热备份模式以及offline时,要将这些表空间包含 --的数据文件所涉及到的脏块写数据文件.这个叫file level Checkpoint(感觉叫tablespace level checkpoint更加合适一些),如何验证 --这个过程,实际上很简单仅仅需要检查v$bh或者x$bh视图,或者转储脏块看看里面的内容是否存在变化,来验证这个过程,还

【性能优化】增量检查点

Oracle从8i开始引入了检查点队列这么一种概念,用于记录数据库里面当前所有的脏数据块的信息,DBWR根据这个队列而将脏数据块写入到数据文件中.检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo Block Address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号.在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入

测试5——观察增量检查点

四:log file switch,会触发一个增量检查点,不过它会更新datafile header SQL> select cpdrt dirty,cpods on_disk_scn,cpodt on_disk_time,cphbt from x$kcccp where indx=0;      DIRTY ON_DISK_SCN      ON_DISK_TIME              CPHBT ---------- ---------------- -----------------