DBA之路--体系结构_数据库实例-内存结构

体系结构-数据库实例

实例内部细分为内存机构与进程结构,各自负责不同部分。

我们所谓的实例其实只是一组管理数据库文件的内存结构,数据库是在磁盘上创建一组物理文件,而数据库实例则管理其关联的数据库并为用户提供服务。

数据库实例与数据库互相不影响,可以有实例但不关联数据库,有数据库但是无实例

一个实例可以绑定多个数据库,但是启用时实例只能同时调用一个数据库。实例通过系统标识符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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值