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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected]>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 [email protected] (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 [email protected]>SELECT * FROM V$DISPATCHER;
显示处理等待调度器进程和等待的时间
SYS AS [email protected]>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 [email protected]>ALTER SYSTEM SET DISPATCHERS=‘(PROT=TCP)(DISP=2)‘,‘(PROT=TCPS)(DISP=2)‘;
2.查看所有调度器的情况
SYS AS [email protected]>SELECT NAME,NETWORK FROM V$DISPATCHER;
3.关闭指定的调度器
SYS AS [email protected]>ALTER SYSTEM SHUTDOWN IMMEDIATE ‘D003‘;
禁用共享服务器
初始化参数SHARED_SERVERS=0 禁用共享服务器,
MAX_SHARED_SERVERS=0 //以上如果两个参数都为0,则所有共享服务器将终止
中止调度器进程(所有连接到共享服务器的客户端断开连接)
ALTER SYSTEM SET DISPATCHERS=‘‘;
启用数据库驻留连接池(SYS_DEFAULT_CONNECTION_POOL)
1.启用数据库驻留连接池(数据库重启时会自动启动)
SYS AS [email protected]>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 [email protected]>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 [email protected]>ALTER SYSTEM KILL SESSION ‘19,122‘;
SYS AS [email protected]>SELECT SID,SERIAL#,STATUS FROM V$SESSION WHERE USERNAME=‘HR‘;
SID SERIAL# STATUS
---------- ---------- --------
19 122 KILLED