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写入到归档日志中