- 浏览: 476194 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
谢谢你的祝福:
特地登陆上来感谢一下楼主,解决问题。
ORA-04098: 触发器无效且未通过重新验证问题 -
fuqiangjava:
写的不错 解决了自己的一个问题 谢谢了
ORA-00001:unique constraint (oracle 10g) -
hujinhuhujinhu:
make ...我有1.6.23
MyEclipse6.5安装自动提示功能的jQuery插件步骤 -
fool2011:
学习下,博主
JFreeChart类生成折线图的Java源代码 -
814687491:
你不是说的JQUERY吗?
MyEclipse6.5安装自动提示功能的jQuery插件步骤
自动共享内存管理
是不是很难准确地分配不同的池所需的内存数?自动共享内存管理特性使得自动将内存分配到最需要的地方去成为可能。
无论您是一个刚入门的 DBA 还是一个经验丰富的 DBA ,您肯定至少看到过一次类似以下的错误:
ORA-04031:unable to allocate 2216 bytes of shared memory ("shared pool"... ...
或者这种错误:
ORA-04031:unable to allocate XXXX bytes of shared memory
("large pool","unknown object","session heap","frame")
或者可能这种错误:
ORA-04031:unable to allocate bytes of shared memory ("shared pool",
"unknown object","joxlod:init h", "JOX:ioc_allocate_pal")
第一种错误的原因很明显:分配给共享池的内存不足以满足用户请求。(在某些情况下,原因可能不是池本身的大小,而是未使用绑定变量导致的过多分析造成的碎片,这是我很喜欢的一个主题;但目前让我们把重点放在手头的问题上。)其它的错误分别来自大型池和 Java 池的空间不足。
您需要解决这些错误情况,而不作任何与应用程序相关的修改。那么有哪些方案可选呢?问题是如何在 Oracle 例程所需的所有池之间划分可用的内存。
馅饼怎么分?
正如您所了解的,一个 Oracle 例程的系统全局区域 (SGA) 包含几个内存区域(包括缓冲高速缓存、共享池、 Java 池、大型池和重做日志缓冲)。这些池在操作系统的内存空间中占据了固定的内存数;它们的大小由 DBA 在初始化参数文件中指定。
这四个池(数据库块缓冲高速缓存、共享池、 Java 池和大型池)几乎占据了 SGA 中所有的空间。(与其它区域相比,重做日志缓冲没有占据多少空间,对我们这里的讨论无关紧要。)作为 DBA ,您必须确保它们各自的内存分配是充足的。
假定您决定了这些池的值分别是 2GB 、 1GB 、 1GB 和 1GB 。您将设置以下初始化参数来为数据库例程规定池的大小。
db_cache_size = 2g
shared_pool_size = 1g
large_pool_size = 1g
java_pool_size = 1g
现在,仔细看一下这些参数。坦白讲,这些值是否准确?
我相信您一定会有疑虑。在实际中,没有人能够为这些池指定确切的内存数 — 它们太依赖于数据库内部的处理,而处理的特性随时在变化。
下面是一个示例场景。假定您有一个典型的、大部分属于 OLTP 的数据库,并且为缓冲高速缓存分配的专用内存比为纯 OLTP 数据库(现在已经很少见了)分配的要少。有一天,您的用户放开了一些非常大的全表扫描,以创建当天的结束报表。 Oracle9 i 数据库为您提供了在线修改内存分配的功能,但由于提供的总物理内存有限,您决定从大型池和 Java 池中取出一些内存:
alter system set db_cache_size = 3g scope=memory;
alter system set large_pool_size = 512m scope=memory;
alter system set java_pool_size = 512m scope=memory;
这个解决方案能够很好地工作一段时间,但是接着夜间的 RMAN 作业(它们使用大型池)开始了,大型池将立即出现内存不足。同样,您从数据库高速缓存中取出一些内存来补充大型池,以挽救这种局面。
RMAN 作业完成,然后启动一个广泛使用 Java 的批处理程序,接着您开始看到与 Java 池相关的错误。因此,您(再次)重新分配池,以满足 Java 池和数据库高速缓存上的内存需求:
alter system set db_cache_size = 2G scope=memory;
alter system set large_pool_size = 512M scope=memory;
alter system set java_pool_size = 1.5G scope=memory;
第二天早上, OLTP 作业恢复在线,这个循环又完全重复!
解决这种恶性循环的一种替代方法是永久设置每个池的最大需求。不过,这么做的话,您分配的总的 SGA 可能超出可用的内存 — 从而在为每个池分配的内存数不足时,将增加交换和分页的风险。人工重新分配的方法(虽然不实际)目前看起来很不错。
另一种替代方法是将值设为可接受的最小值。不过,当需求增长且内存不能完全满足时,性能将受到影响。
注意在所有这些示例中,分配给 SGA 的总内存保持不变,而池之间的内存分配根据即时的需求进行修改。如果 RDBMS 将自动探测来自用户的需求并相应地重新分布内存分配,那不是很好吗?
Oracle 数据库 10 g 中的自动共享内存管理特性正好能够实现这一目的。您可以决定 SGA 的总大小,然后设置一个名称为 SGA_TARGET 的参数,这个参数决定 SGA 的总大小。 SGA 内部的各个池将根据工作负载动态地进行配置。实现自动内存分配仅仅需要 SGA_TARGET 参数的一个非零值。
设置自动共享内存管理
让我们看看该特性是如何工作的。首先,确定 SGA 的总大小。您可以通过确定现在分配了多少内存来估计这个值。
SQL> select sum(value)/1024/1024 from v$sga;
SUM(VALUE)/1024/1024
--------------------
500
此时 SGA 的当前总大小近似为 500MB ,并且这个值将变为 SGA_TARGET 的值。接下来,执行语句:
alter system set sga_target = 500M scope=both;
这种方法不需要为各个池设置不同值;因而,您将需要在参数文件中使它们的值为零或全部删除它们。
shared_pool_size = 0
large_pool_size = 0
java_pool_size = 0
db_cache_size = 0
再循环数据库,使这些值生效。
这个人工过程还可以通过 Enterprise Manager 10 g 实施。从数据库主页中,选择 "Administration" 选项卡,然后选择 "Memory Parameters" 。对于人工配置的内存参数,将显示标记为 "Enable" 的按钮,以及所有人工配置的池的值。单击 "Enable" 按钮,启用自动共享内存管理特性。企业管理器将完成剩下的工作。
在配置了自动内存分配之后,您可以利用以下命令检查它们的大小:
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
340
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 4
large pool 4
shared pool 148
正如您所看到的,所有的池都从 500MB 的总目标大小中自动进行分配。(参见图 1 。)缓冲高速缓存大小是 340MB , Java 池是 4MB ,大型池是 4MB ,共享池是 148MB 。它们合起来总的大小为 (340+4+4+148=) 496MB ,近似与 500MB 的目标 SGA 的大小相同。
现在假定提供给 Oracle 的主机内存从 500MB 减少为 300MB ,这意味着我们必须减少总 SGA 的大小。我们可以通过减小目标 SGA 大小来反映这种变化。
alter system set sga_target = 300M scope=both;
现在查看各个池,我们可以看到:
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
244
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 4
large pool 4
shared pool 44
占用的总大小是 240+4+4+44 = 296MB ,接近于目标的 300MB 。注意如图 2 所示,当 SGA_TARGET 改变时,如何自动重新分配池。
这些池的大小是动态的。池将根据工作负载扩展,以容纳需求的增长,或缩小以容纳另一个池的扩展。这种扩展或缩小自动发生,无需 DBA 的干预,这与本文开头的示例不同。让我们暂时返回到那个场景,假定在初始分配后, RMAN 作业启动,指示需要一个更大的大型池,大型池将从 4MB 扩展到 40MB ,以容纳需求。这个额外的 36MB 将从数据库缓冲中划出,数据库块缓冲将缩小,如图 3 所示。
池的大小变化基于系统上的工作负载,因此不需要为最坏的情况调整池的大小 — 它们将根据需求的增长自动调整。此外, SGA 的总大小始终在由 SGA_TARGET 指定的最大值之内,因此不存在使内存需求的增长比例失调(这将导致分页和交换)的风险。您可以动态地将 SGA_TARGET 增加至绝对最大值 , 这个绝对最大值是通过调整参数 SGA_MAX_SIZE 指定的。
哪些池 不 受影响?
SGA 中的一些池不受动态大小调整的影响,但是必须显式指定这些池。其中值得注意的是非标准块大小的缓冲池,以及 KEEP 池或 RECYCLE 池的非默认块大小。如果您的数据库有一个块大小为 8K ,而您想要配置 2K 、 4K 、 16K 和 32K 块大小的池,那么您必须手动设置它们。它们的大小将保持不变;它们将不会根据负载缩小或扩展。当使用多种大小的缓冲池、 KEEP 池和 RECYCLE 池时,您应当考虑这个因素。此外,日志缓冲不受内存调整的影响 — 不管工作负载如何,在参数 log_buffer 中设定的值是不变的。 ( 在 10 g 中,还可以在 SGA 中定义一种新的池:流池 (stream pool) ,它用参数 streams_pool_size 进行设置。该池也不受自动内存调整的影响。)
这就产生了一个有趣的问题。如果您需要一个非默认块大小的池,而且想自动管理其它的池,那么该怎么办?
如果您指定了这些非自动调整的参数中的任意一个(如 db_2k_cache_size ),那么它们的总大小将从 SGA_TARGET 值中减去,以计算自动调整的参数值,以使 SGA 的总大小保持不变。例如,假设值看起来像这样:
sga_target = 500M
db_2k_cache_size = 50M
其余的池参数未设置。 50MB 的 2KB 缓冲池为自动调整的池(如默认块大小缓冲池 ( db_cache_size ) 、共享池、 Java 池和大型池)保留了 450MB 。当以一种方法动态地调整不可自动调整的参数(如 2KB 块大小池) —— 这种方法将影响到可自动调整部分的大小,可自动调整的部分将重新调整。例如,将 db_2k_cache_size 的值从 50MB 提高到 100MB 只为可自动调整的参数剩余 400MB 。因此,如图 4 所示 , 可调整的池(如共享池、大型池、 Java 池和默认缓冲池)自动缩小,以将它们的总大小从 450MB 减少到 400MB 。
但如果您有足够的可用内存,或者上述风险可能不是那么明显,那应该怎么办?如果这样的话,您可以通过不指定参数文件中的参数 SGA_TARGET 、通过在文件中将其设为 0 ,或者通过使用 ALTER SYSTEM 动态地将其修改为 0 来关闭自动大小调整。当 SGA_TARGET 被设为 0 时,池的当前值被自动设为它们的参数。
使用 Enterprise Manager
您还可以使用 Enterprise Manager 10 g 来处理这些参数。从数据库主页中单击超链接 "Memory Parameters" ,这将显示一个类似于图 5 中的屏幕。
注意红圈中的项目:数据库在 Automatic Shared Memory Management 模式下运行,总大小为 564MB — 与在参数 SGA_TARGET 中指定的值相同。您可以在此修改它,然后单击 Apply 按钮接受这些值;可调整的参数将自动调整。
为每个池指定一个最小值
假定您将 SGA_TARGET 设为 600MB ,并且各个池已自动分配:
池
大小 (MB)
缓冲池
404
Java 池
4
大型池
4
共享池
148
看看上述值,您可能推断 4MB 的 Java 池和大型池可能有点不足;这个值在运行时无疑需要增加。因此,您可能想确保这些池至少在最初时具有更高的值,比如说,分别为 8MB 和 16MB 。您可以通过在参数文件中显式地指定这些池的值或动态使用 ALTER SYSTEM 来实现这一目的(如下所示)。
alter system set large_pool_size = 16M ;
alter system set java_pool_size = 8M ;
现在查看这些池,您可以看到:
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 8
large pool 16
shared pool 148
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
388
池的重新分配显示如下:
池
大小 (MB)
缓冲池
388
Java 池
8
大型池
16
共享池
148
注意 Java 池和大型池是如何分别被重新配置为 8MB 和 16MB ,并且注意为了使总的 SGA 保持在 600MB 以下,缓冲池已从 404MB 减少为 388MB 。当然,这些池仍然由自动共享内存管理控制 — 它们的大小将根据需求缩小或扩展。您显式指定的值为池的大小设定了一个下限;它们将永远不会缩小到低于这个界限。
结论
Oracle SGA 中的各种池的内存需求不是静态的 — 相反,它们根据系统上的需求而变化。 Oracle 数据库 10 g 中的自动共享内存管理特性通过动态地将资源重新分配到最需要它们的地方同时施加一个指定的最大值以防止分页和交换,使得 DBA 能够更有效地管理系统内存。更有效的内存管理还带来了更少的内存需求,这使得更精简的硬件更加可行。
是不是很难准确地分配不同的池所需的内存数?自动共享内存管理特性使得自动将内存分配到最需要的地方去成为可能。
无论您是一个刚入门的 DBA 还是一个经验丰富的 DBA ,您肯定至少看到过一次类似以下的错误:
ORA-04031:unable to allocate 2216 bytes of shared memory ("shared pool"... ...
或者这种错误:
ORA-04031:unable to allocate XXXX bytes of shared memory
("large pool","unknown object","session heap","frame")
或者可能这种错误:
ORA-04031:unable to allocate bytes of shared memory ("shared pool",
"unknown object","joxlod:init h", "JOX:ioc_allocate_pal")
第一种错误的原因很明显:分配给共享池的内存不足以满足用户请求。(在某些情况下,原因可能不是池本身的大小,而是未使用绑定变量导致的过多分析造成的碎片,这是我很喜欢的一个主题;但目前让我们把重点放在手头的问题上。)其它的错误分别来自大型池和 Java 池的空间不足。
您需要解决这些错误情况,而不作任何与应用程序相关的修改。那么有哪些方案可选呢?问题是如何在 Oracle 例程所需的所有池之间划分可用的内存。
馅饼怎么分?
正如您所了解的,一个 Oracle 例程的系统全局区域 (SGA) 包含几个内存区域(包括缓冲高速缓存、共享池、 Java 池、大型池和重做日志缓冲)。这些池在操作系统的内存空间中占据了固定的内存数;它们的大小由 DBA 在初始化参数文件中指定。
这四个池(数据库块缓冲高速缓存、共享池、 Java 池和大型池)几乎占据了 SGA 中所有的空间。(与其它区域相比,重做日志缓冲没有占据多少空间,对我们这里的讨论无关紧要。)作为 DBA ,您必须确保它们各自的内存分配是充足的。
假定您决定了这些池的值分别是 2GB 、 1GB 、 1GB 和 1GB 。您将设置以下初始化参数来为数据库例程规定池的大小。
db_cache_size = 2g
shared_pool_size = 1g
large_pool_size = 1g
java_pool_size = 1g
现在,仔细看一下这些参数。坦白讲,这些值是否准确?
我相信您一定会有疑虑。在实际中,没有人能够为这些池指定确切的内存数 — 它们太依赖于数据库内部的处理,而处理的特性随时在变化。
下面是一个示例场景。假定您有一个典型的、大部分属于 OLTP 的数据库,并且为缓冲高速缓存分配的专用内存比为纯 OLTP 数据库(现在已经很少见了)分配的要少。有一天,您的用户放开了一些非常大的全表扫描,以创建当天的结束报表。 Oracle9 i 数据库为您提供了在线修改内存分配的功能,但由于提供的总物理内存有限,您决定从大型池和 Java 池中取出一些内存:
alter system set db_cache_size = 3g scope=memory;
alter system set large_pool_size = 512m scope=memory;
alter system set java_pool_size = 512m scope=memory;
这个解决方案能够很好地工作一段时间,但是接着夜间的 RMAN 作业(它们使用大型池)开始了,大型池将立即出现内存不足。同样,您从数据库高速缓存中取出一些内存来补充大型池,以挽救这种局面。
RMAN 作业完成,然后启动一个广泛使用 Java 的批处理程序,接着您开始看到与 Java 池相关的错误。因此,您(再次)重新分配池,以满足 Java 池和数据库高速缓存上的内存需求:
alter system set db_cache_size = 2G scope=memory;
alter system set large_pool_size = 512M scope=memory;
alter system set java_pool_size = 1.5G scope=memory;
第二天早上, OLTP 作业恢复在线,这个循环又完全重复!
解决这种恶性循环的一种替代方法是永久设置每个池的最大需求。不过,这么做的话,您分配的总的 SGA 可能超出可用的内存 — 从而在为每个池分配的内存数不足时,将增加交换和分页的风险。人工重新分配的方法(虽然不实际)目前看起来很不错。
另一种替代方法是将值设为可接受的最小值。不过,当需求增长且内存不能完全满足时,性能将受到影响。
注意在所有这些示例中,分配给 SGA 的总内存保持不变,而池之间的内存分配根据即时的需求进行修改。如果 RDBMS 将自动探测来自用户的需求并相应地重新分布内存分配,那不是很好吗?
Oracle 数据库 10 g 中的自动共享内存管理特性正好能够实现这一目的。您可以决定 SGA 的总大小,然后设置一个名称为 SGA_TARGET 的参数,这个参数决定 SGA 的总大小。 SGA 内部的各个池将根据工作负载动态地进行配置。实现自动内存分配仅仅需要 SGA_TARGET 参数的一个非零值。
设置自动共享内存管理
让我们看看该特性是如何工作的。首先,确定 SGA 的总大小。您可以通过确定现在分配了多少内存来估计这个值。
SQL> select sum(value)/1024/1024 from v$sga;
SUM(VALUE)/1024/1024
--------------------
500
此时 SGA 的当前总大小近似为 500MB ,并且这个值将变为 SGA_TARGET 的值。接下来,执行语句:
alter system set sga_target = 500M scope=both;
这种方法不需要为各个池设置不同值;因而,您将需要在参数文件中使它们的值为零或全部删除它们。
shared_pool_size = 0
large_pool_size = 0
java_pool_size = 0
db_cache_size = 0
再循环数据库,使这些值生效。
这个人工过程还可以通过 Enterprise Manager 10 g 实施。从数据库主页中,选择 "Administration" 选项卡,然后选择 "Memory Parameters" 。对于人工配置的内存参数,将显示标记为 "Enable" 的按钮,以及所有人工配置的池的值。单击 "Enable" 按钮,启用自动共享内存管理特性。企业管理器将完成剩下的工作。
在配置了自动内存分配之后,您可以利用以下命令检查它们的大小:
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
340
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 4
large pool 4
shared pool 148
正如您所看到的,所有的池都从 500MB 的总目标大小中自动进行分配。(参见图 1 。)缓冲高速缓存大小是 340MB , Java 池是 4MB ,大型池是 4MB ,共享池是 148MB 。它们合起来总的大小为 (340+4+4+148=) 496MB ,近似与 500MB 的目标 SGA 的大小相同。
现在假定提供给 Oracle 的主机内存从 500MB 减少为 300MB ,这意味着我们必须减少总 SGA 的大小。我们可以通过减小目标 SGA 大小来反映这种变化。
alter system set sga_target = 300M scope=both;
现在查看各个池,我们可以看到:
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
244
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 4
large pool 4
shared pool 44
占用的总大小是 240+4+4+44 = 296MB ,接近于目标的 300MB 。注意如图 2 所示,当 SGA_TARGET 改变时,如何自动重新分配池。
这些池的大小是动态的。池将根据工作负载扩展,以容纳需求的增长,或缩小以容纳另一个池的扩展。这种扩展或缩小自动发生,无需 DBA 的干预,这与本文开头的示例不同。让我们暂时返回到那个场景,假定在初始分配后, RMAN 作业启动,指示需要一个更大的大型池,大型池将从 4MB 扩展到 40MB ,以容纳需求。这个额外的 36MB 将从数据库缓冲中划出,数据库块缓冲将缩小,如图 3 所示。
池的大小变化基于系统上的工作负载,因此不需要为最坏的情况调整池的大小 — 它们将根据需求的增长自动调整。此外, SGA 的总大小始终在由 SGA_TARGET 指定的最大值之内,因此不存在使内存需求的增长比例失调(这将导致分页和交换)的风险。您可以动态地将 SGA_TARGET 增加至绝对最大值 , 这个绝对最大值是通过调整参数 SGA_MAX_SIZE 指定的。
哪些池 不 受影响?
SGA 中的一些池不受动态大小调整的影响,但是必须显式指定这些池。其中值得注意的是非标准块大小的缓冲池,以及 KEEP 池或 RECYCLE 池的非默认块大小。如果您的数据库有一个块大小为 8K ,而您想要配置 2K 、 4K 、 16K 和 32K 块大小的池,那么您必须手动设置它们。它们的大小将保持不变;它们将不会根据负载缩小或扩展。当使用多种大小的缓冲池、 KEEP 池和 RECYCLE 池时,您应当考虑这个因素。此外,日志缓冲不受内存调整的影响 — 不管工作负载如何,在参数 log_buffer 中设定的值是不变的。 ( 在 10 g 中,还可以在 SGA 中定义一种新的池:流池 (stream pool) ,它用参数 streams_pool_size 进行设置。该池也不受自动内存调整的影响。)
这就产生了一个有趣的问题。如果您需要一个非默认块大小的池,而且想自动管理其它的池,那么该怎么办?
如果您指定了这些非自动调整的参数中的任意一个(如 db_2k_cache_size ),那么它们的总大小将从 SGA_TARGET 值中减去,以计算自动调整的参数值,以使 SGA 的总大小保持不变。例如,假设值看起来像这样:
sga_target = 500M
db_2k_cache_size = 50M
其余的池参数未设置。 50MB 的 2KB 缓冲池为自动调整的池(如默认块大小缓冲池 ( db_cache_size ) 、共享池、 Java 池和大型池)保留了 450MB 。当以一种方法动态地调整不可自动调整的参数(如 2KB 块大小池) —— 这种方法将影响到可自动调整部分的大小,可自动调整的部分将重新调整。例如,将 db_2k_cache_size 的值从 50MB 提高到 100MB 只为可自动调整的参数剩余 400MB 。因此,如图 4 所示 , 可调整的池(如共享池、大型池、 Java 池和默认缓冲池)自动缩小,以将它们的总大小从 450MB 减少到 400MB 。
但如果您有足够的可用内存,或者上述风险可能不是那么明显,那应该怎么办?如果这样的话,您可以通过不指定参数文件中的参数 SGA_TARGET 、通过在文件中将其设为 0 ,或者通过使用 ALTER SYSTEM 动态地将其修改为 0 来关闭自动大小调整。当 SGA_TARGET 被设为 0 时,池的当前值被自动设为它们的参数。
使用 Enterprise Manager
您还可以使用 Enterprise Manager 10 g 来处理这些参数。从数据库主页中单击超链接 "Memory Parameters" ,这将显示一个类似于图 5 中的屏幕。
注意红圈中的项目:数据库在 Automatic Shared Memory Management 模式下运行,总大小为 564MB — 与在参数 SGA_TARGET 中指定的值相同。您可以在此修改它,然后单击 Apply 按钮接受这些值;可调整的参数将自动调整。
为每个池指定一个最小值
假定您将 SGA_TARGET 设为 600MB ,并且各个池已自动分配:
池
大小 (MB)
缓冲池
404
Java 池
4
大型池
4
共享池
148
看看上述值,您可能推断 4MB 的 Java 池和大型池可能有点不足;这个值在运行时无疑需要增加。因此,您可能想确保这些池至少在最初时具有更高的值,比如说,分别为 8MB 和 16MB 。您可以通过在参数文件中显式地指定这些池的值或动态使用 ALTER SYSTEM 来实现这一目的(如下所示)。
alter system set large_pool_size = 16M ;
alter system set java_pool_size = 8M ;
现在查看这些池,您可以看到:
SQL> select pool, sum(bytes)/1024/1024 Mbytes from v$sgastat group by pool;
POOL MBYTES
------------ ----------
java pool 8
large pool 16
shared pool 148
SQL> select current_size from v$buffer_pool;
CURRENT_SIZE
------------
388
池的重新分配显示如下:
池
大小 (MB)
缓冲池
388
Java 池
8
大型池
16
共享池
148
注意 Java 池和大型池是如何分别被重新配置为 8MB 和 16MB ,并且注意为了使总的 SGA 保持在 600MB 以下,缓冲池已从 404MB 减少为 388MB 。当然,这些池仍然由自动共享内存管理控制 — 它们的大小将根据需求缩小或扩展。您显式指定的值为池的大小设定了一个下限;它们将永远不会缩小到低于这个界限。
结论
Oracle SGA 中的各种池的内存需求不是静态的 — 相反,它们根据系统上的需求而变化。 Oracle 数据库 10 g 中的自动共享内存管理特性通过动态地将资源重新分配到最需要它们的地方同时施加一个指定的最大值以防止分页和交换,使得 DBA 能够更有效地管理系统内存。更有效的内存管理还带来了更少的内存需求,这使得更精简的硬件更加可行。
发表评论
-
ORA-00001:unique constraint (oracle 10g)
2009-11-19 22:36 9101今天突然遇到这个异常 ... -
oracle 10g中很奇怪的单引号问题
2009-10-20 16:01 2065oracle中, 表结构如下 ... -
SQL*PLUS中批量执行SQL语句
2009-09-19 18:15 1682首先,将要执行的所有的SQL语句,全部写入某个sql文件当中。 ... -
ORACLE中添加删除主键
2009-08-27 21:50 28101、创建表的同时创建主键约束 (1)无命名 ... -
oracle中date类型的解决方法
2009-08-22 12:56 2998相互转换 1. 使用getTime() ... -
在SQL*PLUS查看当前所连数据库名字?
2009-08-14 17:16 17061.SQL>show parameter name ... -
ORACLE sqlplus命令
2009-08-14 17:08 1118一、ORACLE的启动和关闭1、在单机环境下要想启 ... -
SqlPlus中查看一个用户所拥有权限
2009-08-14 16:41 2119SQL>select * from dba_ ... -
SQL Plus打开一个包含多条SQL语句的.sql文件,执行总出错
2009-08-14 12:52 2595student.sql内容如下: CREATE ... -
SQL*PLUS命令的使用大全
2009-08-14 12:27 1002Oracle的sql*plus是与oracle进行交互的客户端 ... -
一个常用的规则
2009-08-14 12:23 987软件体系架构要以数据库为中心,如oracle,可以充分利用数据 ... -
ORA-04098: 触发器无效且未通过重新验证问题
2009-08-12 11:28 23964他大爷的,这个问题折腾了老夫2个小时,以前用的好好地。。。。怎 ... -
Exp和Imp命令的使用
2009-08-11 16:41 1940Oracle的导入实用程序(Import utility)允许 ... -
exp导出表结构脚本
2009-08-11 16:35 11708系统环境: 1、操作系统:Windows 20 ... -
oracle 自增列创建方法
2009-08-07 17:10 3111oracle没有ORACLE自增字段这样的功能,但是 ... -
SQL*Plus 中如何执行多个*.sql脚本文件
2009-08-07 16:20 43941.在SQL*Plus中执行单个sql脚本文件: S ... -
oracle 日期类型字段的操作
2009-08-04 15:58 1455在java对oracle的操作中,日期字段是很头疼的事情, ... -
学会三个范式快速成为数据库设计的高手
2009-07-16 16:31 1317关系数据库设计之时是要遵守一定的规则的。尤其是数 ... -
Oracle10g中启动和关闭OEM
2009-07-16 16:04 1369从Oracle10g开始,Oracle极大的增强了OEM工具, ...
相关推荐
8. **自动内存管理(Automatic Memory Management)**:Oracle 10g允许数据库自动管理SGA和PGA内存,减少了管理员的配置工作,并提高了性能。 9. **企业管理器(Enterprise Manager)**:10g版本的EM提供了更强大的...
《Oracle Database 10g: Administration Workshop I》是一本面向Oracle数据库管理员的专业指南,旨在帮助读者掌握Oracle Database 10g的基本管理技能。本书提供了全面的学习资料,涵盖了安装、配置、管理和维护...
### Oracle Database 10g:Real Application Clusters (RAC) Volume 1 #### 概述 《Oracle Database 10g:Real Application Clusters (RAC) Volume 1》是一本详细介绍Oracle Database 10g RAC技术的书籍。本书主要...
- **深化理解Oracle Database 10g的架构与管理**:包括内存结构、进程管理、实例管理等。 - **掌握备份与恢复机制**:了解Oracle Recovery Manager (RMAN)的工作原理及配置方法。 - **实践操作**:通过具体案例学习...
**Oracle Database 11g**:这是Oracle公司在2007年发布的数据库管理系统的一个版本,相比之前的版本,11g提供了增强的安全性、更高的可用性和更好的性能,引入了如Real Application Clusters (RAC) 的改进、数据仓库...
该课程面向数据库管理员、技术支持工程师和技术顾问等专业人士,要求学员具备一定的Oracle Database 10g管理和维护经验。 #### 二、课程目标 1. **理解性能优化工具**:学习使用Oracle提供的工具来优化数据库性能...
### Oracle Database 10g:管理功能 Oracle Database 10g是Oracle公司推出的一款关系型数据库管理系统,其“g”代表“grid”,强调了网格计算的能力。10g版本在数据存储、安全性、性能优化、备份与恢复等方面进行了...
Oracle Database 10g:Administration Workshop II 是一款面向Oracle Certified Professional (OCP) 的官方培训教材,主要针对那些希望深入学习并掌握Oracle数据库管理技术的专业人士。本课程涵盖了Oracle 10g ...
《Oracle Database 10g: The Complete Reference》是Oracle数据库技术的重要参考资料,全面涵盖了Oracle 10g版本的各项核心功能和使用技巧。这本书对于数据库管理员(DBA)、开发人员以及对Oracle技术感兴趣的学习者...
**Oracle Database 10g** 是甲骨文公司在2004年推出的一款关系型数据库管理系统,其核心特色之一是强调网格计算(Grid Computing)能力。“g”代表Grid(网格),意味着这款数据库软件被设计为能够更好地支持网格计算...
本指南深入探讨了Oracle Real Application Clusters (RAC)在Oracle Database 10g版本中的应用与实践,旨在帮助读者理解和掌握在复杂环境中部署和管理RAC的关键技能。 ### 核心知识点: #### 1. Oracle RAC概念 ...
Oracle Database 11g是Oracle公司推出的一款企业级数据库管理系统,是数据库管理员(DBA)和开发者进行数据存储、管理及应用开发的重要工具。本资料集主要围绕"Oracle Database 11g: 数据库管理 - 课堂练习Il"展开,...
- 在Oracle Database 11g中,DBAs可以更轻松地管理内存资源,因为系统现在支持自动内存管理。这个特性允许数据库自动调整SGA(系统全局区)和PGA(程序全局区)的大小,减少了手动调整内存参数的复杂性。 2. **...
Oracle Database 10g Real Application Clusters(RAC)是一种高度可用性和可伸缩性的数据库技术,它允许多个实例共享同一物理数据库,提供了一种并行处理和故障转移的能力。在本教程中,我们将深入探讨Oracle 10g ...
根据提供的信息,我们可以深入探讨与Oracle Database 10g: Administration II 1Z0-043考试相关的重要知识点。 ### 1. 确定数据库缓冲区大小 #### 背景 在数据库管理中,数据库缓冲区缓存(Database Buffer Cache)是...
Oracle Database 10g是甲骨文公司发布的一款企业级数据库管理系统,它的全名是Oracle Database 10g Release 2,简称Oracle 10g。这个版本在当时以其先进的特性和强大的性能优化,赢得了广大数据库管理员(DBA)和...