oracle amm和asmm,在Oracle中,什么是ASMM和AMM?
A答案
ASMM(Automatic Shared Memory Management,自动共享内存管理)是Oracle 10g引入的概念。通过使用ASMM,就不需要手工设置相关内存组件的大小,而只为SGA设置一个总的大小,Oracle的MMAN进程(Memory Manager Process,内存管理进程)会随着时间推移,根据系统负载的变化和内存需要,自动调整SGA中各个组件的内存大小。ASMM的SGA中包含的组件及对应参数如下表所示:
在Oracle 10g中,必须将STATISTICS_LEVEL参数设置为TYPICAL(默认值)或者ALL才能启用ASMM功能,如果将其值设置为BASIC,那么会禁用很多新特性,比如像AWR、ASMM等。如果使用SQL*Plus来设置ASMM,那么必须先把SGA中包含的组件的值设置为0。通过设置SGA_TARGET参数为非零值来启用ASMM功能。
可以通过以下SQL来计算SGA_TARGET的值:
SELECT ((SELECT SUM(VALUE) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET"FROM DUAL;
设置SGA_TARGET的值,可以直接修改初始化参数文件后重启数据库,或者通过下面SQL命令进行修改:
ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}];
示例如下所示:
ALTER SYSTEM SET SGA_TARGET = 992M;
ALTER SYSTEM SET SHARED_POOL_SIZE = 0;
ALTER SYSTEM SET LARGE_POOL_SIZE = 0;
ALTER SYSTEM SET JAVA_POOL_SIZE = 0;
ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;
ALTER SYSTEM SET DB_CACHE_SIZE = 0;
在启用ASMM后,Oracle会自动调整SGA内部组件大小。若再手动指定某一组件值,则该值为该组件的最小值。例如,手动设置SGA_TARGET=8G,SHARED_POOL_SIZE=1G,则ASMM在自动调整SGA内部组件大小时,保证Shared Pool不会低于1G。当设置了SGA_TARGET参数后,Oracle将会收集SGA相关的统计数据,并通过V$SGA_TARGET_ADVICE呈现出来,因此,可以根据这些指导SGA_TARGET做相关的调整,以达到最佳情况。
Oracle 10g的ASMM实现了自动共享内存管理,但是具有一定的局限性。所以,在Oracle 11g中,Oracle引入了AMM(Automatic Memory Management,自动内存管理)的概念,实现了全部内存的自动管理。DBA可以仅仅通过设置一个目标内存大小的初始化参数(MEMORY_TARGET)和可选最大内存大小初始化参数(MEMORY_MAX_TARGET)就可以在大多数平台上实现AMM。AMM可以使实例总内存保持相对稳定的状态,Oracle基于MEMORY_TARGET的值来自动调整SGA和PGA的大小。MEMORY_TARGET是动态初始化参数,可以随时修改该参数的值而不用重启数据库。MEMORY_MAX_TARGET作为一个内存上限值,是一个静态参数,它是MEMORY_TARGET可以被配置的最大值。
如果内存发生变化,实例会自动在SGA和PGA之间做调整。若启用了AMM功能,而SGA_TARGET和PGA_AGGREGATE_TARGET没有显式的被设置,则默认SGA_TARGET为MEMORY_TARGET的60%,PGA_AGGREGATE_TARGET为MEMORY_TARGET的40%。如果MEMORY_MAX_TARGET设置为1400M,而MEMORY_TARGET设置为1000M,那么对于数据库实例而言,只有1000M可以使用,剩下的400M会被保留下来,但会被Oracle的MMAN进程锁定。但是,因为MEMORY_MAX_TARGET是显式设置的,所以,可以在不重启数据库的情况下动态调整MEMORY_TARGET。如果只设置了MEMORY_TARGET的值,而MEMORY_MAX_TARGET没有显式设置,那么MEMORY_MAX_TARGET的值默认是MEMORY_TARGET的大小。
当LOCK_SGA初始化参数的值设置为TRUE时,不能启用AMM,该参数的值默认为FALSE。
只要是设置了MEMORY_MAX_TARGET或MEMORY_TARGET,那么就说明启用了AMM。可以使用视图V$MEMORY_DYNAMIC_COMPONENTS动态查阅内存各组件的当前实时大小。
如果在创建数据库的时候未启用AMM,那么可以在建库后启用它,启用AMM需要重启数据库,具体步骤如下所示:
1、查询SGA_TARGET和PGA_AGGREGATE_TARGET的值,从而确定MEMORY_TARGET的最小值
SYS@lhrdb> SHOW PARAMETER TARGET
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 409M
sga_target big integer 1648M
2、确定自系统启动以来PGA的最大值,单位为bytes
SYS@lhrdb> select value from v$pgastat where name='maximum PGA allocated';
VALUE
----------
248586240
3、通过以下方法来计算出SGA_TARGET的最大值
memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)
例如:在这里,SGA_TARGET的值为1648M,PGA_AGGREGATE_TARGET的值为409M,PGA的最大值为248586240/1024/1024=237M,所以,MEMORY_TARGET的值至少为1648+409=2057M。
4、设置系统参数启用AMM
ALTER SYSTEM SET MEMORY_MAX_TARGET = 2100M SCOPE=SPFILE;
--重启数据库
ALTER SYSTEM SET MEMORY_TARGET = 2057M;
ALTER SYSTEM SET SGA_TARGET = 0;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
另外需要说明的一点是,使用AMM经常出现的一个错误是“ORA-00845: MEMORY_TARGET not supported on this system”。
[ZFZHLHRDB1:oracle]:/oracle>oerr ora 845
00845, 00000, "MEMORY_TARGET not supported on this system"
// *Cause: The MEMORY_TARGET parameter was not supported on this operating system or dev/shm was not sized correctly on Linux.
// *Action: Refer to documentation for a list of supported operating systems. Or, size dev/shm to be at least the SGA_MAX_SIZE on each Oracle instance running on the system.
这个错误原因是操作系统不支持MEMORY_TARGET参数或/dev/shm的大小设置不正确。解决方法就是将/dev/shm的值增大,至少需要大于数据库参数MEMORY_MAX_TARGET的值。修改步骤如下:
[root@LHRDB ~]# cat etc/fstab | grep tmpfs #查看/dev/shm大小
tmpfs /dev/shm tmpfs defaults,size=1G 0 0
[root@LHRDB ~]# mount -o remount,size=4G dev/shm #临时修改/dev/shm大小
[root@LHRDB ~]# vi etc/fstab #永久修改/dev/shm大小,tmpfs /dev/shm tmpfs defaults,size=4G 0 0
[root@LHRDB ~]# df -h | grep shm
tmpfs 4.0G 0 4.0G 0% /dev/shm
[root@LHRDB ~]#df -h /dev/shm/
Filesystem Size Used Avail Use% Mounted on
tmpfs4.0G04.0G0%/dev/shm
[root@LHRDB ~]# cat /etc/fstab | grep tmpfs
tmpfs /dev/shm tmpfs defaults,size=4G 0 0
再次启动数据库就可以正常启动了。
由于AMM不支持HugePage,而ASMM支持HugePage,所以,在生产库上强烈推荐使用ASMM。有关ASMM和AMM的区别如下表所示:
MOS:SGA and PGA Management in 11g's Automatic Memory Management (AMM) (ID 1392549.1)有非常详细的说明。
更多内容请参考:http://blog.itpub.net/26736162/viewspace-2138627/
oracle amm和asmm,在Oracle中,什么是ASMM和AMM?相关推荐
- oracle字符串只截取中文,Oracle提取字符串中“汉字”串的解决办法
我们在实际工作中常常要使用去特殊字符的功能,特别是插入到数据库中的数据,我们为了保证数据的质量,往往需要对数据进行清洗, 我们在实际工作中常常要使用去特殊字符的功能,特别是插入到数据库中的数据,我们为 ...
- oracle数据泵还原命令,Oracle Linux环境中使用数据泵的形式还原Oracle数据库
今天需要将一个数据泵方式导出的oracle备份文件还原到Linux环境下的Oracle数据库中,花了我不少时间查资料才搞定,得记录下来. 第一步.使用SecureFXPortable工具,将备份文件( ...
- navicat导出数据到oracle,使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中...
使用Navicat premium导出oracle数据库中数据到SQL server2008数据库中 发布时间:2018-08-20 14:41, 浏览次数:471 , 标签: Navicat pre ...
- oracle数据库全数据库名,Oracle数据库中的 数据库域名、数据库名、全局数据库名、SID、数据库实例名、服务名 解释...
菜鸟雷区 在配置listener.ora 和 tnsnames.ora 连接Oracle数据库服务器时,我们需要把 以下容易混淆的概念区分开来 数据库域名 数据库名 全局数据库名 SID 数据库实例名 ...
- oracle 12c pl/sql语言,ORACLE 12C SQL语句中通过with 定义PL/SQL 函数
在ORACLE 12C支持在sql语句中编写函数,用来实现sql语句操作需要使用函数的部分功能,该功能对于你不想在数据库中新建函数 or 你的库是read only模式下要使用新函数实现某种功能,可以 ...
- oracle nvarchar2 字符集不匹配,Oracle中NVARCHAR2字符集不匹配问题
Oracle中在做字符匹配时 遇到 NVARCHAR2 类型时报错,提示 字符集不匹配. 对使用 NVARCHAR2 的地方,需要对字段进行字符转换,加上 to_char(nvarchar2 字段) ...
- java 获取oracle表结构_获取Oracle中所有表的列表?
回答(19) 2 years ago 我们可以从以下查询获取所有表格,包括列详细信息: SELECT * FROM user_tab_columns; 2 years ago 使用sqlplus更好地 ...
- oracle 调用main方法,main方法中调用spring注入bean
public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext conte ...
- oracle安装gcc报错,记录oracle 9i for linux安装过程中几个错误
最近因为一个测试环境需要oracle 9i,我在Oracle linux 4.8上安装,竟然遇到几个问题记录下: 1.运行runInstaller提示如下错误 [oracle@xifenfei Dis ...
最新文章
- Fundamental Research:根系分泌物通过调控土壤微生物影响碳周转的机理
- C语言中的位运算和逻辑运算
- CSS盒子模型的使用及其注意事项——响应式Web系列学习笔记
- HSRP(Hot Standby Router Protocol)热备份路由协议
- BZOJ3930-莫比乌斯反演+杜教筛
- 1.4 编程基础之逻辑表达式与条件分支 16 三角形判断
- C#基础知识1-深入理解值类型和引用类型
- 【王道计组笔记】数制、编码、校验
- An internal error occurred during: Launching web on MyEclipse Tomcat
- 中文编程汉语编程实例
- 时序分析 30 金融资产预测 - 蒙特卡洛模拟
- javaweb基于SSM开发在线问卷调查系统(前台+后台) 课程设计 毕业设计源码
- 计算机快捷键如何移动到桌面,如何设置显示桌面快捷键 设置显示桌面快捷键方法【图文】...
- WINDOWS下输入法中英文切换
- python内置函数入门_Python入门-内置函数一
- 夏日当空心深如深渊——雨桐花
- 基于Android的旅游景点推荐
- Ubuntu 下软件列表
- javascript设计模式-中介者模式(mediator pattern)
- Cron 表达式详解及最新版本使用
热门文章
- Linux perf: 为什么采样频率设置为99Hz而不是100Hz?
- Redission实现分布式锁完美方案 以及 Lua 脚本浅谈
- 【编译原理】词法分析(正规式与自动机)
- 拿什么拯救你,我的大规模杀伤性武器--Nokia!
- 删除并清空应收应付模块 期初数据
- idea 创建module 没有src
- android wifi 视频,Android开发——通过wifi接收IPCamera视频流
- 2020-10-16 js实现模拟双色球摇号
- Godaddy服务器上关于ASP.NET网站建设一些经验 - 防SQL注入攻击(三)
- QQShow?你也可以做!