数据库内存和进的配置和优化

MEMORY_MAX_TARGET设置数据库实例的最大内存大小:设置内存大小的上限
MEMORY_TARGET 设置内存大小(可动态调整,不需要重启数据库)

自动共享内存管理
    SGA_TARGET:初始化参数指定数据库实例总SGA的总数量
    所有SGA组件都以粒度(GRANULE)为最小单位分配和回收空间,粒度是连续虚拟内存分配的单位
    SGA >=1G        粒度大小为4M
    SGA >1G            粒度大小为8M
    粒度大小为4M,DB_CACHE_SIZE为10M,则实际分配3*4=12M空间给数据库高速缓存,即3个粒度单位
    
    SGA_MAX_SIZE设置SGA的最大空间,这个空间值包含高速缓存池,共享池,大型池,JAVA池和流池的总大小
    SYS AS SYSDBA@ORCL>SHOW PARAMETER SGA_MAX_SIZE;

    NAME                     TYPE          VALUE
    ------------------------------------ -------------------- ------------------------------
    sga_max_size                 big integer      404M
    
    共享池    SHARED_POOL_SIZE
    大型池    LARGE_POOL_SIZE
    JAVA池    JAVA_POOL_SIZE
    缓冲区高速缓存    DB_CACHE_SIZE
    流池    STREAM_POOL_SIZE
    
    启用自动共享内存管理功能:设置SGA_TARGET设置非零值,将取代控制单独SGA组件分配内存和其他参数,再将共享池,大型池等的值设置为0值,才能由ORACLE自动为SGA组件分配内存空间
    
    
    
    手动共享内存管理
    
    自动PGA内存管理
    PGA_AGGREGATE_TARGET用来控制PGA内存数量,这是PGA参数值的最大值
    SYS AS SYSDBA@ORCL>SHOW PARAMETER PGA_AGGREGATE_TARGET;

    NAME                     TYPE          VALUE
    ------------------------------------ -------------------- ------------------------------
    pga_aggregate_target             big integer      0
    
    
    手动PGA内存管理
    WORKAREA_SIZE_POLICY参数设置为MANUAL
    
    
    专用服务器进程(会话内存从PGA中分配)和共享服务器进程(会话内存从SGA中分配)
    
    数据库驻留连接池(会话内存从PGA中分配)
    DATABASE RESIDENT CONNECTION POOLING(DRCP):通常为WEB应用程序提供连接池
    
    
    
    使用V$SGAINFO视图查看SGA基本信息
    SYS AS SYSDBA@ORCL>SELECT * FROM V$SGAINFO;

NAME              BYTES RES
-------------------- ---------- ---
Fixed SGA Size        1336960 No
Redo Buffers        6094848 No
Buffer Cache Size      75497472 Yes
Shared Pool Size      176160768 Yes
Large Pool Size     4194304 Yes
Java Pool Size        8388608 Yes
Streams Pool Size    4194304 Yes
Shared IO Pool Size          0 Yes
Granule Size        4194304 No    //表示粒度的大小,这里为4M
Maximum SGA Size      422670336 No
Startup overhead in    58720256 No
Shared Pool

Free SGA Memory Available  146800640


    使用V$SGASTAT视图查看SGA统计信息    //查看各个池中SGA组件的内存使用情况
    shared pool  KKSSP              497144
shared pool  quiesce system conte     300
         xt

shared pool  SGA structure for KP    2824
         ON kp

shared pool  SGA struct - SWRF Me    2160
         trics



    如何启用自动内存管理:
    SYS AS SYSDBA@ORCL>SHOW PARAMETER TARGET;

NAME                     TYPE          VALUE
------------------------------------ -------------------- ------------------------------
archive_lag_target             integer          0
db_flashback_retention_target         integer          1440
fast_start_io_target             integer          0
fast_start_mttr_target             integer          0
memory_max_target             big integer      404M
memory_target                 big integer      404M
parallel_servers_target          integer          8
pga_aggregate_target             big integer      0
sga_target                 big integer      0

查看分配的最大PGA容量:
SYS AS SYSDBA@ORCL>SELECT VALUE FROM V$PGASTAT WHERE NAME='maximum PGA allocated';

     VALUE
----------
 158905344
    
计算MEMORY_TARGET参数值的公式:
memory_target=sga_target+max(pga_aggregate_target,maximum PGA allocated)

修改值
    1.使用SPFILE启动数据库实例:使用下面的命令设置MEMORY_MAX_TARGET的值:
    ALTER SYSTEM SET MEMORY_MAX_TARGET=nM SCOPE=SPFILE;
    ALTER SYSTEM SET MEMORY_TARGET=mM
    ALTER SYSTEM SET SGA_TARGET=0
    ALTER SYSTEM SET PGA_AGGREGATE_TARGET=0

    2.使用文本服务器参数文件启动数据库实例:
    memory_max_target=nM
    memory_target=mM
    n代表:MEMORY_MAX_TARGET
    m代表:MEMORY_TARGET
    
    

    监测和调整自动内存管理
    查看所有动态内存组件的当前大小包括SGA和PGA的总大小
    SYS AS SYSDBA@ORCL>SELECT * FROM V$MEMORY_TARGET_ADVICE ORDER BY MEMORY_SIZE;

MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR    VERSION
----------- ------------------ ------------ ------------------- ----------
    303           .75        276         1.0024      0
    404             1        275              1      0
    505          1.25        275              1      0
    606           1.5        275              1      0
    707          1.75        275              1      0
    808             2        275              1      0

    监测和SGA目标大小:(自动内存管理模式)
    SYS AS SYSDBA@ORCL>SELECT * FROM V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE;

      SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS
    ---------- --------------- ------------ ------------------- -------------------
       198           .75       6394          1.0203          19427
       264         1       6267           1          19282
       330          1.25       6246           .9966          18231
       396           1.5       6245           .9965          18231
       462          1.75       6245           .9965          18231
       528         2       6245           .9965          18231
    
    启动自动共享内存管理(ASMM)[自动共享内存管理:指自动管理SGA大小] [自动内存管理:指自动管理SGA,PGA等的大小]
    运行以下语句得到SGA总的使用量,不是总量
    SYS AS SYSDBA@ORCL>SELECT( (SELECT SUM(VALUE) FROM V$SGA)-(SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY))     "SGA_TARGET" FROM DUAL;

    SGA_TARGET
    ----------
     275869696

    1 row selected.
    
    启动手动共享内存管理
    
    1.设置缓冲区高速缓存初始化参数
    一般数据库块大小是一定的,如果设置了不同的数据块的大小,可以通过设置不同数据块分配不同的缓冲区大小级不同的数据块进行数据缓存
    eg:
    DB_BLOCK_SIZE=4096M    //设置标准数据块的大小8K
    DB_CACHE_SIZE=1024M    //设置不同块大小的必选项
    DB_2K_CACHE_SIZE=256M    //2k数据块分配缓冲区的大小
    DB_8K_CACHE_SIZE=512M
    
    V$BUFFER_POOL:跟踪不同高速缓存组件的大小和挂起的修改大小的操作
    SYS AS SYSDBA@ORCL>SELECT NAME,BLOCK_SIZE,CURRENT_SIZE FROM V$BUFFER_POOL;

    NAME             BLOCK_SIZE CURRENT_SIZE
    -------------------- ---------- ------------
    DEFAULT            8192       72    //块大小8k   DATABASE_BUFFER_CACHE大小:72M
    
    可以使用独立的缓冲池来配置数据库缓冲区高速缓存
    使用:1.在缓冲区高速缓区中保存数据
          2.可以在其他缓冲区中应用新的数据块后立即用于保存新的数据
    缓冲池的种类:
        1.保持(KEEP)缓冲池,在内存中保留数据库对象的数据块
        2.回收(RECYCLE)缓冲池,当不需要使用某些数据块时,缓冲池将其从内存中回收以保存新的数据
        3.默认(DEFAULT)缓冲池,包含尚未分配给其他缓冲池的数据库对象的数据块,就好像这些对象被分配给默认缓冲池一样
    
    配置:
        参数:DB_KEEP_CACHE_SIZE    KEEP缓冲池
            DB_RECYCLE_CACHE_SIZE    RECYCLE缓冲池
    
    
    2.指定共享池的大小    
        初始化参数:SHARED_POOL_SIZE是一个动态参数    
        共享池大小=SHARED_POOL_SIZE+系统内部SGA系统开销值(大约为12M)
    
    3.设置大型池的大小
        初始化参数:LARGE_POOL_SIZE是一个动态参数
    4.设置JAVA池的大小
        初始化参数:JAVA_POOL_SIZE是一个动态参数
    5.设置流池的大小
        初始化参数:STREAMS_POOL_SIZE是一个动态参数
    
    6.设置结果集缓存(RESULT CACHE)的最大大小
        初始化参数:RESULT_CACHE_MAX_SIZE是动态参数,如果是0,就是禁用,要启用设置为非0值,然后重启数据库实例
        查看结果集有没有启用:
        SYS AS SYSDBA@ORCL>select dbms_result_cache.status() from dual;

        DBMS_RESULT_CACHE.STATUS()
        -----------------------------------------------------------
        ENABLED
    
    启用自动PGA内存管理
    
    设置PGA的总容量
        PGA_AGGREGATE_TARGET    //设置总容量
    有效PGA内存的总容量=PGA_AGGREGATE_TARGET值-为其他目的分配给PGA的内存容量(例如会话内存)
    
    相关统计视图:
        V$SYSSTAT
        V$SESSTAT
        V$PGASTAT    //PGA内在使用情况的统计信息
        V$SQL_WORKAREA
        V$SQL_WORKAREA_ACTIVE
    V$PROCESS:查看ORACLE数据库进程所分配和使用的PGA内存使用情况:
    SYS AS SYSDBA@ORCL>SELECT PID,PROGRAM,PGA_USED_MEM,PGA_ALLOC_MEM,PGA_FREEABLE_MEM,PGA_MAX_MEM FROM V$PROCESS;

       PID PROGRAM                        PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
---------- ------------------------------------------------ ------------ ------------- ---------------- -----------
     1 PSEUDO                               0         0             0       0
     2 oracle@oracle (PMON)                   520972    612508             0      612508

    
    启用手动PGA内存管理
    将初始化参数;WORKAREA_SIZE_POLICY设置为MANUAL
    通过配置以下参数的大小来手动配置PGA:
        SORT_AREA_SIZE,HASH_AREA_SIZE,BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE  控制SQL工作区的最大大小
        
    
    通过初始化参数配置共享服务器
        SHARED_SERVERS
        MAX_SHARED_SERVERS
        SHARED_SERVER_SESSIONS
        DISPATCHERS
        MAX_DISPATCHERS
        CIRCUITS
    
    启用共享服务器
        将参数SHARED_SERVERS设置为一个大于0
        ALTER SYSTEM SHARED_SERVERS=1
        
    
    配置调度器进程
        参数配置如下:
            dispatchers="(PROTOCOL=tcp)"
            dispatchers="(ADDRESS=(PROTOCOL=tcp)(PORT=5000))"
            dispatchers="(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.2.120))(DISPATCHERS=2)"
        调度器的数量=CELL(<并发会话的最大值>/每个调度器的连接数)
        
    查看调度器进程的信息
        V$QUEUE
        V$DISPATCHE
        V$DISPATCHE_RATE
    SYS AS SYSDBA@ORCL>SELECT * FROM V$DISPATCHER;
    
    显示处理等待调度器进程和等待的时间
    SYS AS SYSDBA@ORCL>SELECT DECODE(SUM(TOTALQ),0,'NO RESPONSES',SUM(WAIT)/SUM(TOTALQ)) "AVERAGE WAIT TIME"     FROM V$QUEUE Q,V$DISPATCHER D WHERE Q.TYPE='DISPATCHER' AND Q.PADDR=D.PADDR;


    关闭指定的调度器进程
    1.增加调试器
    SYS AS SYSDBA@ORCL>ALTER SYSTEM SET DISPATCHERS='(PROT=TCP)(DISP=2)','(PROT=TCPS)(DISP=2)';

    2.查看所有调度器的情况
    SYS AS SYSDBA@ORCL>SELECT NAME,NETWORK FROM V$DISPATCHER;

    3.关闭指定的调度器
    SYS AS SYSDBA@ORCL>ALTER SYSTEM SHUTDOWN IMMEDIATE 'D003';
    
    禁用共享服务器
    初始化参数SHARED_SERVERS=0 禁用共享服务器,
    MAX_SHARED_SERVERS=0    //以上如果两个参数都为0,则所有共享服务器将终止
    
    中止调度器进程(所有连接到共享服务器的客户端断开连接)
    ALTER SYSTEM SET DISPATCHERS='';


        
    启用数据库驻留连接池(SYS_DEFAULT_CONNECTION_POOL)
    
    1.启用数据库驻留连接池(数据库重启时会自动启动)
        SYS AS SYSDBA@ORCL>EXECUTE DBMS_CONNECTION_POOL.START_POOL();

        PL/SQL procedure successfully completed.
    2.在客户端连接池中显示的指定要使用系统的连接池
        (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MYHOST)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=SALES)(SERVER=POOLED)))
    
    3.禁用数据库驻留连接池
        EXECUTE DBMS_CONNECTION_POOL.STOP_POOL();
    
    配置数据库驻留连接池
    将连接池中服务器的最小数量修改为10
        EXECUTE DBMS_CONNECTION_POOL.ALTER_PARAM('','MINSIZE','10');
    恢复连接池的默认设置
        EXECUTE DBMS_CONNECTION_POOL.RESTORE_DEFAULTS();
    
    查看数据库驻留连接池的视图
        DBA_CPOOL_INFO
        V$CPOOL_STATS
        V$CPOOL_CC_STATS
    


    终止会话
    1.查看指定用户的会话SID,SERIAL#
    SYS AS SYSDBA@ORCL>SELECT SID,SERIAL#,STATUS FROM V$SESSION WHERE USERNAME='SYS';

           SID    SERIAL# STATUS
    ---------- ---------- --------
           125        5 ACTIVE/INACTIVE  //ACTIVE:表示在执行SQL语句,INACTIVE:表示没有执行SQL语句
    
    2.终止指定的会话:
        ALTER SYSTEM KILL SESSION '<会话SID>,<会话序列号>'
        SYS AS SYSDBA@ORCL>ALTER SYSTEM KILL SESSION '19,122';
    
        SYS AS SYSDBA@ORCL>SELECT SID,SERIAL#,STATUS FROM V$SESSION WHERE USERNAME='HR';

           SID    SERIAL# STATUS
    ---------- ---------- --------
        19      122 KILLED    
    
            

    
        
    
       

你可能感兴趣的:(java,数据库,虚拟内存)