先查看数据库默认启动文件:
SELECT value FROM v$parameter WHERE name = 'spfile';
可以看出数据库默认为SPFILE启动
使用以下命令检查当前会话使用的是SPFILE还是PFILE:
首先,将 MEMORY_TARGET 参数设置为 0。这将确保 Oracle 不会自动管理 SGA 和 PGA 的大小,而是让你手动配置它们。执行以下命令:
ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
使用以下命令将 SGA 的大小设置为 2GB,PGA 的大小设置为 200MB:
ALTER SYSTEM SET sga_target=2G scope=spfile;
ALTER SYSTEM SET pga_aggregate_target=200M scope=spfile;
这将在 spfile 中设置系统级参数 SGA_TARGET 和 PGA_AGGREGATE_TARGET 的值,并将其范围设置为 spfile。请注意,在将这些值更改为新值之前,数据库必须重启。
遇到问题:
解决办法 :
如果你遇到内存不足的问题,可以尝试通过调整 SGA(System Global Area)和 PGA(Program Global Area) 的大小来进行优化。以下是在 Oracle 中进行此操作的一般步骤:
-
连接到正确的数据库实例并确保具有适当的权限。
-
首先,将 MEMORY_TARGET 参数设置为 0。这将确保 Oracle 不会自动管理 SGA 和 PGA 的大小,而是让你手动配置它们。执行以下命令:
ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE;
-
然后,将 SGA_TARGET 和 PGA_AGGREGATE_TARGET 参数设置为所需的大小。可以根据你的实际需求选择合适的值。执行以下命令进行设置:
ALTER SYSTEM SET SGA_TARGET=2G SCOPE=SPFILE; ALTER SYSTEM SET PGA_AGGREGATE_TARGET=200M SCOPE=SPFILE;
-
重启数据库实例,使新的参数设置生效:
SHUTDOWN IMMEDIATE; STARTUP;
-
检查参数设置是否生效。执行以下命令确认参数设置是否正确:
SHOW PARAMETER sga_target; SHOW PARAMETER pga_aggregate_target;
-
可以尝试不同的 SGA 和 PGA 大小组合,根据实际情况进行调整。建议先将其设置为较小的值,然后逐渐增加,直到达到令你满意的性能效果。
请注意,调整 SGA 和 PGA 大小可能需要进行多次实验和测试,以找到最适合你的数据库实例的配置。同时,确保服务器的物理内存足够支持所配置的 SGA 和 PGA 大小,以避免出现内存不足的问题。
具体原因:其实就是AMM和ASMM的区别
具体参考:
有道云笔记https://note.youdao.com/s/Kp5LSlv4
1、自动内存管理(AMM)(默认Oracle11g实例采取的方式):只需要显式的设置MEMORY_TARGET,无须其他内存参数设置。
2、自动共享内存管理(ASMM)(Oracle10g采取的内存管理方式):显式的指定SGA_TARGET的值,无须设定SGA内部的值。
3、手工共享内存管理(Oracle9i采取的内存管理方式):SGA_TARGET 与 MEMORY_TARGET 都要设置为 0. 然后手工设定 share_pool_size 、db_cache_size 等 sga 参数。
4、自动PGA内存管理(Oracle9i引入的方式):这里只需要设置PGA_AGGREGATE_TARGET 的值。当然,如果要做到精细控制而切换到手动PGA内存管理模式,需要设定WORKAREA_SIZE_POLICY = manual (默认为 AUTO),再另行设置SORT_AREA_SIZE等值。
从ASMM到AMM
SQL> alter system set memory_max_target=360m scope=spfile;
SQL> alter system set memory_target=360m scope=spfile;
SQL> alter system set sga_target=0m scope=spfile;
SQL> alter system set sga_max_size=0 scope=spfile;
SQL> alter system set pga_aggregate_target=0 scope=spfile;
从AMM到ASMM
SQL> alter system set memory_max_target=0 scope=spfile;
SQL> alter system set memory_target=0 scope=spfile;
SQL> alter system set pga_aggregate_target=100m scope=spfile;
SQL> alter system set sga_target=260m scope=spfile;
SQL> alter system set sga_max_size=260m scope=spfile;
----------------------------------------------------------------------------
如果重新启动系统,会报错。
SQL> startup force
ORA-00843: Parameter not taking MEMORY_MAX_TARGET into account
ORA-00849: SGA_TARGET 272629760 cannot be set to more than MEMORY_MAX_TARGET 0.
这个问题的原因是Oracle启动过程中对于参数的内部检查。因为MEMORY_MAX_TARGET被“显示”的赋值,与SGA_TARGET赋值相冲突。
解决的方法就是使用参数默认值。创建出pfile之后,将显示赋值为0的MEMORY_TARGET和MEMORY_MAX_TARGET记录行删除掉。再利用pfile启动数据库,重建spfile。
- 启动ASMM
1、从手动SGA管理到ASMM
根据以下的查询获取一个SGA_TARGET的大小
SELECT ( (SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY) ) "SGA_TARGET"FROM DUAL;
设置大小ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}]
2、从AMM到ASMM
设置MEMORY_TARGET参数为0,ALTER SYSTEM SET MEMORY_TARGET = 0;
记下来设置SGA_TARGET的值,也可以设置各个组件的最小值。
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 DB_CACHE_SIZE = 0;
ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;
SGA中的各个组件值可以自定义,自定义为该组件的最小值,然后数据库根据运转情况进行调整相应的值。