相克军_Oracle体系_随堂笔记005-Database buffer cache

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

Buffer cache {

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

2.clean

3.dirty

4.unused

}

--Database buffer cache

概述:

1.段、区、块的概念:

create table t2 (

id int,

name varchar2(30)

);

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

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

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

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

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

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

访问:

访问一个块,

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

2.buffer cache的意义:

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

②构造cr块

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

undo的作用{

回滚未提交事物;

构造cr块。

}

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

3.buffer cache的内存组织结构

CBC、LRU、LRUW、CHECKPOINT QUEUE

CBC    按照块地址将buffer链起来。

LRU    最近最少使用的顺序链起来。可用块~

LRU,MRU(最近最多使用)

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

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

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

4.DB_WRITER_PROCESSES

SQL> show parameter writer

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_writer_processes                  integer     1
SQL> alter system set db_writer_processes = 2 scope=spfile;
--DBWn数量一般设定是服务器核心数/8.

5.buffer cache的重要参数配置

alter system set db_cache_size=200m scope=both;
设置顺序:
sga_max_size
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的大小
根据语句查询buffer cache该设置多大合适。减少I/O(物理读次数)
平日注意收集积累一些常用的语句》。

6.Block状态

buffer header:
SQL> desc x$bh    

state:0~8
0,free
1,XCUR
2,SCUR
3,CR
4,READ    从block写入buffer的那个过程
5,MREC
6,IREC
7,write
8,pi

SQL> select distinct state from x$bh;
非RAC环境下,current永远等于xcur。
RAC下,有scur

Q:current块和cr块区别?

A:

cr块被构造后被读出,就马上没意义了。。马上就可以被覆盖了。。
要修改一个块,只能修改current块。

Q:查看一个对象占用了多少不同状态的buffer?

A:

select
o.object_name,
decode(state,0,‘free‘,1,‘xcur‘,2,‘scur‘,3,‘cr‘,4,‘read‘,5,‘mrec‘,
6,‘irec‘,7,‘write‘,8,‘pi‘) state,
count(*) blocks
from x$bh b, dba_objects o
where b.obj = o.data_object_id
and o.object_name = ‘T2‘
group by o.object_name, state
order by blocks desc

注:实验的时候可以先执行

alter system flush buffer_cache;

7.使用各种sql熟知buffer cache使用情况

select distinct object_name, dbarfil, dbablk from x$bh a, dba_objects b
where a.obj=b.object_id and object_name=‘T2‘;

OBJECT_NAME             DBARFIL     DBABLK

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

T2                            1      86184

T2                            1      86185

select object_name, dbarfil, dbablk from x$bh a, dba_objects b
where a.obj=b.object_id and object_name=‘T2‘;

Q:将buffer cache中占用buffer最多的对象给找出来?

A:

select
o.object_name,
decode(state,0,‘free‘,1,‘xcur‘,2,‘scur‘,3,‘cr‘,4,‘read‘,5,‘mrec‘,
6,‘irec‘,7,‘write‘,8,‘pi‘) state,
count(*) blocks
from x$bh b, dba_objects o
where b.obj = o.data_object_id and state<>0
group by o.object_name, state
order by blocks asc;

Q:寻找热块

A:

select
obj object,
dbarfil file#,
dbablk block#,
tch touches
from x$bh
where tch>10
order by
tch asc;

OBJECT      FILE#     BLOCK#    TOUCHES

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

5847          1      11752         29

5834          1      11664         29

5834          1      11665         29

5832          1      11649         30

5833          1      11657         30

5834          1      11666         31

287          1       2009         45

287          1       2008         45

96 rows selected.

注:块被逻辑读的次数多,就是热端,根据块的tch属性判断。

select object_name, dbarfil, dbablk from x$bh a, dba_objects b
where a.obj=b.object_id and dbarfil=1 and dbablk=287

Q:块的总数

A:

select sum(blocks) from dba_data_files;

SUM(BLOCKS)

-----------

176640

Q:查询当前空闲空间的比例,最好控制在10%以内

A:

select decode(state,0,‘FREE‘,1,decode(lrba_seq,0,‘AVAILABLE‘,‘BEING USED‘),3,‘BEING USED‘, state) "BLOCK STATUS",count(*)
from x$bh
group by decode(state,0,‘FREE‘,1,decode(lrba_seq,0,‘AVAILABLE‘,‘BEING USED‘),3,‘BEING USED‘,state);

BLOCK STATUS                               COUNT(*)

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

BEING USED                                       74

AVAILABLE                                      5385

FREE                                          10696

Q:最浪费内存的前10个语句占所有的比例,建议控制在5%以内

A:

select sum(pct_bufgets) "Percent"
from (select rank() over (order by buffer_gets desc) as rank_bufgets, to_char(100 * ratio_to_report(buffer_gets) over(),‘999.99‘)pct_bufgets from v$sqlarea)
where rank_bufgets < 11;

Q:找出消耗物理I/O资源最大的SQL语句

A:

select disk_reads, substr(sql_text,1,4000)
from v$sqlarea
order by disk_reads asc;

Q:常见的操作系统命令,查看

A:

iostat 1 10
vmstat 1 10
mpstat 1 10
mpstat -P 0 1
mpstat -P 1 1
top
free

内存读:消耗CPU资源

物理读:消耗I/O资源

相克军_Oracle体系_随堂笔记005-Database buffer cache

时间: 2024-08-10 00:04:17

相克军_Oracle体系_随堂笔记005-Database buffer cache的相关文章

相克军_Oracle体系_随堂笔记016-参数文件及数据库的启动和关闭

参数文件: spfile<SID>.ora    动态参数文件,是二进制文件,9i以后引入并建议使用 init<SID>.ora    静态参数文件,是文本文件 动态参数,部分参数可以动态修改.建议9i以后就使用spfile. 数据库启动三个阶段: nomount(根据参数文件配置参数启动实例) mount(根据参数文件中记录的控制文件位置打开控制文件) open(根据控制文件信息打开数据文件,redo日志文件,open数据库) 注:nomount之前就可以根据pfile创建spf

相克军_Oracle体系_随堂笔记010-SCN

1.SCN的意义?system change number 时间    先后.新旧 select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual; SCN号,为了保证数据的一致性: 2.常见的SCN  2.1控制文件的三个SCN        系统SCN select checkpoint_change# from v$data

相克军_Oracle体系_随堂笔记003-体系概述

1.进程结构图 对Oracle生产库来讲,服务器进程(可以简单理解是前台进程)的数量远远大于后台进程.因为一个用户进程对应了一个服务器进程. 而且后台进程一般出问题几率不大,所以学习重点也是服务器进程和PGA的关系(容易出问题). 2.Oracle 实例管理 6大共享池,5大后台进程,3大文件 控制文件:记录了各文件存放的位置以及当前的运行状态: 数据文件:存放数据: 重做日志文件:对数据文件所有的修改记录: 补充知识点: (1)实际生产环境中可以多个实例(一般是2个,4个,8个)对应一个数据库

相克军_Oracle体系_随堂笔记015-网络原理及配置

oracle网络没有负载, 没有负载的就不容易出问题.相对很简单的. 1.监听的动态注册: PMON 注册监听,或者 alter system register; 强制PMON抓紧注册. 都属于动态注册~ 对应的listener.ora文件配置信息: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.159)(PORT = 1521))) (DESCRIPTION

相克军_Oracle体系_随堂笔记014-锁 latch,lock

1.Oracle锁类型     锁的作用     latch锁:chain,链     LOCK锁         排他锁(X)         共享锁(S) 2.行级锁:DML语句     事务锁TX         锁的结构         事务锁的加锁和解锁过程     只有排他锁         不影响读(CR块) 3.表级锁:TM     行级排他锁(Row exclusive)RX锁         当我们进行DML时,会自动在被更新的表上添加RX锁,可以执行LOCK命令显式的在表上

相克军_Oracle体系_随堂笔记011-事物

数据库主要实现的功能无非是以下三点: ①数据的一致性, ②数据的安全, ③数据的优化. 事物主要影响数据的一致性. 1.事务的基本概念    一组DML语句    insert.delete.update    COMMIT;    ROLLBACK;    SAVEPOINT <savepoint_name>     ROLLBACK TO [SAVEPOINT] <savepoint_name> 2.隐式提交和回滚    DDL    退出        异常退出      

相克军_Oracle体系_随堂笔记009-检查点队列

1.检查点队列 checkpoint queue RBA 日志块地址 redo block address LRBA 第一次被脏的地址 HRBA 最近一次被脏的地址 on disk rba 重做日志(current redo log)中最后一条日志的地址 数据块里有两个地址,LRBA,HRBA. checkpoint queue 按照脏块第一次脏的时间链起来. checkpoint queue就是按照数据块的LRBA地址链起来的. 2.CKPT进程    每隔3秒钟触发一次        记录检

相克军_Oracle体系_随堂笔记012-undo

undo表空间中undo段是自动生成的,oracle自动使用undo表空间的undo段. 作为高级DBA,需要了解Oracle是如何使用undo段的.这样出了性能问题才能够解决. 1.Undo表空间及管理方式 show parameter undo_tablespace show parameter undo Undo段 select * from v$rollname; select SEGMENT_NAME,BLOCKS,EXTENTS from dba_segments where SEG

相克军_Oracle体系_随堂笔记013-字符集

linux环境下: [[email protected] ~]# locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" …… windows环境下: C:\Users\Martin>chcp 活动代码页: 936 字符集其实就是“字符”和“编码”的一张对照表, 数据库安装过程中,会选择确认下面两个字符集: 1.数据库字符集:数据库需要存储多国语言选择AL32UTF8,只有中英文选择ZHS16GBK 2.国家字符集 一般都选用AL16UTF1

相克军_Oracle体系_随堂笔记006-日志原理

简单来说,学习Oracle数据库就两个目标: 保证数据库数据的一致性: 提高数据库的性能(这个和日志没关系). 日志的功能: 只是保证数据库数据的一致性: 1.Oracle日志原理    史记讲解法    日志记录方式2.实际日志产生过程3.归档模式 alter database archivelog ARCHIVE LOG LIST SELECT log_mode FROM v$database alter database noarchivelog ALTER SYSTEM ARCHIVE