Oracle-BCT(Block Change Tracking)参数优化配置
创始人
2025-05-30 08:16:44

背景:

      Oracle10g之后引入的BCT(Block Change Tracking)功能,可以用以提高增量备份的效率,减少扫描的块数量时间,但对于开启了BCT功能的数据库,在业务高并发的期间可能会出现性能的缓慢问题,经常可以观察到等待事件block change tracking buffer space,change tracking file synchronous read/write,除了尽可能的应用最新的补丁来规避bug问题,Oracle官方建议可以通过调整BCT的相关隐含参数进行优化以尽可能的规避出现的性能问题。

        本文接下来主要讲解BCT涉及的主要优化参数。

BCT隐含参数(Version:Oracle 19.3):

select a.ksppinm name, b.ksppstvl value, a.ksppdesc description
from sys.x$ksppi a, sys.x$ksppcv b
where a.indx = b.indx and a.ksppinm like '%bct%'
order by name
​
NAME                                     VALUE                DESCRIPTION
---------------------------------------- -------------------- ------------------------------------------------------------------------------------------
_bct_bitmaps_per_file                    8                    number of bitmaps to store for each datafile
_bct_buffer_allocation_max               104857600            maximum size of all change tracking buffer allocations, in bytes
_bct_buffer_allocation_min_extents       1                    mininum number of extents to allocate per buffer allocation
_bct_buffer_allocation_size              2097152              size of one change tracking buffer allocation, in bytes
_bct_chunk_size                          0                    change tracking datafile chunk size, in bytes
_bct_crash_reserve_size                  262144               change tracking reserved crash recovery SGA space, in bytes
_bct_file_block_size                     0                    block size of change tracking file, in bytes
_bct_file_extent_size                    0                    extent size of change tracking file, in bytes
_bct_fixtab_file                                              change tracking file for fixed tables
_bct_health_check_interval               60                   CTWR health check interval (seconds), zero to disable
_bct_initial_private_dba_buffer_size     0                    initial number of entries in the private change tracking dba buffers
_bct_mrp_timeout                         600                  CTWR MRP wait timeout (seconds), zero to wait forever
_bct_public_dba_buffer_dynresize         2                    allow dynamic resizing of public dba buffers, zero to disable
_bct_public_dba_buffer_maxsize           0                    max buffer size permitted for public dba buffers, in bytes
_bct_public_dba_buffer_size              0                    total size of all public change tracking dba buffers, in bytes
​

 _bct_buffer_allocation_max:   

        参数说明:全部change tracking buffer分配的最大值

        默认值为:104857600

        建议值:根据Oracle MOS(Doc ID 2094946.1)

        推荐为4倍dba_buffer_count_public*dba_entry_count_public*dba_entry_size并且小于large_pool池大小

--可以通过表x$krcstat查询当前值
select dba_buffer_count_public*dba_entry_count_public*dba_entry_size from x$krcstat;

        参数测试:在Oracle19.3版本测试,_bct_buffer_allocation_max参数无法限制CTWR dba buffer的大小

--设置_bct_buffer_allocation_max为5M
SQL> alter system set "_bct_buffer_allocation_max"=5242880;
​
System altered.
--当前CTWR dba buffer大小为1.79M
SQL> select inst_id,pool,name,bytes/1024/1024 as MB ,con_id from gv$sgastat where pool='large pool';
​INST_ID POOL           NAME                                             MB     CON_ID
---------- -------------- ---------------------------------------- ---------- ----------1 large pool     free memory                              2028.84766          01 large pool     ASM map operations hashta                      .375          01 large pool     krcc extent chunk                        1.98046875          01 large pool     PX msg pool                                      15          01 large pool     CTWR dba buffer                            1.796875          0
--执行大批量的块更新之后,CTWR dba buffer大小变为14.359MB,超过了5MB,参数并不能限制CTWR dba buffer的大小
SQL> r1* select inst_id,pool,name,bytes/1024/1024 as MB ,con_id from gv$sgastat where pool='large pool'
​INST_ID POOL           NAME                                             MB     CON_ID
---------- -------------- ---------------------------------------- ---------- ----------1 large pool     free memory                              2016.28516          01 large pool     ASM map operations hashta                      .375          01 large pool     krcc extent chunk                        1.98046875          01 large pool     PX msg pool                                      15          01 large pool     CTWR dba buffer                           14.359375          0
​
SQL> 
NAME                                     VALUE                DESCRIPTION
---------------------------------------- -------------------- ------------------------------------------------------------------------------------------
​
_bct_buffer_allocation_max               5242880              maximum size of all change tracking buffer allocations, in bytes

_bct_public_dba_buffer_maxsize:

        参数说明:允许分配全部public change tracking dba buffer的最大值

        默认值为:0,自动分配

        建议值:

        _bct_public_dba_buffer_size<=建议值<=2*_bct_public_dba_buffer_size 并且小于large_pool池大小

        参数测试:在Oracle19.3版本测试,_bct_public_dba_buffer_maxsize参数控制CTWR dba buffer的最大值

--参数都设置为512K
alter system set "_bct_buffer_allocation_max"=5242880;
alter system set "_bct_public_dba_buffer_maxsize"=524288;
alter system set "_bct_public_dba_buffer_size"=524288;
NAME                                     VALUE                                    DESCRIPTION
---------------------------------------- ---------------------------------------- ------------------------------------------------------------
_bct_buffer_allocation_max               524288                                   maximum size of all change tracking buffer allocations, in b
_bct_public_dba_buffer_maxsize           524288                                   max buffer size permitted for public dba buffers, in bytes
_bct_public_dba_buffer_size              524288                                   total size of all public change tracking dba buffers, in byt
--当前CTWR dba buffer为1MB,接近2倍_bct_public_dba_buffer_size
SQL> select inst_id,pool,name,bytes/1024/1024 as MB ,con_id from gv$sgastat where pool='large pool';
​INST_ID POOL           NAME                                             MB     CON_ID
---------- -------------- ---------------------------------------- ---------- ----------1 large pool     free memory                              189.636719          01 large pool     ASM map operations hashta                      .375          01 large pool     krcc extent chunk                        1.98046875          01 large pool     PX msg pool                                      15          01 large pool     CTWR dba buffer                           1.0078125          0
​
--进行大批量的块操作,可以看到产生大量的block change tracking buffer space等待事件
SAMPLE_TIME                              EVENT                                    SESSION_ID BLOCKING_SESSION SESSION PROGRAM                                  TIME_WAITED/1000
---------------------------------------- ---------------------------------------- ---------- ---------------- ------- ---------------------------------------- ----------------
19-MAR-23 03.51.12.745 PM                control file sequential read                    497                  WAITING oracle@rac19a (CKPT)                                 .297
19-MAR-23 03.54.42.856 PM                change tracking file synchronous read           510                  WAITING rman@rac19a (TNS V1-V3)                              .233
19-MAR-23 03.58.58.979 PM                                                                 10                  ON CPU  oracle@rac19a (CTWR)                                    0
19-MAR-23 03.59.11.009 PM                change tracking file synchronous read           750                  WAITING sqlplus@rac19a (TNS V1-V3)                          5.282
19-MAR-23 03.59.19.020 PM                block change tracking buffer space              507                  WAITING sqlplus@rac19a (TNS V1-V3)                        999.912
19-MAR-23 03.59.19.020 PM                block change tracking buffer space              382                  WAITING sqlplus@rac19a (TNS V1-V3)                        999.727
19-MAR-23 03.59.19.020 PM                block change tracking buffer space              626                  WAITING oracle@rac19a (W002)                              999.692
19-MAR-23 03.59.19.020 PM                block change tracking buffer space              750                  WAITING sqlplus@rac19a (TNS V1-V3)                        999.642
19-MAR-23 03.59.19.020 PM                block change tracking buffer space              139                  WAITING sqlplus@rac19a (TNS V1-V3)                        999.587
19-MAR-23 03.59.20.020 PM                block change tracking buffer space              626                  WAITING oracle@rac19a (W002)                              780.752
19-MAR-23 03.59.20.020 PM                block change tracking buffer space              507                  WAITING sqlplus@rac19a (TNS V1-V3)                        962.714
19-MAR-23 03.59.20.020 PM                block change tracking buffer space              382                  WAITING sqlplus@rac19a (TNS V1-V3)                        793.489
19-MAR-23 03.59.20.020 PM                block change tracking buffer space              139                  WAITING sqlplus@rac19a (TNS V1-V3)                        968.197
19-MAR-23 03.59.20.020 PM                block change tracking buffer space              750                  WAITING sqlplus@rac19a (TNS V1-V3)                        966.412
--当前CTWR dba buffer为1MB没有任何动态调整
--调整_bct_public_dba_buffer_maxsize为100MB
alter system set "_bct_public_dba_buffer_maxsize"=104857600;
--当前CTWR dba buffer动态调整为CTWR dba buffer,block change tracking buffer space等待事件消失1* select inst_id,pool,name,bytes/1024/1024 as MB ,con_id from gv$sgastat where pool='large pool'
​INST_ID POOL           NAME                                             MB     CON_ID
---------- -------------- ---------------------------------------- ---------- ----------1 large pool     free memory                              2016.28516          01 large pool     ASM map operations hashta                      .375          01 large pool     krcc extent chunk                        1.98046875          01 large pool     PX msg pool                                      15          01 large pool     CTWR dba buffer                           14.359375          0

_bct_public_dba_buffer_size:

        参数说明:全部public change tracking dba buffer的总值

        默认值为:0,自动分配

        建议值:根据Oracle MOS(Doc ID 2094946.1)

        推荐为2倍dba_buffer_count_public*dba_entry_count_public*dba_entry_size并且小于large_pool池大小,减少block change tracking buffer space的等待产生

--可以通过表x$krcstat查询当前值
select dba_buffer_count_public*dba_entry_count_public*dba_entry_size from x$krcstat;

        ​参数测试:在Oracle19.3版本测试,_bct_public_dba_buffer_size参数影响CTWR dba buffer的当前大小        

        2倍dba_buffer_count_public*dba_entry_count_public*dba_entry_size<CTWR dba buffer<=2倍_bct_public_dba_buffer_size

--设置_bct_public_dba_buffer_size参数之前,要先设置_bct_public_dba_buffer_maxsize>=_bct_public_dba_buffer_size
否则可能会出现错误02097, 00000, "parameter cannot be modified because specified value is invalid"
// *Cause: Though the initialization parameter is modifiable, the modified
//         value is not acceptable to the parameter
--当前CTWR dba buffer 14MB
SQL> select inst_id,pool,name,bytes/1024/1024 as MB ,con_id from gv$sgastat where pool='large pool'
​INST_ID POOL           NAME                               MB     CON_ID
---------- -------------- -------------------------- ---------- ----------1 large pool     free memory                2016.28516          01 large pool     ASM map operations hashta        .375          01 large pool     krcc extent chunk          1.98046875          01 large pool     PX msg pool                        15          01 large pool     CTWR dba buffer             14.359375          0
--查看dba_buffer_count_public*dba_entry_count_public*dba_entry_size当前大小
SQL> select dba_buffer_count_public*dba_entry_count_public*dba_entry_size from x$krcstat;
​
DBA_BUFFER_COUNT_PUBLIC*DBA_ENTRY_COUNT_PUBLIC*DBA_ENTRY_SIZE
-------------------------------------------------------------7528320
--设置为2倍DBA_BUFFER_COUNT_PUBLIC*DBA_ENTRY_COUNT_PUBLIC*DBA_ENTRY_SIZE
SQL> alter system set "_bct_public_dba_buffer_maxsize"=15056640;    
​
System altered.
​
SQL> alter system set "_bct_public_dba_buffer_size"=15056640;
​
System altered.
--当前CTWR dba buffer为28MB,基本等于两倍_bct_public_dba_buffer_size 
SQL> select inst_id,pool,name,bytes ,con_id from gv$sgastat where pool='large pool';
​INST_ID POOL           NAME                            BYTES     CON_ID
---------- -------------- -------------------------- ---------- ----------1 large pool     free memory                2099171328          01 large pool     ASM map operations hashta      393216          01 large pool     krcc extent chunk             2076672          01 large pool     PX msg pool                  15728640          01 large pool     CTWR dba buffer              30113792          0
--设置为4倍DBA_BUFFER_COUNT_PUBLIC*DBA_ENTRY_COUNT_PUBLIC*DBA_ENTRY_SIZE
SQL> alter system set "_bct_public_dba_buffer_maxsize"=60227584;
​
System altered.
​
SQL> alter system set "_bct_public_dba_buffer_size"=60227584;
​
System altered.
--当前CTWR dba buffer为60MB,大于当前两倍dba_buffer_count_public*dba_entry_count_public*dba_entry_size
--小于2倍_bct_public_dba_buffer_size
SQL> select inst_id,pool,name,bytes ,con_id from gv$sgastat where pool='large pool';
​INST_ID POOL           NAME                            BYTES     CON_ID
---------- -------------- -------------------------- ---------- ----------1 large pool     free memory                2065534976          01 large pool     ASM map operations hashta      393216          01 large pool     krcc extent chunk             2076672          01 large pool     PX msg pool                  15728640          01 large pool     CTWR dba buffer              63750144          0
SQL> select dba_buffer_count_public*dba_entry_count_public*dba_entry_size from x$krcstat;
​
DBA_BUFFER_COUNT_PUBLIC*DBA_ENTRY_COUNT_PUBLIC*DBA_ENTRY_SIZE
-------------------------------------------------------------31874688 

        参数说明:CTWR健康心跳检查间隔

        默认值为:60秒,19.17及以后版本默认为0,禁用健康心跳检查

        建议值:存在Bug33239980导致由于CTWR健康心跳检查导致CKPT进程被堵塞的问题,如果CTWR存在性能问题,建议设置为0,禁用健康心跳检查或者应用最新的RU补丁

_bct_bitmaps_per_file:

        参数说明:bct块追踪文件里面每个数据文件保留的块追踪位图版本

        默认值为:8

        建议值:8

        参数测试:每一次全量备份或者增量备份,BCT文件都会重新创建一个新的版本用于记录新的块变化,如果版本的个数超过8,旧的版本会被覆盖,这可能会导致新的增量备份无法查看之前增量备份的历史版本,这时增量备份会恢复到全数据库块扫描,备份效率变低,所以至少每周进行一次全量备份,每天进行一次增量备份,这样的备份策略对于BCT比较合理

相关内容

热门资讯

最新消息“天健悠游棋牌有没有挂... 您好:天健悠游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8383742】很多玩家在这款...
玩家必看“七彩云南麻将到底有挂... 亲.七彩云南麻将这款游戏是可以开挂的,确实是有挂的,通过添加客服【3671900】很多玩家在这款游戏...
科普实测“微友互娱其实有透视辅... 您好:微友互娱这款游戏可以开挂,确实是有挂的,需要软件加微信【6355786】,很多玩家在微友互娱这...
实测分享.“[新世界]究竟怎么... 您好:这款游戏新世界可以开挂的,确实是有挂的,通过加微【4579337】咨询,很多玩家在这款游戏中打...
科技推荐.新幹缐娱乐.辅助软件... 您好:新幹缐娱乐这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8262836】很多玩家在这款游...