利用自动内存管理改进内存管理

本教程将向您介绍如何使用自动内存管理来尽可能避免出现“内存不足”的错误。

大约 15 分钟

主题

本教程包括下列主题:

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。 (警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

通过自动内存管理,Oracle 数据库 11g 可根据您的工作负载自动调整 PGA 和 SGA 组件的大小。管理内存最简单的方法是允许数据库对内存进行自动管理和调整。为此(在大多数平台上),您必须设置一个目标内存大小初始化参数 (MEMORY_TARGET) 和一个最大内存大小初始化参数 (MEMORY_MAX_TARGET)。因为目标内存初始化参数是动态的,所以您可以随时更改目标内存大小,无需重新启动数据库。由于最大内存大小充当上限,因此您不能随意地将目标内存大小设置得过高。此外,由于某些 SGA 组件不会轻易缩小或必须保持最小大小,因此数据库还会阻止您将目标内存大小设置得过低。

返回主题列表

开始本教程之前,您应该:

1.

安装 Oracle 数据库 11g。

2.

下载 amm.zip 文件并将其解压缩到您的工作目录(即 wkdir),然后导航到您的工作目录。

返回主题列表

使用自动内存管理

自动内存管理是现有的自动共享内存管理功能的扩展。自动内存管理可在需要时将 PGA 内存自动传输到 SGA 内存,反之亦然。

下面举例说明 PGA 内存到 SGA 内存的自动传输以及反向的自动传输。

执行以下步骤,了解自动内存管理的用法:

1.

以用户 oracle 的身份打开一个终端窗口。导航至解压缩 amm.zip 文件的目录。以用户 SYS 的身份启动一个 SQL*Plus 会话,并执行 amm_setup.sql 脚本该脚本将创建本 OBE 所必需的所有对象。它还将启用自动内存管理,并确保本 OBE 中的并行查询运行将使用大型池内存以便稍后在企业管理器内获得更好的显示效果。注:请勿在您的生产环境中运行该脚本!

@amm_setup

2.

打开您的浏览器窗口,以用户 SYS 的身份登录企业管理器。进入 Home 页面后,单击 Server 选项卡。在 Server 子页面中,单击 Memory Advisors 链接。

3.

在 Memory Advisors 页面中,确认已启用 Automatic Memory Management。您可以在该页面中启用/禁用自动内存管理功能。

4.

在同一终端会话中,以用户 amm(口令 amm)的身份进行连接,并执行 query1.sql 脚本。该脚本将启动并行查询,并行度设置为 24。执行该语句将消耗大量 SGA。

@query1

5.

在同一终端会话中,执行 query2.sql 脚本。该脚本将启动同一个并行查询,但并行度设置为 26。较之前一次执行,该语句将使用更多的 SGA。

@query2

6.

在同一终端会话中,执行 query3.sql 脚本。该脚本将调用一个在内存中构建大数组的 PL/SQL 过程。该执行将使用许多 PGA。注意,执行时间至少为 5 分钟。

@query3

7.

返回企业管理器会话,单击 Memory Advisors 页面顶部的 Refresh 按钮。您应当观察到这三个执行对内存的影响。因为前两个运行使用了许多大型池内存,所以将 PGA 传输至 SGA。而第三个运行使用了许多 PGA,因此将内存从 SGA 传输回 PGA。所有这些都是自动完成的,不会生成“内存不足”的错误。如果您希望就如何设置 MEMORY_TARGET 参数获得一个全局性建议,可以单击该页面顶部的 Advice 按钮。

8.

退出 SQL*Plus 会话。修改 amm_cleanup.sh 脚本中的目录,使其指向放置相应文件的目录。然后执行 amm_cleanup.sh 脚本。该脚本将生成一个新的 AWR 快照以强制进行 ADDM 分析。

./amm_cleanup.sh

返回主题列表

在本教程中,您学习了如何使用自动内存管理功能。

返回主题列表

将鼠标置于该图标上可以隐藏所有的屏幕截图。