体系结构-数据库实例
实例内部细分为内存机构与进程结构,各自负责不同部分。
我们所谓的实例其实只是一组管理数据库文件的内存结构,数据库是在磁盘上创建一组物理文件,而数据库实例则管理其关联的数据库并为用户提供服务。
数据库实例与数据库互相不影响,可以有实例但不关联数据库,有数据库但是无实例。
一个实例可以绑定多个数据库,但是启用时实例只能同时调用一个数据库。实例通过系统标识符SID去区分
早期的oracle都是一个数据库对应一个实例,后面针对多个实例的情况下则提出了server_name这个概念用于区分数据库,其他内容保持不变。
1.1.1、内存结构
1.1.1.1、 系统全局区SGA(oracle所有实例共享的内存结构)
包含oracle数据库实例的数据与控制信息。这里的每个数据包都包含缓存的数据块与共享的SQL以及重新做记录的数据。
**包含: ** 共享池shared pool、大池large pool、流池streames pool、java池java pool、重做日志缓冲区redo log buffer、数据库高速缓冲区database buffer cache、记忆区in-memory。
SGA组件介绍
-
数据库高速缓存区 database buffer cache
存储的是数据库的数据文件中读取的数据块副本,一般是事务select的。由服务器进程将数据文件中数据读入到高速缓冲区。
-
重做(重放)日志缓冲区 redo log buffer
存储的是数据库所作更改条目的信息,包好dml或者dll操作(crud),使用scn进行顺序区分。触发检查点或者当前数据块满了后会LGWR日志写入进程才会将内容存入重放日志中。
show pararmeter log_buffer为指定大小参数
-
共享池 shared pool
#库高速缓存 #私有sql: #与共享sql区关联 #专用服务器模式下是存在在pga而不是sga #每个操作事务的用户在oracle中都会分配一个私有sql区,存储着当前用户执行过的sql语句,但这些私有sql区使用同一个共享sql区 #共享sql: #在第一次解析某条sql语句后,放入内存,可以被所有的数据库用户共享,无需再进行解析。但是该区域有条目限制 #可以在init.ora中设置 #数据字典缓存 #sql解析期间,oracle经常访问的数据字典 #服务器结果缓存 #存放结果集,服务器结果缓存包含sql查询结果和plsql函数 #保留池 #oracle数据库可以用于分配存储器大的连续组块区域
-
大池
SGA的可选区域对于备份、恢复以及具有大量排序的语句操作需要使用大池
-
java池
存储JVM内所有会话的特定java代码
desc v$javapool #查看java池情况 性能情况
-
流池 Streams pool
存储的是缓冲队列中消息与oralce数据流。涉及到oracle的流技术
-
固定SGA
SGA用途
- 维护多进程与现场同时访问数据结构(共享池shared pool、大池large pool、流池streames pool、java池java pool)
- 缓存读取磁盘数据块(记忆区in-memory。)?
- redo重做数据写入联机日志钱做缓冲(重做日志缓冲区redo log buffer)
- 存储sql执行计划(共享池shared pool
1.1.1.2、 程序缓冲区PGA
非共享内存区域, oracle进程使用的所有数据与控制信息在此处。只能由oracle数据库进行创建.主要为某个用户进程服务,不同用户有不同的PGA区,每个用户的pga区域被分为非工作区与工作区两部分。 数据库实例只能控制工作区
#pga内容
#私有sql区域:
#存储数据进程执行私有数据和控制结构,参考sga的私有sql介绍
#非服务器模式安装下存在sga
#会话空间:
#sql工作区:
#sql进行所有排序操作(order by /group by /distinct/union等)、表连接(hash)、位图连接。创建位图
#pga手工管理
#1、参数*_area_size需要适当修改,如果过于随便会报错ORA-4030
#sort_area_size 每个会话可以用于内存排序的空间最大值
#hash_area_size每个会话可以用于hash连接的内存空间最大值
#bitmap_merge_area_size --每个会话使用位图合并连接时的内存工作区域的最大值
#create_bitmap_area_size --每个会话创建位图时可以使用的内存工作区域的最大值
#sort_area_retained_size
#2、修改参数 工作区状态
show parame WORKAREA_SIZE_POLICY
alter system set WORKAREA_SIZE_POLICY=manual
#3、监控PGA
COL PROGRAM FOR A25;
COL SPID FOR 9999;
SET LINESIZE 1000;
select program,spid,PGA_USED_MEM/1024 PGA_USED,PGA_ALLOC_MEM/1024 PGA_ALLOC,PGA_FREEABLE_MEM/1024 PGA_FREE,PGA_MAX_MEM/1024 PGA_MAX FROM V$PROCESS ORDER BY PGA_USED;#查看pga内部各块使用情况
select * from v$sysstat where name like '%uga%';#所有用户session创建总计内存
select * from v$sysstat where name like 'session%ga%';#
select * from X$KSMPP order by KSMCHPTR; #
Select pga_target_for_estimate/1024/1024 ||'M' "PGA",estd_pga_cache_hit_percentage "SORT_Hit(%)",estd_extra_bytes_rw/1024/1024 ||'M' "Read/Write",estd_overalloc_count "IO" From v$pga_target_advice;
1.1.1.3、 用户全局区UGA
与用户会话相关的数据信息
#UGA按照不同服务器部署方式存在于不同位置
专用服务器上UGA就属于PGA
共享服务器上UGA在large pool池
软件代码
oracle的软件代码作为内存一部分存在,用于存储正在运行或者可以运行的代码
Oracle内存管理
oracle为满足数据库需求,通过内存管理维护各个实例内存结构最优大小。一般基于内存关联初始化参数进行内存管理。内存管理有如下两种方式
-
自动化内存管理AMM :通过指定提前指定实例内存目标大小,将实例自动优化到对应大小病根军实际情况调整实例在系统全局区SGA与程序全局区PGA中所使用的内存比例
-
自动化共享内存管理ASMM :设置一个SGA目标大小,然后设置PGA的总目标大小或者单独管理
PGA各个工作区
alter system set sga_target=0 #设定SGA各个内存最多使用使用的大小,默认为0是不启动,此处为不启动 #设置sga_target参数后sga内存区大小会自己进行调整,sga_target单位字节设置前记得换算 elect ((select sum(value) from v$sga)-(select current_size from v$sga_dynamic_free_memory))as "sga_target" from dual #计算当前的sga_target值,可以用于参考进行设置
-
手工内存管理Mmm :不设置总内存大小,但是需要进行初始化参数设置
#内存参数 V$SGA #oracle总计sga空间 V$SGAINFO #显示所有SGA的大小信息,包括但不限于组件、颗粒以及可用内存等 V$SGASTAT #查看所有共享池、流池、java池信息使用大小 V$PGASTAT #显示 PGA 内存使用情况统计信息以及有关自动PGA内存管理器的累计值等 V$MEMORY_DYNAMIC_COMPONENTS #显示有关所有自动调整和静态的当前大小的所有信息内存组件(默认显示最后一次操纵的) V$SGA_DYNAMIC_COMPONENTS # V$SGA_DYNAMIC_FREE_MEMORY # V$MEMORY_CURRENT_RESIZE_OPS # V$SGA_CURRENT_RESIZE_OPS # V$MEMORY_RESIZE_OPS # V$SGA_RESIZE_OPS #显示有关最近完成的 800 次 SGA 组件大小调整的信息操作 V$MEMORY_TARGET_ADVICE # V$SGA_TARGET_ADVICE #显示oracle计算出的 帮助调整sga_target的信息 V$PGA_TARGET_ADVICE # V$IM_SEGMENTS #显示IM列存储中所有段的内容
#常用脚本
select COMPONENT,sum(CURRENT_SIZE/1024/1024) mb from v$memory_dynamic_components
group by COMPONENT; #查看内存分配情况
select COMPONENT,CURRENT_SIZE/1024/1024 CURRENT_SIZE
from v$memory_dynamic_components where COMPONENT in('PGA Target','SGA Target');
#查询sga与pga大小
1