天天看点

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

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;

    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';

        19      122 KILLED