Oracle-OCP学习笔记:Database buffer cache

本章主要阐述SGA中的Database buffer cache。

Buffer cache {

1.pin (读写瞬间的状态)

2.clean

3.dirty

4.unused(free)

}

--Database buffer cache

概述:

1.段、区、块的概念:

create table t2 (

    id int,

    name varchar2(30)

);

建立一个表,同时建立一个段,

建立段的同时,会给段分配一个区,

区是物理上连续的几个块。

区是oracle给段分配的最小单位。

块是oracle I/O的最小单位。

数据以一行一行的形式存在块中。一般不会出现一个行出现在多个块中,也有例外

insert into t2 values(1,'xiaobei');

创建表时首先分配一个区,包含8个块,属于t2段,当第一个区用完了,会再分配一个区,用完后又会分配一个区给t2段空间中。

 

DBF文件中叫一个一个块,当这个块加载到内存中时,在内存SGA的buffer cache中,叫一个buffer

 

访问:

访问一个块,

一般情况下,一个块中有多个行(行链接,行迁移除外)。


SYS AS SYSDBA@ORCL>show parameter block;

 

NAME                   TYPE       VALUE

------------------------------------ --------------------------------------------------

db_block_buffers          integer        0

db_block_checking         string         FALSE

db_block_checksum         string         TYPICAL

db_block_size             integer        8192#8k

db_file_multiblock_read_count        integer        22

 

2.buffer cache的意义:

缓存DBF文件,减少物理I/0,

减少I/O:物理I/O,逻辑I/O   

(物理I/O:块从磁盘到内存的过程,磁盘读。逻辑I/O:块直接在内存中找到,内存读)

构造cr块

      一个会话在没有commit以后,其它会话的用户是无法看到的

       Rollback后,将取消修改的数据,在undo内将修改前的数据恢复过来

       只要未提交,就可以回滚数据

       只要未提交,别的会话就看不见修改后的数据

引入undo:Oracle在修改数据以前,会将数据写到undo空间中。

undo的作用{

1.回滚未提交事物;

2.构造cr块。在buffer cache中构造CR块

}

 

这里会引出两个更深入的问题:①会话2如何知道会话1没有提交?②cr块如何从undo空间中找到被删除的那一行。

 

3.buffercache的内存组织结构: 

    内存通过chain(链)来组织和管理buffer。数据查找方式为:先找到链的头部,再从链的开头一直往下找(遍历),直到找到数据块(BUFFER)为止。

    链:分为单向链和双向链

       特点:一个数据块可以有多种链,多种链可以按不同的功能来划分。

 

CBC、LRU、LRUW、CHECKPOINT QUEUE


 

CBC(cache buffer chain)链:    所有的链按照块地址将buffer cache 中所有的buffer链起来。具体是根据block地址找block的时候,需要使用CBC chain

            何时用到:根据块地址找buffer时用到

 

           CBC链实现原理:

              首先oracle在内存初始化时,将buffer cache划分为许多空链,和许多buffer(内存块),当一条sql语句来查buffer cache时,通过计算sql将得出要到那个链地址上去查,因为这时链地址并没有实际的数据(buffer),返回空,这时server process将会去硬盘中查找这条sql语句对应的块,并将这个数据块复制到内存的buffer中,并将这个块的头部地址挂到CBC链上面。以后如果还有同样的查询,server process将直接通过查看CBC链的块地址,就可以找到块地址对应的buffer(数据块)。

   


 

 

LRU(last resent used): 最近最少使用     最近最少使用的顺序链起来。可用块~。

       何时用到:在将数据块从磁盘中调到buffer cache中时会用到

       Buffer的状态:free clean  dirty pinned。当数据库运行后几乎没有free块,大部分都是clean和dirty块。LRU就是通过对clean链的使用频率来决定数据块的存放位置。

       原理:当buffer cache中没有可用的free块时,这时就可以将clean块移出buffer cache,要移出那个clean块,就是通过LRU的算法来进行的。LRU算法将所有的clean块按使用频率从少到多的顺序在逻辑到连接起来。所以越少使用的块,就会被越早从buffer cache中移出 。

      

MRU(最近最多使用):原理与LRU相反,所有链上是存放最多使用的块。

 

 

LRUW最近最少使用的脏块,按脏块被脏的频率来链接起来的

  DBWn以此为标准优先写最近最少使用的脏块。

       何时用到:DBWn在判断那些buffer块要刷新到磁盘时用到。


 

 

 

CHECKPOINT QUEUE:检查点队列    也是关于脏块的,按块第一次脏的时间点链起来。

                    


注:在Oracle中,一般都是采用双向的链。


 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

buffer_cache大小的设置及依据:

4.DB_WRITER_PROCESSES

SQL> show parameter writer

NAME                                TYPE        VALUE

------------------------------------ -----------------------------------------

db_writer_processes                 integer     1

SQL> alter system set db_writer_processes = 2scope=spfile;

--DBWn数量一般设定是服务器核心数/8.

 

SYS ASSYSDBA@ORCL>startup force;

ORACLE instance started.

Total System Global Area 422670336 bytes

Fixed Size        1336960 bytes

Variable Size       369101184 bytes

Database Buffers     46137344 bytes

Redo Buffers          6094848 bytes

Database mounted.

Database opened.

SYS AS SYSDBA@ORCL>show parameter writer;

NAME                   TYPE       VALUE

------------------------------------ --------------------------------------------------

db_writer_processes          integer      2

ps �Cef | grep ora

oracle    2429    1  0 08:33 ?        00:00:00 ora_dbw0_ORCL

oracle    2431    1  0 08:33 ?        00:00:00 ora_dbw1_ORCL

 

5.buffer cache的重要参数配置

查看SGA相关池的大小:

SYS AS SYSDBA@ORCL>selectcomponent,current_size,min_size from v$sga_dynamic_components;

 

COMPONENT       CURRENT_SIZE   MIN_SIZE

-------------------- ------------ ----------

shared pool       209715200  209715200

large pool      4194304   4194304

java pool       4194304   4194304

streams pool        4194304   4194304

DEFAULT buffer cache46137344   46137344

KEEP buffer cache    0      0

RECYCLE buffer cache     0      0

DEFAULT 2K buffer ca     0      0

che

 

DEFAULT 4K buffer ca     0      0

che

 

DEFAULT 8K buffer ca     0      0

che

 

DEFAULT 16K buffer c     0      0

ache

 

DEFAULT 32K buffer c     0      0

ache

 

Shared IO Pool           0      0

ASM Buffer Cache     0      0

 

14 rows selected.

 

Elapsed: 00:00:00.04

 

 

 

 

 

 

配置buffercache大小:

alter system set db_cache_size=200m scope=both;

设置大小顺序:

sga_max_size   altersystem set sga_max_size=400M scope=spfile

sga_target

db_cache_size

在OLTP系统中,buffer cache的大小一般设置为sga_max_size的2/3.

DB_CACHE_SIZE = SGA_MAX_SIZE/2 ~ SGA_MAX_SIZE*2/3

 

使用advice来确认buffer cache的大小

SYS AS SYSDBA@ORCL>select size_for_estimate"Cache Size (MB)",size_factor,buffers_for_estimate"Buffers", estd_physical_read_factorest_read_factor,estd_physical_reads estd_phy_red,estd_physical_read_time est_phy_red_tfrom v$db_cache_advice where NAME='DEFAULT' AND block_size=(SELECT VALUE FROMv$parameter WHERE NAME='db_block_size');

 

Cache Size (MB) SIZE_FACTOR    Buffers EST_READ_FACTOR ESTD_PHY_REDEST_PHY_RED_T

--------------- ----------- ---------- --------------------------- -------------

          4      .0909     496     1.2956     13356       0

          8      .1818     992     1.1398     11750       0

         12      .2727    1488     1.1086     11428       0

         16      .3636    1984     1.0944     11282       0

         20      .4545    2480     1.0614     10942       0

         24      .5455    2976     1.034     10659       0

         28      .6364    3472     1.0236     10552       0

         32      .7273    3968     1.0113     10426       0

         36      .8182    4464     1.0038     10348       0

         40      .9091    4960     1.0009     10319       0

         44      1  5456          1      10309       0

         48     1.0909    5952     .9962     10270       0

         52     1.1818    6448     .9953     10260       0

         56     1.2727    6944     .9953     10260       0

         60     1.3636    7440     .9953     10260       0

         64     1.4545    7936     .9953     10260       0

         68     1.5455    8432     .9953     10260       0

         72     1.6364    8928     .9953     10260       0

         76     1.7273    9424     .9953     10260       0

         80     1.8182    9920     .9953     10260       0

根据语句查询buffer cache该设置多大合适。减少I/O(物理读次数)

平日注意收集积累一些常用的语句》。

 

6.Block(buffer内存中)状态

buffer header

x$bh:表中每一行的数据对应buffercache中的一个buffer

SQL> desc x$bh   

数据块的各种状态如下:

state:0~8

free:no valid block image(空闲的块,在buffer中没有被修改,与磁盘的数据一样)

XCUR:a currentmode block,exclusive to this instance

  当一个实例对应一个数据库时(非RAC环境下),一个current对应一个xcur

SCUR:a current mode block,shared with other instance

  当多个实例对应一个数据库时(RAC环境下),一个currnet有XCUR和SCUR两种状态

CR:a consistent read(stale) block image

      当一个块被修改时,这时另一个server process也要读取这个块时,系统会构造CR块,来避免读到未提交的信息。

READ:buffer is reserved for a block being read from disk   

从block写入buffer的那个过程

MREC:a block in media recovery mode

   在备份恢复时会有的状态

IREC:a block in instance (crash) recovery mode

   在备份恢复时会有的状态

write

   数据块从内存的buffer中写入磁盘文件的过程

pi

  

SQL> select distinct state from x$bh;

非RAC环境下,current永远等于xcur。

RAC下,有scur  

   

 

分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS