如何限制 Oracle 的内存使用?

nsa*_*sen 9 memory configuration oracle-12c

我想使用Oracle的自动内存管理,限制在4GB左右。(过去的经验表明,这对于我的开发 PC 来说已经足够了,而且比这更容易了解任何性能问题。)

我相信这些是要遵循的说明:

Oracle 12 自动内存管理

简而言之,要启用自动内存管理,请设置 memory_target 和(可选)memory_max_target。前一个参数应该是一个动态值,后者是一个更难的限制,只能在停止/启动数据库时更改。

我将这些设置为 sysdba:

SQL> alter system set memory_target = 4G scope = spfile;

System altered.

SQL> alter system set memory_max_target = 8G scope = spfile;

System altered.
Run Code Online (Sandbox Code Playgroud)

并检查值

SQL> show parameter target;
Run Code Online (Sandbox Code Playgroud)

范围可以只是当前正常运行时间的“内存”、“spfile”或“两者”;我选择 spfile,因为我将重新启动:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
Run Code Online (Sandbox Code Playgroud)

然而,这太简单了:

ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 13104M
Run Code Online (Sandbox Code Playgroud)

恢复并不难,但在我看来,如何通过内存调整也不是很明显,所以我将在下面发布我所做的事情,高级海报可以纠正/粉碎我。无论哪种情况,我都认为将它放在一个地方很好。

nsa*_*sen 5

问题是在安装数据库时,设置了冲突的其他参数。所以我需要将它们从“spfile”导出到“pfile”,备份它们,编辑它们,测试它们并从pfile导入到spfile:

SQL> create pfile='some/file/path' from spfile;

File created.
Run Code Online (Sandbox Code Playgroud)

然后我将冲突参数设置为零:

...
--*.pga_aggregate_target=3270m
*.pga_aggregate_target=0m
...
--*.sga_target=9811m
*.sga_target=0m
...
Run Code Online (Sandbox Code Playgroud)

然后我尝试再次启动:

SQL> startup pfile='some/file/path';

ORACLE instance started.
...
Run Code Online (Sandbox Code Playgroud)

并检查上面的 memory_target 和 memory_max_target 参数。一旦对事情感到满意,为了保持我所做的设置:

SQL> create spfile from pfile='some/file/path';

File created.
Run Code Online (Sandbox Code Playgroud)


Bal*_*app 5

要回答标题中的原始问题:

从 12c 开始,可以轻松限制 SGA 和 PGA。SGA 在早期版本中也可能受到sga_max_size数据库计算所依据的或 其他参数的限制sga_max_size

有问题的部分通常是 PGA,没有简单的限制值,只有一些变通方法,但现在可以通过使用pga_aggregate_limit参数轻松限制。