当前位置:文档之家› oracle内存分配与调整

oracle内存分配与调整

oracle内存分配与调整
oracle内存分配与调整

Oracle内存分配与调整

l 作者介绍

冯春培,毕业于北京信息工程学院。曾做电信计费后台程序开发,从事过开发DBA工作,目前公司主要做数据库优化产品开发。热爱ORACLE,在https://www.doczj.com/doc/d614274994.html,任数据库管理版块版主(biti_rainy),个人兴趣主要在oracle internal、performance tuning。对数据库管理、备份与恢复、数据库应用开发、SQL优化均有广泛理解。希望大家一起探讨oracle及相关技术。

l 前言

对于oracle的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。下面我们将一步一步就内存管理的各个方面进行探讨。

l 概述

oracle的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是SGA 和PGA(process global area or private global area)。对于SGA区域内的内存来说,是共享的全局的,在UNIX上,必须为oracle设置共享内存段(可以是一个或者多个),因为oracle在UNIX上是多进程;而在WINDOWS上oracle是单进程(多个线程),所以不用设置共享内存段。PGA是属于进程(线程)私有的区域。在oracle使用共享服务器模式下(MTS),PGA 中的一部分,也就是UGA会被放入共享内存large_pool_size中。

对于SGA部分,我们通过sqlplus中查询可以看到:

SQL> select * from v$sga;

NAME VALUE

-------------------- ----------

Fixed Size 454032

Variable Size 109051904

Database Buffers 385875968

Redo Buffers 667648

Fixed Size

oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA各部分组件的信息,可以看作引导建立SGA的区域。

Variable Size

包含了shared_pool_size、java_pool_size、large_pool_size等内存设置和用于管理数据缓冲区等内存结构的hash table、块头信息(比如x$bh消耗内存)等

Database Buffers

指数据缓冲区,在8i中包含default pool、buffer_pool_keep、buffer_pool_recycle三部分内存。在9i中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、

db_nk_cache_size。这里要注意在8i中三部分内存总和为db_block_buffers*db_block_size。

Redo Buffers

指日志缓冲区,log_buffer。在这里要额外说明一点的是,对于v$parameter、v$sgastat、v$sga查询值可能不一样。v$parameter里面的值,是指用户在初始化参数文件里面设置的值,v$sgastat是oracle实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block为最小单位进行分配的),v$sga里面查询的值,是在oracle分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小大约是11k(不同环境可能不一样)。参考如下内容

SQL> select substr(name,1,10) name,substr(value,1,10) value

2 from v$parameter where name = 'log_buffer';

NAME V ALUE

-------------------- --------------------

log_buffer524288

SQL> select * from v$sgastat ;

POOL NAME BYTES

----------- -------------------

fixed_sga 454032

buffer_cache 385875968

log_buffer656384

SQL> select * from v$sga;

NAME VALUE

-------------------- ----------

Fixed Size 454032

Variable Size 109051904

Database Buffers 385875968

Redo Buffers667648

关于各部分内存的作用,参考oracle体系结构,在此不再叙述。

l SGA的大小

那么我们现在来考察内存参数的设置。实际上,对于特定的环境,总是存在着不同的最优设置的,没有任何一种普遍适用的最优方案。但为什么在这里我们还要来谈设置这个话题呢,那仅仅是出于一个目的,避免过度的犯错误。事实上,在任何一个生产系统正式投入使用之前,我们不拥有任何系统运行信息让我们去调整,这样就只有两种可能,一是根据文档推荐设置,另外一种就是根据经验设置。相对来说,根据经验的设置比根据文档的设置要可

靠一些。尤其是那些24*7的系统,我们更要减少错误的发生。那么我们尝试去了解不同的系统不同的应用的具体设置情况,从而提供一个参照信息给大家。

为了得出一个参照设置,我们就必须假定一个参照环境。以下所有设置我们基于这样一个假定,那就是硬件服务器上只考虑存在操作系统和数据库,在这个单一的环境中,我们来考虑内存的设置。

在设置参数之前呢,我们首先要问自己几个问题

一:物理内存多大

二:操作系统估计需要使用多少内存

三:数据库是使用文件系统还是裸设备

四:有多少并发连接

五:应用是OLTP类型还是OLAP类型

根据这几个问题的答案,我们可以粗略地为系统估计一下内存设置。那我们现在来逐个问题地讨论,首先物理内存多大是最容易回答的一个问题,然后操作系统估计使用多少内存呢?从经验上看,不会太多,通常应该在200M以内(不包含大量进程PCB)。

接下来我们要探讨一个重要的问题,那就是关于文件系统和裸设备的问题,这往往容易被我们所忽略。操作系统对于文件系统,使用了大量的buffer来缓存操作系统块。这样当数据库获取数据块的时候,虽然SGA中没有命中,但却实际上可能是从操作系统的文件缓存中获取的。而假如数据库和操作系统支持异步IO,则实际上当数据库写进程DBWR写磁盘时,操作系统在文件缓存中标记该块为延迟写,等到真正地写入磁盘之后,操作系统才通知DBWR写磁盘完成。对于这部分文件缓存,所需要的内存可能比较大,作为保守的估计,我们应该考虑在0.2——0.3 倍内存大小。但是如果我们使用的是裸设备,则不考虑这部分缓存的问题。这样的情况下SGA就有调大的机会。

关于数据库有多少并发连接,这实际上关系到PGA的大小(MTS下还有large_pool_size)。事实上这个问题应该说还跟OLTP类型或者OLAP类型相关。对于OLTP 类型oracle倾向于可使用MTS,对于OLAP类型使用独立模式,同时OLAP还可能涉及到大量的排序操作的查询,这些都影响到我们内存的使用。那么所有的问题综合起来,实际上主要反映在UGA的大小上。UGA主要包含以下部分内存设置

SQL> show parameters area_size

NAME TYPE VALUE

------------------------------------ ------- -------------

bitmap_merge_area_size integer 1048576

create_bitmap_area_size integer 8388608

hash_area_size integer 131072

sort_area_size integer 65536

SQL>

在这部分内存中我们最关注的通常是sort_area_size,这是当查询需要排序的时候,数据库会话将使用这部分内存进行排序,当内存大小不足的时候,使用临时表空间进行磁盘排序。由于磁盘排序效率和内存排序效率相差好几个数量级,所以这个参数的设置很重要。这四个参数都是针对会话进行设置的,是单个会话使用的内存的大小,而不是整个数据库使用的。偶尔会看见有人误解了这个参数以为是整个数据库使用的大小,这是极其严重的错误。假如设置了MTS,则UGA被分配在large_pool_size,也就是说放在了共享内存里面,不同进程(线程)之间可以共享这部分内存。在这个基础上,我们假设数据库存在并发执行server process为100个,根据上面我们4个参数在oracle8.1.7下的默认值,我们来计算独立模式

下PGA的大致大小。由于会话并不会经常使用create_bitmap_area_size、bitmap_merge_area_size,所以我们通常不对四个参数求和。在考虑到除这四个参数外会话所保存的变量、堆栈等信息,我们估计为2M,则200个进程最大可能使用200M的PGA。

现在,根据上面这些假定,我们来看SGA实际能达到多少内存。在1G的内存的服务器上,我们能分配给SGA的内存大约为400—500M。若是2G的内存,大约可以分到1G 的内存给SGA,8G的内存可以分到5G的内存给SGA。当然我们这里是以默认的排序部分内存sort_area_size=64k进行衡量的,假如我们需要调大该参数和hash_area_size等参数,然后我们应该根据并发的进程的数量,来衡量考虑这个问题。

事实上,通常我们更习惯通过直观的公式化来表达这样的问题:

OS使用内存+SGA+并发执行进程数*(sort_area_size+hash_ara_size+2M) < 0.7*总内存

(公式是死的,系统是活的,实际应用的调整不必框公式,这不过是一个参考建议) 在我们的实际应用中,假如采用的是裸设备,我们可适当的增大SGA(如果需要的话)。由于目前几乎所有的操作系统都使用虚拟缓存,所以实际上如果就算SGA设置的比较大也不会导致错误,而是可能出现频繁的内存页的换入与换出(page in/out)。在操作系统一级如果观察到这个现象,那么我们就需要调整内存的设置。

l SGA内参数设置

Log_buffer

对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考LGWR写的触发条件之后,我们会发现通常超过3M意义不是很大。作为一个正式系统,可能考虑先设置这部分为log_buffer=1—3M 大小,然后针对具体情况再调整。

Large_pool_size

对于大缓冲池的设置,假如不使用MTS,建议在20—30M 足够了。这部分主要用来保存并行查询时候的一些信息,还有就是RMAN在备份的时候可能会使用到。如果设置了MTS,则由于UGA部分要移入这里,则需要具体根据server process数量和相关会话内存参数的设置来综合考虑这部分大小的设置。

Java_pool_size

假如数据库没有使用JA VA,我们通常认为保留10—20M大小足够。事实上可以更少,甚至最少只需要32k,但具体跟安装数据库的时候的组件相关(比如http server)。

shared_pool_size

这是迄今为止最具有争议的一部分内存设置。按照很多文档的描述,这部分内容应该几乎和数据缓冲区差不多大小。但实际上情况却不是这样的。首先我们要考究一个问题,那就是这部分内存的作用,它是为了缓存已经被解析过的SQL,而使其能被重用,不再解析。这样做的原因是因为,对于一个新的SQL(shared_pool里面不存在已经解析的可用的相同的SQL),数据库将执行硬解析,这是一个很消耗资源的过程。而若已经存在,则进行的仅仅是软分析(在共享池中寻找相同SQL),这样消耗的资源大大减少。所以我们期望能多共享一些SQL,并且如果该参数设置不够大,经常会出现ora-04031错误,表示为了解析新的SQL,没有可用的足够大的连续空闲空间,这样自然我们期望该参数能大一些。但是该参数的增大,却也有负面的影响,因为需要维护共享的结构,内存的增大也会使得SQL的老化

的代价更高,带来大量的管理的开销,所有这些可能会导致CPU的严重问题。

在一个充分使用绑定变量的比较大的系统中,shared_pool_size的开销通常应该维持在300M以内。除非系统使用了大量的存储过程、函数、包,比如oracle erp这样的应用,可能会达到500M甚至更高。于是我们假定一个1G内存的系统,可能考虑设置该参数为100M,2G的系统考虑设置为150M,8G的系统可以考虑设置为200—300M。

对于一个没有充分使用或者没有使用绑定变量系统,这可能给我们带来一个严重的问题。所谓没有使用bind var 的SQL,我们称为Literal SQL。也就是比如这样的两句SQL我们认为是不同的SQL,需要进行2次硬解析:

select * from EMP where name = ‘TOM’;

select * from EMP where name = ‘JERRY’;

假如把’TOM’和‘JERRY’换做变量V,那就是使用了bind var,我们可以认为是同样的SQL从而能很好地共享。共享SQL本来就是shared_pool_size这部分内存存在的本意,oracle的目的也在于此,而我们不使用bind var就是违背了oracle的初衷,这样将给我们的系统带来严重的问题。当然,如果通过在操作系统监控,没有发现严重的cpu问题,我们如果发现该共享池命中率不高可以适当的增加shred_pool_size。但是通常我们不主张这部分内存超过800M(特殊情况下可以更大)。

事实上,可能的话我们甚至要想办法避免软分析,这在不同的程序语言中实现方式有差异。我们也可能通过设置session_cached_cursors 参数来获得帮助(这将增大PGA)。

Data buffer

现在我们来谈数据缓冲区,在确定了SGA的大小并分配完了前面部分的内存后,其余的,都分配给这部分内存。通常,在允许的情况下,我们都尝试使得这部分内存更大。这部分内存的作用主要是缓存DB BLOCK,减少甚至避免从磁盘上获取数据,在8i中通常是由db_block_buffers*db_block_size来决定大小的。如果我们设置了buffer_pool_keep 和buffer_pool_recycle,则应该加上后面这两部分内存的大小。

l 9i下参数的变化

oracle的版本的更新,总是伴随着参数的变化,并且越来越趋向于使得参数的设置更简单,因为复杂的参数设置使得DBA们经常焦头烂额。关于内存这部分的变化,我们可以考察下面的参数。事实上在9i中数据库本身可以给出一组适合当前运行系统的SGA相关部分的参数调整值(参考V$DB_CACHE_ADVICE、V$SHARED_POOL_ADVICE),关于PGA 也有相关视图V$PGA_TARGET_ADVICE等。

Data buffer

9i中保留了8i中的参数,如设置了新的参数,则忽略旧的参数。9i中用db_cache_size 来取代db_block_buffers,用db_keep_cache_size取代buffer_pool_keep,用db_recycle_cache_size取代buffer_pool_recycle;这里要注意9i中设置的是实际的缓存大小而不再是块的数量。另外9i新增加了db_nk_cache_size,这是为了支持在同一个数据库中使用不同的块大小而设置的。对于不同的表空间,可以定义不同的数据块的大小,而缓冲区的定义则依靠该参数的支持。其中n可以为2、4、6、8、16等不同的值。在这里顺便提及的一个参数就是db_block_lru_latches,该参数在9i中已经成为了保留参数,不推荐手工设置。

PGA

在9i里面这部分也有了很大的变化。在独立模式下,9i已经不再主张使用原来的UGA 相关的参数设置,而代之以新的参数。假如workarea_size_policy=AUTO(缺省),则所有的会话的UGA共用一大块内存,该内存在pga_aggregate_target 设置以内分配。在我们根据前面介绍的方法评估了所有进程可能使用的最大PGA内存之后,我们可以通过在初始化参数中设置这个参数,从而不再关心其他”*_area_size”参数。

SGA_MAX_SIZE

在9i中若设置了SGA_MAX_SIZE,则在总和小于等于这个值内,可以动态的调整数据缓冲区和共享池的大小

SQL> show parameters sga_max_size

NAME TYPE VALUE

------------------------------------ ------- -------------

sga_max_size unknown 193752940

SQL>

SQL> alter system set db_cache_size = 30000000;

System altered.

SQL> alter system set shared_pool_size = 20480000;

System altered.

l Lock_sga = true 的问题

由于几乎所有的操作系统都支持虚拟内存,所以即使我们使用的内存小于物理内存,也不能避免操作系统将SGA换到虚拟内存(SWAP)。所以我们可以尝试使得SGA锁定在物理内存中不被换到虚拟内存中,这样减少页面的换入和换出,从而提高性能。但在这里遗憾的是,windows是无法避免这种情况的。下面我们来参考在不同的几个系统下怎么实现lock_sga

AIX 5L(AIX 4.3.3以上)

logon aix as root

cd /usr/samples/kernel

./vmtune (信息如下) v_pingshm已经是1

./vmtune -S 1

然后oracle用户修改initSID.ora 中 lock_sga = true

重新启动数据库

HP UNIX

Root身份登陆

Create the file "/etc/privgroup": vi /etc/privgroup

Add line "dba MLOCK" to file

As root, run the command "/etc/setprivgrp -f /etc/privgroup":

$/etc/setprivgrp -f /etc/privgroup

oracle用户修改initSID.ora中lock_sga=true

重新启动数据库

SOLARIS (solaris2.6以上)

8i版本以上数据库默认使用隐藏参数 use_ism = true ,自动锁定SGA于内存中,不用设置lock_sga, 如果设置 lock_sga =true 使用非 root 用户启动数据库将返回错误。

WINDOWS

不能设置lock_sga=true,可以通过设置pre_page_sga=true,使得数据库启动的时候就把所有内存页装载,这样可能起到一定的作用。

l 关于内存参数的调整

关于参数调整,是oracle的复杂性的一个具体体现。通常来讲,我们更倾向于让客户做statspack报告,然后告诉我们os监控的状况,在这些的信息的基础上,再向客户索取具体的详细信息以诊断问题的所在。系统的调整,现在我们通常采用从等待事件入手的方法。因为一个系统感觉到慢,必然是在某个环节上出现等待,那么我们从等待最多的事件入手逐步诊断并解决问题。

对于内存的调整,相对来说简单一些,我们首先可以针对数据缓冲区的大小来看。首先观察命中率

数据缓冲区命中率

SQL> select value from v$sysstat where name ='physical reads';

VALUE

----------

14764

SQL> select value from v$sysstat where name ='physical reads direct';

VALUE

----------

50

SQL> select value from v$sysstat where name ='physical reads direct (lob)';

VALUE

----------

SQL> select value from v$sysstat where name ='consistent gets';

VALUE

----------

167763

SQL> select value from v$sysstat where name = 'db block gets';

VALUE

----------

14305

这里命中率的计算应该是

令 x = physical reads direct + physical reads direct (lob)

命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100 通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区

共享池的命中率

SQL> select sum(pinhits)/sum(pins)*100 "hit radio" from v$librarycache;

hit radio

----------

99.809291

假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存

关于排序部分

SQL> select name,value from v$sysstat where name like '%sort%';

NAME VALUE ---------------------------------------------------------------- ----------

sorts (memory) 67935

sorts (disk) 1

sorts (rows) 7070

SQL>

假如我们发现sorts (disk)/ (sorts (memory)+ sorts (disk))的比例过高,则通常意味着sort_area_size部分内存较小,可考虑调整相应的参数。

关于log_buffer

SQL> select name,value from v$sysstat

2 where name in('redo entries','redo buffer allocation retries');

NAME VALUE

---------------------------------------------------------------- ---------- redo entries 2325719 redo buffer allocation retries 10

假如redo buffer allocation retries/ redo entries 的比例超过1%我们就可以考虑增大log_buffer

通常来说,内存的调整的焦点就集中在这几个方面,更多更详细的内容,建议从statspack 入手来一步一步调整。最后关于内存的调整,再强调这一点,一定要结合操作系统来衡量,任何理论都必须要实践来检验。在操作系统中观察page in/out 状况,发现问题严重,应该考虑调小SGA。

l 32bit 和64bit 的问题

对于oracle来说,存在着32bit与64bit的问题。这个问题影响到的主要是SGA的大小。在32bit的数据库下,通常oracle只能使用不超过1.7G的内存,即使我们拥有12G的内存,但是我们却只能使用1.7G,这是一个莫大的遗憾。假如我们安装64bit的数据库,我们就可以使用很大的内存,几乎不可能达到上限。但是64bit的数据库必须安装在64bit的操作系统上,可惜目前windows上只能安装32bit的数据库,我们通过下面的方式可以查看数据库是32bit还是64bit:

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production

PL/SQL Release 8.1.7.0.0 - Production

CORE 8.1.7.0.0 Production

TNS for 32-bit Windows: Version 8.1.7.0.0 - Production

NLSRTL Version 3.4.1.0.0 - Production

但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过1.7G的内存,达到2G以上甚至更多。在这里我们针对不同的平台下的具体实现方式做一个总结。

附:本文将继续完善,同时补上不同平台下增加31bit oracle使用的超过1.7G内存的方法。同时也将陆续写出其他文章,一起发表于itpub预计9月底推出的杂志上。如发现本文观点有误,或者您有其他补充见解,欢迎您发mail给我。

Mail: biti_rainy@https://www.doczj.com/doc/d614274994.html,

oracle实例内存解析

一、名词解释 (1)SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 (2)共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区)。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。 (3)缓冲区高速缓存:Database Buffer Cache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。 (4)大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境。 (5)Java池:Java Pool为Java命令的语法分析提供服务。 (6)PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。 二、分析与调整 (1)系统全局域: SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/3到1/2。 a.共享池Shared Pool: 查看共享池大小Sql代码 SQL>show parameter shared_pool_size 查看共享SQL区的使用率: Sql代码 select(sum(pins-reloads))/sum(pins)"Library cache"from v$librarycache; --动态性能表 LIBRARY命中率应该在90%以上,否则需要增加共享池的大小。

基于Oracle的OLTP与OLAP数据库优化差异之内存设计

基于Oracle的OLTP与OLAP数据库优化差异之内存设计要进行数据库优化,首先应该弄清数据库类型及其特点。从数据处理角度分类,数据库可分为两大类:联机事务处理OLTP(on-line transaction processing)和联机分析处理OLAP(On-Line Analytical Processing),OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易,电信业务等。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 两类系统处理的数据量不同,技术的使用也是不一样的,在OLTP系统中,oracle、db2等是主流数据库产品,数据量在几个TB甚至更小。在OLAP系统中,除了传统的数据库外,有越来越多的其他数据库产品出现,如sysbase IQ,GP,国产数据库GBase 8a,达梦7等,数据量大多在几十TB甚至更高,数据处理主要集中在查询统计分析、大数据量的导入导出等。在这里,我们主要讨论的还是最通用的ORACLE数据库的两类系统的优化思路和方式的差异。 数据库具体是OLTP还是OLAP取决于你的业务类型。OLTP和OLAP两类系统对数据库要求截然不同。除了系统本身自有的特点之外,在技术方面也存在巨大的差别,所带来的优化技术和理念也不太一样。 OLTP主要是交易型数据库,其事务特征为高并发而数据量小,大部分情况都要求瞬间出结果,系统要求的实时性、稳定性、安全性较高。这类数据库的系统瓶颈主要在CPU和内存上,在优化思路上,更加关注CPU的利用率;各种命中率指标,譬如SHARED POOL, BUFFER CACHE的命中率;SQL语句绑定变量等。由于数据量相对比较小,因此OLTP大部分都是集中式的。 OLAP主要是分析型数据库,并发量比较小,但单个sql消耗巨大,大部分查询需要处理海量数据,用户对响应时间的要求远不如OLTP用户。由于数据量巨大,这类数据库的系统瓶颈主要在磁盘io上,一些传统的优化指标和手段,如SHARED POOL, BUFFER CACHE 的命中率等对OLAP型数据库意义不大,而分区,并行操作,压缩,物化视图,全文索引等技术可能都会在OLAP中体现。OLAP库基本都是上TB的,有的是几百TB,甚至PB,因此很多OLAP库可能都分成了N个库,以便于分布式处理。OLAP一般都是采用星星模式或者雪花模式的。 下面从内存设计的优化角度具体分析一下这两类系统优化手段的差异: 内存设计通常是通过调整ORACLE内存参数来实现的。oracle的内存可分为SGA(shared global area)共享全局区和PGA(program global area)进程全局区两部分。OLTP系统由于处理的事务为高并发且数据量小,SGA比PGA更为重要;OLAP系统处理的事务数据量大且并发量比较小,大部分查询可能运行一次可能很久不会在运行,SQL的重用意义不大,很多命中率指标对于OLAP也影响较小处理,因此SGA相对次要,而较多大数据的排序,HASH操作都需要在PGA完成,PGA大小直接决定了处理效率。 尽管从oracle 10g开始,oracle已经减少了对内存命中率的关注,转而通过工作时间(CPU时间或服务时间)和等待工作时所消耗的时间(等待时间)来分析系统的性能,但对一个OLTP库来说,库缓存命中率(Library hit)和数据缓冲区命中率(buffer hit)仍是极重要的指标。OLTP系统是一个SQL执行非常密集的系统,Library hit命中率低说明共享池里很多SQL不能重用,需要重新解析,这会大大增加CPU负荷,降低系统性能,影响SQL 执行效率。使用绑定变量是减少硬解析,提高库缓存命中率的有效手段。

Oracle数据库实例及其相关概念

Oracle数据库实例及其相关概念2010-11-24 00:00 出处:中国IT实验室作者:佚名 完整的Oracle数据库通常由两部分组成:Oracle数据库实例和数据库。 用数据库安全策略防止权限升级攻击 C++虚函数的显式声明 完整的Oracle数据库通常由两部分组成:Oracle数据库实例和数据库。 1)数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等); 2)Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区。 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件。Oracle有一个很大的内存快,成为全局区(SGA)。 一、数据库、表空间、数据文件 1.数据库 数据库是数据集合。Oracle是一种数据库管理系统,是一种关系型的数据库管理系统。 通常情况了我们称的“数据库”,并不仅指物理的数据集合,他包含物理数据、数据库管理系统。也即物理数据、内存、操作系统进程的组合体。 数据库的数据存储在表中。数据的关系由列来定义,即通常我们讲的字段,每个列都有一个列名。数据以行(我们通常称为记录)的方式存储在表中。表之间可以相互关联。以上就是关系模型数据库的一个最简单的描述。

当然,Oracle也是提供对面象对象型的结构数据库的最强大支持,对象既可以与其它对象建立关系,也可以包含其它对象。关于OO型数据库,以后利用专门的篇幅来讨论。一般情况下我们的讨论都基于关系模型。 2.表空间、文件 无论关系结构还是OO结构,Oracle数据库都将其数据存储在文件中。数据库结构提供对数据文件的逻辑映射,允许不同类型的数据分开存储。这些逻辑划分称作表空间。 表空间(tablespace)是数据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。为了便于管理和提高运行效率,可以使用一些附加表空间来划分用户和应用程序。例如:USER表空间供一般用户使用,RBS表空间供回滚段使用。一个表空间只能属于一个数据库。 每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。在Oracle7.2以后,数据文件创建可以改变大小。创建新的表空间需要创建新的数据文件。数据文件一旦加入到表空间中,就不能从这个表空间中移走,也不能与其它表空间发生联系。 如果数据库存储在多个表空间中,可以将它们各自的数据文件存放在不同磁盘上来对其进行物理分割。在规划和协调数据库I/O请求的方法中,上述的数据分割是一种很重要的方法。 3.Oracle数据库的存储结构分为逻辑存储结构和物理存储结构: 1)逻辑存储结构:用于描述Oracle内部组织和管理数据的方式; 2)物理存储结构:用于描述Oracle外部即操作系统中组织和管理数据的方式。 二、Oracle数据库实例

2020年(Oracle管理)Oracle SQL性能优化方法

(Oracle管理)Oracle SQL性能优化方法

OracleSQL性能优化方法探讨 Oracle性能优化方法(SQL篇)1 1综述2 2表分区的应用2 3访问Table的方式3 4共享SQL语句3 5选择最有效率的表名顺序5 6WHERE子句中的连接顺序.6 7SELECT子句中避免使用’*’6 8减少访问数据库的次数6 9使用DECODE函数来减少处理时间7 10整合简单,无关联的数据库访问8 11删除重复记录8 12用TRUNCATE替代DELETE9 13尽量多使用COMMIT9 14计算记录条数9 15用Where子句替换HAVING子句9 16减少对表的查询10 17通过内部函数提高SQL效率.11 18使用表的别名(Alias)12 19用EXISTS替代IN12 20用NOT EXISTS替代NOT IN13 21识别低效执行的SQL语句13

22使用TKPROF 工具来查询SQL性能状态14 23用EXPLAIN PLAN 分析SQL语句14 24实时批量的处理16

1综述 ORACLE数据库的性能调整是个重要,却又有难度的话题,如何有效地进行调整,需要经过反反复复的过程。在数据库建立时,就能根据应用的需要合理设计分配表空间以及存储参数、内存使用初始化参数,对以后的数据库性能有很大的益处,建立好后,又需要在应用中不断进行应用程序的优化和调整,这需要在大量的实践工作中不断地积累经验,从而更好地进行数据库的调优。 数据库性能调优的方法 ●调整内存 ●调整I/O ●调整资源的争用问题 ●调整操作系统参数 ●调整数据库的设计 ●调整应用程序 本文针对应用程序的调整,来说明对数据库性能如何进行优化。 2表分区的应用 对于海量数据的表,可以考虑建立分区以提高操作效率。建立分区一般以关键字为分区的标志,也可以以其他字段作为分区的标志,但效率不如关键字高。建立分区的语句在建表时可以进行说明: createtableTABLENAME() partitionbyrange(PutOutNo) (partitionPART1valueslessthan(200312319999) partitionPART2valueslessthan(200412319999)

Oracle内存全面分析

Oracle 内存内存全面全面全面分析分析 作者作者::fuyuncat 来源来源::https://www.doczj.com/doc/d614274994.html, 作者简介 黄玮,男,99年开始从事DBA 工作,有多年的水利、军工、电信及航 运行业大型数据库Oracle 开发、设计和维护经验。 曾供职于南方某著名电信设备制造商——H 公司。期间,作为DB 组 长,负责设计、开发和维护彩铃业务的数据库系统。目前,H 公司的彩铃系 统是世界上终端用户最多的彩铃系统。最终用户数过亿。 目前供职于某世界著名物流公司,负责公司的电子物流系统的数据库开 发、维护工作。 msn: fuyuncat@https://www.doczj.com/doc/d614274994.html, Email :fuyuncat@https://www.doczj.com/doc/d614274994.html, Oracle 的内存配置与oracle 性能息息相关。而且关于内存的错误(如4030、4031错 误)都是十分令人头疼的问题。可以说,关于内存的配置,是最影响Oracle 性能的配 置。内存还直接影响到其他两个重要资源的消耗:CPU 和IO。 首先,看看Oracle 内存存储的主要内容是什么: ? 程序代码(PLSQL、Java); ? 关于已经连接的会话的信息,包括当前所有活动和非活动会话; ? 程序运行时必须的相关信息,例如查询计划; ? Oracle 进程之间共享的信息和相互交流的信息,例如锁; ? 那些被永久存储在外围存储介质上,被cache 在内存中的数据(如redo log 条 目,数据块)。 此外,需要记住的一点是,Oracle 的内存是与实例对应的。也就是说,一个实例就有 一个独立的内存结构。 先从Oracle 内存的组成架构介绍。 1. Oracle 的内存架构组成 Oracle 的内存,从总体上讲,可以分为两大块:共享部分(主要是SGA)和进程独享 部分(主要是PGA 和UGA)。而这两部分内存里面,根据功能不同,还分为不同内存池 (Pool)和内存区(Area)。下面就是Oracle 内存构成框架图:

oracle实例内存详解

一、名词解释 (1)SGA:SystemGlobal Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 (2)共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,主要包括:Librarycache(共享SQL区)和Datadictionarycache(数据字典缓冲区)。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。 (3)缓冲区高速缓存:DatabaseBufferCache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。 (4)大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境。 (5)Java池:Java Pool为Java命令的语法分析提供服务。 (6)PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。 二、分析与调整 (1)系统全局域: SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/3到1/2。 a.共享池Shared Pool: 查看共享池大小Sql代码 SQL>show parameter shared_pool_size 查看共享SQL区的使用率: Sql代码 select(sum(pins-reloads))/sum(pins)"Library cache"from v$librarycache; --动态性能表 LIBRARY命中率应该在90%以上,否则需要增加共享池的大小。 查看数据字典缓冲区的使用率:

oracle内存pga+sga设置方法

11g 中新增MEMORY_MAX_TARGET 参数,此参数一出现就如在10g 中第一次出现SGA_MAX_SIZE 参数一样给人以耳目一新的感觉。memory_max_target 是设定Oracle能占OS多大的内存空间,一个是Oracle SGA 区最大能占多大内存空间。无疑在11g Oracle 又向自动管理内存更进一步。 10g 的sga_max_size 是动态分配 Shared Pool Size,database buffer cache,large pool,java pool,redo log buffer 大小的,只是根据Oracle 运行状况来重新分配SGA 各内存块的大小。PGA在10g 中需要单独设定. 11g MEMORY_MAX_TARGET 参数包含两部分内存,一个 System global area (SGA),另一个 system global area(PGA)。很显然在11g 中可已经将PGA 和SGA 一 起动态管理了。 下面来看看在11g 中Memory_target 设置和不设置对SGA/PGA 的影响: A:如果Memory_target 设置为非0 值 (下面有四种情况来对SGA 和PGA 的大小进行分配) 1:sga_target 和 pga_aggregate_target 已经设置大小如果Oracle 中已经设置了参数sga_target 和pga_aggregate_target,则这两个参数将各自被分配为最小值最为它们的目标值。 Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小 和 memory_max_size 一致。 2:sga_target 设置大小, pga_aggregate_target 没有设置大小那么pga_aggregate_target初始化值=memory_target-sga_target 3:sga_target 没有设置大小, pga_aggregate_target 设置大小那么sga_target 初始化值=memory_target-pga_aggregate_target 4:sga_target 和 pga_aggregate_target 都没有设置大小 Oracle 11g 中对这种sga_target 和pga_aggregate_target 都没有设定大小的情况下,Oracle将对这两个值没有最小值和默认值。 Oracle 将根据数据库运行状况进行分配大小。 但在数据库启动是会有一个固定比例来分配: sga_target =memory_target *60% pga_aggregate_target=memory_target *40% B:如果Memory_target 没有设置或=0 (在11g 中默认为0) 11g 中默认为0 则初始状态下取消了Memory_target 的作用,完全和10g 在内存管理上一致,完全向下兼容。 (也有三种情况来对SGA 和PGA 的大小进行分配)

Oracle 内存分配与调整.

Oracle 内存分配与调整 一、前言 对于oracle 的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。下面我们将一步一步就内存管理的各个方面进行探讨。 二、概述 oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是SGA 和PGA(process global area or private global area 。对于SGA 区域内的内存来说,是共享的全局的,在UNIX 上,必须为oracle 设置共享内存段(可以是一个或者多个,因为oracle 在UNIX 上是多进程;而在WINDOWS 上oracle 是单进程(多个线程,所以不用设置共享内存段。PGA 是属于进程(线程私有的区域。在oracle 使用共享服务器模式下(MTS,PGA 中的一部分,也就是UGA 会被放入共享内存 large_pool_size 中。对于SGA 部分,我们通过sqlplus 中查询可以看到: SQL> select * from v$sga; NAME V ALUE Fixed Size 454032 Variable Size 109051904 Database Buffers 385875968 Redo Buffers 667648 其中: Fixed Size:

oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA 各部分组件的信息,可以看作引导建立SGA 的区域。Variable Size: 包含了shared_pool_size 、java_pool_size 、large_pool_size 等内存设置Database Buffers: 指数据缓冲区,在8i 中包含db_block_buffer*db_block_size 、 buffer_pool_keep 、buffer_pool_recycle 三部分内存。在9i 中包含db_cache_size 、 db_keep_cache_size 、db_recycle_cache_size 、db_nk_cache_size 。 Redo Buffers: 指日志缓冲区,log_buffer 。在这里要额外说明一点的是,对于v$parameter 、 v$sgastat 、v$sga 查询值可能不一样。v$parameter 里面的值,是指用户在初始化参 数文件里面设置的值,v$sgastat 是oracle 实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block 为最小单位进行分配的, v$sga 里面查询的值,是在oracle 分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小大约是11k(不同环境可能不一样。参考如下内容 SQL> select substr(name,1,10 name,substr(value,1,10 value 2 from v$parameter where name = 'log_buffer'; NAME V ALUE log_buffer 524288 SQL> select * from v$sgastat ; POOL NAME BYTES fixed_sga 454032

ORACLE内存调整建议

ABC公司Oracle数据库参数调整建议 1.Oracle参数initdb.ora (修改建议) 目前系统现在分析: (1)Windows 2003可以显示50G内存,但操作系统是32位,最多默认支持4G,用户进程支持2G,Oracle可能支持1.7G内存; (2)不清楚是否对操作系统做过支持大内存的调整;从下表的参数分析,可能没有修改; (3)不清楚此系统Windows是否允许在虚拟环境(Virtual Machine),故保守起见,我们的建议是:把内存往小里调整。 根据我们的经验,对Oracle数据库调整如下: 总内存控制在1.5G SGA控制在800M PGA使用700M testdb.__db_cache_size=469762048 testdb.__java_pool_size=8388608 testdb.__large_pool_size=8388608 testdb.__oracle_base='D:\app\Administrator'#ORACLE_BASE set from environment testdb.__pga_aggregate_target= 734003200 #700M #671088640 testdb.__sga_target=838860800 #800M #1249902592 testdb.__shared_io_pool_size=0 testdb.__shared_pool_size= 335544320 #320M #738197504 testdb.__streams_pool_size=8388608 *.audit_file_dest='D:\app\Administrator\admin\xbrldb\adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='E:\data\xbrldb\control01.ctl','D:\app\Administrator\flash_recovery_ area\xbrldb\control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_name='xbrldb' *.db_recovery_file_dest='D:\app\Administrator\flash_recovery_area' *.db_recovery_file_dest_size=21474836480 *.diagnostic_dest='D:\app\Administrator' *.dispatchers='(PROTOCOL=TCP) (SERVICE=xbrldbXDB)' *.fast_start_mttr_target=30 *.job_queue_processes=1000 testdb.local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(H OST=10.24.58.100)(PORT=1531))))' *.log_archive_format='ARC%S_%R.%T' *.memory_target= 1610612736 #1.5G#1916796928

一分钟查一个案例带你看看Oracle数据库到底有多牛逼性能难题

一分钟查一个案例带你看看Oracle数据库到底有多牛逼 性能难题 问题来了 电话响了,是一位证券客户 DBA 的来电,看来,问题没过两天,又出现了。 接起电话,果不其然。 “小y,前天那个问题又重现了。重启后恢复正常,这次抓到了hangAnalyze,不过领导在身后一直催,所以没来得及抓取 systemstate dump 就重启了。你尽快帮忙分析下吧,hanganalyze 的 trace 文件 已经转到你邮箱了。” 就在 2 天前,该客户找到小 y, 他们有一套比较重要的系统出现了数据库无法登陆的情况,导致业务中断,重启后业务恢复,但原因未明,搞的他们压力很大。 可惜的是,他们是事后找过来,由于客户现场保护意识不足,最后也只能是巧妇难为无米之炊了… 总的来说,小 y 还算是比较熟悉证券行业的。 毕竟,小 y 多年来一直在银行、证券、航空等客户提供数据库专家支持服务,这其中就包括了北京 排名前 6 的所有证券公司。 简而言之,证券行业的要求就是快速恢复,快速恢复业务大于一切。 原因很简单,股价瞬息万变,作为股民,如果当时无法出售或者购买股票,甚至可能引发官司。所以,证券核心交易系统如果中断时间超过 5 分钟,则可以算得上是严重故障了,一旦被投诉,则可能会 被证监会通报,届时业务可能被降级,影响到证券公司的经营和收益。 结合这个特点,小 y 为客户制定了应急预案,看来收集 systemstate dump 是来不及了,只能先 收集 hangAnalyze, 时间来得及的话则可以继续收集 systemstate dump。收集 hangAnalyze 的命令 很简单,照敲就是了,没什么技术含量。 $sqlplus –prelim “/as sysdba” SQL>oradebug setmypid SQL>oradebug hanganalyze 3 .. 此处等上一会 .. SQL>oradebug hanganalyze 3 SQL>oradebug tracefile_name

Oracle数据库实例的内存和进程结构

Oracle数据库实例的内存和进程结构 更新: 2010-04-27来源: 互联网字体:【大中小】 内存结构 在Oracle数据库系统中内存结构主要分为系统全局区(SGA)和程序全局区(PGA)。 SGA随着数据库实例的启动向操作系统申请分配一块内存结构,随着数据库实例的关闭释放,每一个Oracle数据库实例有且只有一个SGA。 PGA随着Oracle服务进程启动的时候申请分配的一块内存结构。如果在共享服务结构中PGA存在SGA 中。 下图展示Oracle的内存结构,在后面我们将用文字详细的表述各个部件。 系统全局区(SGA) 重要提示,提高SGA的大小可以在一定程度上提高Oracle数据库系统的性能,但你设置SGA的值如果不能锁定在内存物理页上,有些部分可能被交换到系统的交换文件中。这样你的Oracle数据库系统将变慢。 系统全局区是一组包含数据和控制信息的共享内存结构,允许Oracle服务的众多后台进程同时访问或修改其中的数据,所以有些时候也被称为―全局共享区‖,参数文件中的SGA_MAX_SIZE指定SGA动态大小。※共享池SharedPool ※数据高速缓存DatabaseBufferCache ※重做日志缓存RedoLogBufferCache ※ Java池(可选)JavaPool ※大缓冲池(可选)LagerPool 共享池 共享池存储了最近多数使用的执行SQL语句和最近使用的数据定义。它包含库高速缓存器和数据字典缓存器这两个与性能相关的内存结构。共享池的大小可以通过初始化参数文件(通常为init.ora)中的SHARED_POOL_SIZE决定。共享池是活动非常频繁的内存结构,会产生大量的内存碎片,所以你要确保它尽可能足够大。 库高速缓存器,他又包含共享SQL区和共享PL/SQL区两个组件区。为了提高SQL语句的性能,在提交SQL语句或PL/SQL程序块时Oracle服务器将先利用最近最少使用(LRU)算法检查库高速缓存中是否存在相同的SQL语句或PL/SQL程序块,若有则使用原有的分析树和执行路径。 数据字典缓存器,它收集最近使用的数据库中的数据定义信息。它包含数据文件、表、索引、列、用户、访问权限、其他数据库对象等信息。在分析阶段决定数据库对象的可访问信息。利用数据字典缓存器有效的改善了响应时间。它的大小由共享池的大小决定。 数据高速缓存 它存储数据文件中数据块的拷贝。利用这种结构使数据的更新操作性能大大的提高。数据高速缓存中的数据交换同样采用最近最少使用算法(LRU)。它的大小主要受到DB_BLOCK_SIZE决定。数据高速缓存它由DB_CACHE_SIZE、DB_KEEP_CACHE_SIZE、 DB_RECYCLE_CACHE_SIZE这些独立的子缓存器构成,同时它能动态的增长或收缩。 重做日志缓存

修改Oracle 11g 内存

修改Oracle 11g 内存 分类:Oracle Database 2011-12-16 18:49 910人阅读评论(0) 收藏举报oracleintegersystemsqlbic https://www.doczj.com/doc/d614274994.html,/tswisdom/article/details/7078477 [oracle@bi11g bin]$ ./sqlplus /nolog SQL*Plus: Release 11.2.0.1.0 Production on Fri Dec 1618:39:36 2011 Copyright (c) 1982, 2009, Oracle. All rights reserved. SQL> conn / as sysdba Connected. SQL> show parameter memory NAME TYPE VALUE ------------------------------------ ----------------------------------------- hi_shared_memory_address integer 0 memory_max_target big integer 1584M memory_target big integer 1584M shared_memory_address integer 0 SQL> alter system set memory_target = 512M scope=spfile 2 ; System altered. SQL> alter system set memory_max_target =1024Mscope=spfile 2 ; System altered. SQL> show parameter memory NAME TYPE VALUE ------------------------------------ ----------------------------------------- hi_shared_memory_address integer 0

oracle12c 内存数据库(IN-MEMORY)使用手册

启动Oracle数据库12c的第1版(12.1.0.2),在内存中的列存储(IM列存储)是存储表和分区的副本进行快速扫描优化的特殊柱状格式可选,静态SGA池。在IM列存储不更换缓存,但作为一个补充,使这两个存储区可存储不同格式相同的数据。默认情况下,仅使用DDL 对象指定的inmemory的候选人将填充在IM列存储。 柱状格式只存在于内存中。图14-8显示了存储在IM列存储SH模式三个表:客户,产品和销售。在IM列存储通过柱,而不是行存储数据。该数据库保持柱状数据缓冲区高速缓存事务一致性。 本节包含了以下主题: 在IM列存储的好处 双存储格式:纵栏和行 在内存中的列存储的人口 在内存列压缩 扫描优化的IM列存储 在IM列存储的好处 在IM列存储使得数据库进行扫描,联接和聚合时相比,它使用的磁盘格式完全快得多。特别是,对于IM列存储是很有用的: 扫描行数和应用使用运营商,如=过滤器,<,>,和IN 查询列的子集在表中,例如,选择5 100的列 加快加入通过将小维表谓词到过滤器上的一个大的事实表 业务应用,即席分析查询和数据仓库工作负载受益最大。执行使用索引查找短事务纯OLTP 数据库中受益较少. 在IM列存储还具有以下优点: 所有现有的数据库功能都支持,包括高可用性功能(参见“高可用性概述”)。 没有应用程序的改变是必需的。 优化器会自动柱状格式的优势。 配置简单。 该INMEMORY_SIZE初始化参数指定的内存预留供IM列存储的使用量。DDL语句指定表空间,表,分区或列被读入IM列存储。 压缩优化的查询性能。 这些压缩技术通过使会话读取更多的数据到内存中增加有效的内存带宽。 更少的索引,物化视图和OLAP多维数据集是必需的。

配置Oracle内存

对oracle的内存(SGA和PGA)进行调整,优化数据库性 一、示例: SGA: 共享池:200MB 缓冲区高速缓存:24MB 大型池:9MB Java池:32MB SAG总容量:264.933 SAG的最大大小:305.069 PGA: 总记PGA目标:240MB 分配的当前PGA:8914KB 分配的最大PGA(自启动以来)9081KB 高速缓存命中百分比:100% PGA和SGA的和应小于系统内存总量前去操作系统和其他应用程序所需内存后得到的值。 二、名词解释: SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配; 系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义, 主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区) 共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息 缓冲区高速缓存:Database Buffer Cache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能 大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境

Java池:ava Pool为Java命令的语法分析提供服务 PGA:Program Global Area是为每个连接到Oracle database的用户进程保留的内存。 三、分析与调整: 1、系统全局域: SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/2到1/3,当然,如果服务器上只有oracle的话, 可以分配的更大一些,如果还有其他服务,如IIS等,那就要分的小一些。 1、共享池: 修改共享池的大小,ALTER SYSTEM SET SHARED_POOL_SIZE = 64M; 查看共享SQL区的使用率: select(sum(pins-reloads))/sum(pins) "Library cache" from v$librarycache;--动态性能表 这个使用率应该在90%以上,否则需要增加共享池的大小。 查看数据字典缓冲区的使用率: select (sum(gets-getmisses-usage-fixed))/sum(gets) "Data dictionary cache" from v$rowcache;--动态性能表 这个使用率也应该在90%以上,否则需要增加共享池的大小。 2、缓冲区高速缓存: 它的大小要根据数据量来决定: SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB 查看数据库数据缓冲区的使用情况: SELECT name,value FROM v$sysstat order by name WHERE name IN(''DB BLOCK GETS'',''CONSISTENT GETS'',''PHYSICAL READS''); 计算出来数据缓冲区的使用命中率=1-(physical reads/(db block gets+consistent gets)),这个命中率应该在90%以上,否则需要 增加数据缓冲区的大小。

全面分析Oracle数据库的内存配置

Oracle内存全面分析(1) 作者:fuyuncat 来源:https://www.doczj.com/doc/d614274994.html, Oracle的内存配置与oracle性能息息相关。而且关于内存的错误(如4030、4031错误)都是十分令人头疼的问题。可以说,关于内存的配置,是最影响Oracle性能的配置。内存还直接影响到其他两个重要资源的消耗:CPU 和IO。 首先,看看Oracle内存存储的主要内容是什么: ?程序代码(PLSQL、Java); ?关于已经连接的会话的信息,包括当前所有活动和非活动会话; ?程序运行时必须的相关信息,例如查询计划; ?Oracle进程之间共享的信息和相互交流的信息,例如锁; ?那些被永久存储在外围存储介质上,被cache在内存中的数据(如redo log条目,数据块)。 此外,需要记住的一点是,Oracle的内存是与实例对应的。也就是说,一个实例就有一个独立的内存结构。 先从Oracle内存的组成架构介绍。

1.Oracle的内存架构组成 Oracle的内存,从总体上讲,可以分为两大块:共享部分(主要是SGA)和进程独享部分(主要是PGA 和UGA)。而这两部分内存里面,根据功能不同,还分为不同内存池(Pool)和内存区(Area)。下面就是Oracle内存构成框架图: SGA Share Pool Buffer Cache Redo Log Buffer Java Pool Stream Pool(10g)Large Pool PGA*n Bitmap merge area Sort Area Hash Area UGA*n CUA*n 下面分别介绍这两块内存区。 1.1.SGA(System Global Area) SGA(System Global Area 系统全局区域)是一组包含一个Oracle实例的数据和控制信息的共享内存结构。这句话可以说是SGA的定义。虽然简单,但其中阐述了SGA几个很重要的特性:1、SGA的构成——数据和控制信息,我们下面会详细介绍;2、SGA是共享的,即当有多个用户同时登录了这个实例,SGA中的信息可以被它们同时访问(当涉及到互斥的问题时,由latch和enquence控制);3、一个SGA只服务于一个实例,也就是说,当一台机器上有多个实例运行时,每个实例都有一个自己的SGA,尽管SGA来自

ORACLE SID 实例名 数据库名 讲解

详解:oracle10G 数据库名、实例名、ORACLE_SID 【转载】 数据库名、实例名、数据库域名、全局数据库名、服务名, 这是几个令很多初学者容易混淆的概念。相信很多初学者都与我一样被标题上这些个概念搞得一头雾水。我们现在就来把它们弄个明白。 一、数据库名 什么是数据库名? 数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下: DB_NAME=myorcl ... 在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME 的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。 数据库名的作用 数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。 有很多Oracle安装文件目录是与数据库名相关的,如: winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\... Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/... pfile: winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora 跟踪文件目录: winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/... 另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。 同样,修改数据库结构的语句alter database,当然也要指出要修改的数据库的名称。 如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount 方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。 还有在备份或恢复数据库时,都需要用到数据库名。 总之,数据库名很重要,要准确理解它的作用。 查询当前数据名 方法一:select name from v$database; 方法二:show parameter db 方法三:查看参数文件。 修改数据库名 前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:

oracle 11g数据库ASM磁盘组存储空间扩容实施

oracle 11g数据库ASM磁盘组存储空间扩容实施任务概述 XX系统存放oracle数据文件的DATA磁盘组空间因为开发方新上线业务,造成原有数据库表空间较为紧张,应业务开发方要求,为了适应未来的数据增长 要求,需要扩容。 此方案为数据库扩容常规标准步骤,无需专门测试,但是,在数据库存储扩容前,为防止变更操作带来的风险,需要对数据库数据作备份,以防万一出现问题时做回退恢复。 在实施存储扩容变更操作时,由于是底层磁盘阵列和操作系统的标准化操作,为了防止操作失误,必须一人操作,另一人在旁监督检查,并且分步确认,步 步把关,确保万无一失。 1.1. 实施任务 DATA磁盘组扩容: 在DS5300存储RAID10组中划分新的2个300G的LUN并添加到DATA 磁盘组给XX集群数据库使用,RAID10组剩余的空间可以留给以后扩容或其他用途使用。 1.2. 环境简介 系统名称:XX系统;主机:两台IBM P750小型机;操作系统:AIX 6.1; 存储:1套IBM DS5300;数据库:ORACLE RAC 11.2.0.3.0; 1.3. 实施时间 2014年11月。 1.4. 实施人员 略 2. 实施方案 2.1. 实施内容 原有数据库需要作数据作RMAN备份; 连接到存储DS5300划分LUN,并加载到主机; 主机扫描识别,修改属性及权限;

ASM存储DATA磁盘组增加disk扩容; 检查数据库和应用。 2.2. 实施步骤 2.3. 实施风险控制 在数据库存储扩容前,为防止变更操作风险,需要对数据库数据作备份,以防万一。 在实施存储扩容变更操作时,由于是底层磁盘阵列和操作系统的标准化操作,为了防止操作失误,必须一人操作,另一人在旁监督检查,并且分步确认,步 步把关,确保万无一失。 3. 详细实施步骤 3.1. RMAN备份 在数据库服务器节点2上通过RMAN对数据库做全备份,历时约60分钟。 具体步骤如下: 以root用户创建备份用的目录,并更改所有者等; #mkdir -p /backup/20131122 #chown -R oracle:dba /backup/ 以oracle用户创建rman备份用的脚本,并赋权限: #su - oracle $cd /backup/20131122

相关主题
文本预览
相关文档 最新文档