oracle的实例(体系结构:内存结构+进程结构)

参考连接:https://blog.csdn.net/angelxf520/article/details/82432193

一、oracle体系结构

oracle的体系结构分三类:内存结构、进程结构、存储结构

实例:内存结构+后台进程(查看实例是否启动),sga=share pool(fixed size+variable size)+db buffer+redo buffer

数据库:构成数据库的物理文件

 

二、内存结构

自动内存管理(AMM,automatic memory management):只要给数据库分配一个总的内存大小,oracle自动分配sga和pga大小。

show parameter memory_max_target;  //数据库能使用的最大内存,当没有设置该值而设置了memory_target时自动同步为memory_target大小。
show parameter memory_target;  //当没有设置该值而设置了memory_max_target时,memory_target自动为0

1、SGA(系统全局区)

自动SGA内存管理(ASMM,automatic sga memory management):只要给SGA分配大小,数据库会自动分配里面内存大小,sga_max_size是sga的最大内存、sga_target。

select * from v$sga;   //内存结构的摘要信息,name是sga内存区的名字,value是内存区的值
select * from v$sgastat;  //内存分配的细节
select * from v$sgainfo;  //内存分配的详细信息
show parameter sga;  //输出sga相关参数
sga_target=0;   //等于0表示禁用自动SGA内存管理
sga_max_target=392m;  //sga内存的最大值
select * from v$sga_target_advice;  //用于建议sga设置大小是否合理
//sga_size是sga的期望大小;sga_size_factor是期望sga大小与实际sga大小的百分比;estd_db_time是sga设置为期望的大小后,其dbtime消耗期望的变化;estd_physical_reads是修改前后物理读的差值

(1)、Share Pool(共享池)

select * from v$shared_pool_advice;  //用户建议共享池大小的设置
//shared_pool_size_for_estimate是估算的共享池的大小;shared_pool_size_factor是估算的共享池大小与当前大小比;
//estd_lc_size是估算共享池中用于库缓存的大小;estd_lc_memory_object_hits是估算的可以直接从共享池中命中的内存对象的命中次数。
select * from v$shared_pool_reserved;  //存放共享池中保留区的统计信息
//free_space是保留区的空闲空间数;avg_free_size是保留区的空闲空间平均数;free_count是保留区的空闲内存块数;used_space是保留区使用空间数;
//以上字段只有shared_pool_reserved设置了才有效

a、Library Cache(库高速缓存)

用于存储SQL语句及相关的解析,执行计划,PL/SQL程序块等。

select * from v$db_object_cache;  //显示所有被缓存在library cache中的对象,包括表、索引、PL/SQL存储过程、包和触发器。
//name是对象名称;dblink是对象的dblink名称;namespace是库缓存的对象命名空间;type是对象类型;locks是当前多住这个对象的用户数;
v$sql、v$sqlarea、v$sqltext都可用于查询共享池中已经解析过的SQL语句及其相关信息;
select * from librarycache;  //包含关于library cache的性能统计信息
//namespace是library cache的命名空间;gets是请求该命名空间中对象的次数;gethitratio请求get的命中率;pins读取或执行该命中对象的次数;reloads是pin请求从磁盘中载入对象的次数

b、Data Directory Cache(数据字典缓存)

存放数据字典信息,包括表、视图等对象的结构信息,用户以及对象权限

c、Result Cache(结果集)

缓存查询的结果

(2)Database Buffer Cache(数据库缓冲区高速缓存)

服务器进程,针对每一个连接启动一个服务器进程;数据在Buffer cache,如果没有就找dbf数据文件;dbw数据库写进程将修改后的数据写入数据文件。

select name,value from v$sysstat where name in ('db block gets from cache','consistent gets from cache','physical reads cache');  
db_cache命中率=1-(physical reads cache/(db block gets from cache+consistent gets from cache))
select name,physical_reads,db_block_gets,consistent_gets,1-(physical_reads/(db_block_gets+consistent_gets))hitratio from v$buffer_pool_statistics;//推导缓冲区高速缓存的命中率
select * from v$dba_cache_advice; //用于建议缓冲区高速缓存设置

(3)、Redo Log Buffer(重做日志缓冲区)

buffer cache中的数据一旦有修改就会产生该日志;LGWR将Log Buffer写入redo log中,写满后进行切换;ARCn将redo log归档到归档日志。

show parameter log_buffer;  //log_buffer决定redo log buffer的大小
select * from v$sgastat where name='log_buffer';

(4)、Large Pool(大池)

用于RMAN备份;执行大量查询;执行大量排序操作;共享服务器。

show parameter large_pool_size;

(5)、Java Pool(Java池)

用于存储所有回话中特定Java代码和JVM中数据

show parameter java_pool_size;
select * from v$java_pool_advice;  //查询建议统计数据

(6)、Stream Pool(流池)

 如果设置了sga_target,oracle会从sga中分配内存给流池;如果没有指定sga_target,则从buffer cache中转换一部分内存给流池

show parameter stream_pool_size;
select * from v$stream_pool_advice;  //查询建议统计数据

 

2、PGA(程序全局区)

select name,value from v$pgastat where name in('maximun PGA allocated','total PGA allocated');  //查看当前pga的分配情况
show parameter pga;  //pga_aggregate_target非0时启用pga自动管理

PGA_AGGREGATE_LIMIT指定实例使用的聚合PGA内存的限制;

(1)Private SQL area(私有SQL区)

包含绑定信息、运行时的内存结构,每个发出SQL语句的绘画,都有一个私有SQL区。排序和hash join会使用PGA内存。

(2)Session memory

为保存会话中的变量以及其他与会话相关的信息,而分配的内存

 

三、进程结构

1、用户进程

当数据库用户或批处理进程连接到Oracle DB时启动

V$SESSION视图 //用户进程信息
SID  //SESSION标识
SERIAL#  //如果SID被其他SESSION占用的话,SERIAL#数值自增1
USERNAME  //当前session在oracle中的用户名
SERVER  //dedicated表示是专有连接(一个服务进程对一个用户进程),none表示是共享连接(一个服务进程对多个用户进程)
PADDR  //服务器进程编号
TADDR  //事务信息
OSUSER  //客户端操作系统用户名
MACHINE  //客户端执行的机器
PROCESS  //客户端进程ID
TERMINAL  //客户端终端
PROGRAM  //客户端执行的客户端程序
select machine,program,paddr from v$session;  //得到paddr
select spid from v$process where addr='paddra';  //得到进程ID号
ho ps -ef|grep spid;  //可以查看用户是否是远程连接,local=no表示是远程连接,不是本地连接

2、服务器进程

用户建立会话时启动

V$PROCESS  //服务进程信息,接收用户进程信息,并处理
ADDR  //内存地址,与session中的PADDR一致
SPID  //操作系统进程号
USERNAME  //用户名
SERIAL#  //序列号
PGA_****  //服务进程信息保存在PGA
select spid from v$process where addr in (select paddr from v$session where username='SCOTT')  
ho ps -ef|grep spid

3、后台进程

V$BGPROCESS;  //后台进程信息
SELECT * FROM V$BGPROCESS WHERE PADDR<>'00'  //查看当前正在运行的后台 

(1)、PMON(进程监视进程)

负责“监控”和“清除”其他进程。PMON进行的是动态注册,不是静态注册,如果实例未启动及PMON也未启动,这时候也可以进行静态注册,在11g之后就不是PMON负责监听了,是LREG。

a、PMON(Process Monitoring Process):监控用户连接

主外:在用户进程失败时执行进程恢复;清除数据库缓冲区高速缓存;释放该用户进程使用的资源

b、CLMN(Cleanup Main Process):清理主进程

c、CLNN(Cleanup Helper Proccess):清理助手进程

触发条件:手动处理:终止操作传统或alter system kill session;定期检查:clnn会定期清除终止的进程

(2)、SMON(系统监视进程)

负责各种“系统级”清理职责;主内:监控实例内部,实例恢复,如整理碎片、清理不适用的临时段。

触发条件:定期检查:定期检查其他进程是否需要,若需要则调用

(3)、DBWn(数据库写进程)

将Database Buffer Cache中的脏数据写到数据文件中,database buffer cache->data file,只写不读。

show parameter db_wr;  //数据库写进程有多少个
alter system set db_writer_processes=30 scope=spfile;  //修改进程个数,因为是静态参数所以要在后面加上scope

触发条件:没有任何可用缓冲区;脏缓冲区过多;三秒超时;遇到检查点进程(CKPT)。

(4)、LGWR(日志写进程)

管理online redo log buffer,将log buffer中的数据写入redo log中。

触发条件:用户提交一个事务(commits a transaction);发生在线重做日志切换(online redo log switch);距上次写入的时间间隔超过3秒;有三分之一的log buffer未被写入磁盘,或包含 1MB的缓冲数据(log buffer)未被写入磁盘;DBWn需要写入的数据的SCN大于LGWR记录的SCN,触发LGWR写入。

(5)、CKPT(检查点进程)

更新控制文件和数据文件的头与检查点信息,并通过DBW写入磁盘。维护系统一致性进程,维护数据文件文件头、控制文件、联机重做日志文件时间点一致,用户进程事务提交都会触发CKPT进程。触发时,通知控制文件写新的scn及数据文件更新scn,通知DBWn进程把高速缓冲区数据写到磁盘,通知LGWR写。

a、检查点类型

完全检查点;执行ALTER SYSTEM CHECKPOINT;正常关闭实例;增量检查点

(6)、ARCn(日志归档进程)

将写满后的redo log写入到归档日志中

 

posted @ 2022-06-01 09:30  微风徐徐$  阅读(250)  评论(0编辑  收藏  举报