登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

飞哥的技术博客

世上无难事,只怕有心人!

 
 
 

日志

 
 
 
 

Oracle自动存储管理--使DBA得到解脱 - 软件屋  

2009-08-16 14:16:47|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


Oracle自动存储管理--使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 数据库(现在已经很少见了)分配的要少。有一天,您的用户放开了一些非常大的全表扫描,以创建当天的结束报表。Oracle9i 数据库为您提供了在线修改内存分配的功能,但由于提供的总物理内存有限,您决定从大型池和 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 可能超出可用的内存 — 从而在为每个池分配的内存数不足时,将增加交换和分页的风险。人工重新分配的方法(虽然不实际)目前看起来很不错。

  逐步创建一个基于 ASM 的数据库

  下面是如何创建一个基于 ASM 的数据库的具体的示例:

  1. 创建一个 ASM 例程

  通过指定下列初始化参数,您可以利用数据库创建助手来创建一个 ASM 例程:


  INSTANCE_TYPE = ASM

  当服务器启动时,您应当启动该例程,而当服务器关闭时,应当最后关闭该例程。这个参数的默认值是 RDBMS,适用于常见的数据库。

  2. 创建磁盘组

  在启动 ASM 例程后,利用可用的磁盘创建一个磁盘组。


  CREATE DISKGROUP dskgrp1
  EXTERNAL REDUNDANCY
  DISK
  ’/dev/d1’,
  ’/dev/d2’,
  ’/dev/d3’,
  ’/dev/d4’,
  ... and so on for all the specific disks ...

  ;
  在上述命令中,我们使数据库利用名称为 /dev/d1、/dev/d2 等的磁盘创建了一个名称为 dksgrp1 的磁盘组。您还可以在 DISK 子句中用通配符指定磁盘名称,而不是分别给定磁盘。


  在上述命令中,我们指定了一个子句 EXTERNAL REDUNDANCY,它指示一个磁盘出现故障将使磁盘组停止工作。这通常是由硬件提供冗余(如镜像)的情况。如果没有基于硬件的冗余,则可以设置 ASM 来在磁盘组中创建一组特殊的磁盘(称为 failgroup),以提供这种冗余。


  CREATE DISKGROUP dskgrp1
  NORMAL REDUNDANCY
  FAILGROUP failgrp1 DISK
  ’/dev/d1’,
  ’/dev/d2’,
  FAILGROUP failgrp2 DISK
  ’/dev/d3’,
  ’/dev/d4’;

  d3 和 d4 不是 d1 和 d2 的镜像,虽然看起来似乎是那样。相反,ASM 使用所有的磁盘来创建一个容错系统。例如,可能利用在 d4 上保留的一个备份来在 d1 中创建磁盘组上的一个文件。另一个文件可以利用 d2 上的备份在 d3 上创建。一个特定的磁盘出现故障,则允许使用另一个磁盘上的备份,以使操作可以继续。例如,您可能丢失了磁盘 d1 和 d2 的控制器,ASM 将为全部故障磁盘组的区块的拷贝建立镜像,以保持数据完整性。

  3. 创建表空间

  现在利用基于 ASM 的存储器中的一个数据文件来在主数据库中创建一个表空间。


  就这样!创建过程完成了。注意磁盘组是如何作为一个虚拟文件系统使用的。这种方法不仅在数据文件中有用,在其它类型的 Oracle 文件中也有用。例如,您可以按以下方式创建在线重做日志文件


  LOGFILE GROUP 1 (
  ’+dskgrp1/redo/group_1.258.3’,
  ’+dskgrp2/redo/group_1.258.3’
  ) SIZE 50M,
  ...

  更多的资源

  正如之前所提到的,本文的目的不是为了提供关于 AMS 特性的所有知识,使您变成一个专家,原因很简单,相关的信息量太大了。不过,别失望,在 Oracle 技术网上提供了许多的帮助:

  “自动存储”(作者:Lannes Morris-Murphy)是关于 ASM 的一篇极好的介绍性文章。

  ASMLib — 为 Linux 提供的一个 ASM 特性的资料库 — 扩展了 ASM 功能。本页面还链接了技术参考文献和资料库模块的源代码。

  Oracle 数据库管理员指南 10g Release 1 (10.1) 的第 12 章完整说明了 ASM 背后的概念。

  甚至存档日志目标也可以设为一个磁盘组。与 Oracle 数据库相关的全部内容都可以在一个基于 ASM 的磁盘组中创建。例如,备份是 ASM 的另一大用途。您可以设置一组廉价的磁盘来创建一个数据库的恢复区,RMAN 可以使用这个恢复区来创建备份数据库文件和存档日志文件。(在下一个关于 Oracle Database 10g 中的 RMAN 的部分中,您将详细了解如何使用这种功能来为您带来好处。)

  请记住,无论 ASM 如何支持仅由 Oracle 数据库创建和读取的文件;它也不能替代一个通用的文件系统,并且不能存储二进制文件和纯文本文件。

  维护

  让我们看看维护磁盘组所需的一些典型任务。您可能必须经常在磁盘组 dskgrp1 中增加额外的磁盘来适应不断增长的需求。可以执行下面的语句:


  要查明哪个磁盘在哪个磁盘组中,可以执行下面的语句:


  该命令显示了 ASM 例程为所有客户机数据库管理的所有磁盘。在这些磁盘中,您可能决定利用以下命令来删除一个磁盘:

  ASM 的引进提供了显著的价值,它使得在 Oracle 数据库中管理文件变得非常容易。利用这个捆绑的特性,您可以从一组磁盘中容易地创建一个高可伸缩和高性能的存储解决方案。任何动态的数据库环境都需要添加、移动和删除磁盘,ASM 提供了必需的工具集,使 DBA 从那些单调的任务中解脱出来。


发表评论

引文来源  Oracle自动存储管理--使DBA得到解脱 - 软件屋
  评论这张
 
阅读(289)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018