oracle如何扩展内存 oracle如何释放内存

如何使oracle的SGA在32位的操作系统下超出2G?

Win2003 :

创新互联是一家从事企业网站建设、成都网站设计、成都网站建设、行业门户网站建设、网页设计制作的专业网络公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点数千家。

由于32位的CPU的在windows系统中2G给系统用2G给应用程序使用,如系统及oracle参数不作修改时,oracle的SGA内存使用不能超过1.7G,所以要对一些进行windos

ows和oracle参数据进行修改,大致有以下几步:一 windows 上的参数据修改:

1. 修改boot.ini文件,加/3GB /PAE:

在这行,multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows" /3GB /PAE 2.修改windows 注册表:

regedit到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 这个目录中找到AWE_WINDOW_MEMORY这个参数,将其修改为oracle需要内存的大小:例如:6G时为:6*1024*1024*1024

这个参数如不存大时,可以新建一个字符串名为AWE_WINDOW_MEMORY,值为上面讲过的大小,这个值需要足够大,不够时将报:

ORA-27102 out of memory

OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD

O/S Error: (OS 8) Not enough storage is available to process this command

3.修改windows控制面板中的管理工具-- 域安全策略-- 本地安全策略 --锁定内存页 中加入启oracle数据库的OS用户名.

二 ORACLE数据库中要改的参数:

1.在改参数之前最好能先备份一个spfile到pfile 文件以防数据库修改失败时可以从这个参数文件在启动数据库: create pfile='d:\inittest.ora' from spfile; 2.主要修改的参数为:

_db_block_lru_latches --这个参数据大小为=CPU数*2*8

取消参数据:db_cache_size,sga_max_size

db_block_buffers

USE_INDIRECT_DATA_BUFFERS=TRUE

SQL shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL startup

ORACLE 例程已经启动。Total System Global Area 1008280152 bytes

Fixed Size 455256 bytes

Variable Size 478150656 bytes

Database Buffers 528482304 bytes

Redo Buffers 1191936 bytes

数据库装载完毕。

数据库已经打开。

SQL alter system set "_db_block_lru_latches"=128 scope=spfile;系统已更改。SQL alter system reset db_cache_size scope=spfile sid='*';系统已更改。SQL alter system set lock_sga=false scope=spfile;系统已更改。SQL alter system set db_block_buffers=1179648 scope=spfile;系统已更改。SQL alter system set use_indirect_data_buffers=true scope=spfile;系统已更改。SQL create pfile='d:\init2.ora' from spfile;文件已创建。SQL shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。可以通过OEM来修改PGA,shared pool这些内存大小

SQL startup

ORACLE 例程已经启动。Total System Global Area 7516192768 bytes

Fixed Size 455256 bytes

Variable Size 478150656 bytes

Database Buffers 3528482304 bytes

Redo Buffers 1191936 bytes

数据库装载完毕。

数据库已经打开。

Linux

有不少用户认为在32位Linux,只能设置约1.7GB的Oracle SGA。也有不少用户在不同的Linux发行版中使用相同的配置过程,获得了不同的SGA最大值,便认为某些Linux发行版存在问题。这些想法都比较片面。实际上 32位Linux上Oracle SGA 的容量取决于三个指标,即:Linux kernel 版本、Oracle Database 版本、Linux 内核参数shmmax。这里跟据一些网上文章做了些查正,做一些分析吧。一、内核版本的影响在32位Linux平台,至少都有两套内核供用户使用。一个是smp核心,一个是hugemem核心。两个核心的区别在于直接映射的内核数据代码地址空间的区别:SMP 核心:在x86架构下,虚拟地址空间的大小为4G。在这4G空间中,用户空间占3G (0×00000000到0xbfffffff),核心空间占1G(0xc0000000到0xffffffff)。这样的分配策略称为3G/1G分配。具体的分配方式如下:1. 0GB-1GB User space - Used for text/code and brk/sbrk allocations (malloc uses brk for small chunks)2. 1GB-3GB User space - Used for shared libraries, shared memory, and stack; shared memory and malloc use mmap (malloc uses mmap for large chunks)3. 3GB-4GB Kernel Space - Used for the kernel itself这种分配方式对于拥有1G物理内存以下的系统是没有任何问题的,即使超过1G物理内存,3G/1G分配策略也没有什么问题,因为内核可以在高端内存区域 (物理地址1G以上的内存)中存放一些内核数据结构(比如页缓冲等)。然而,随着物理内存的增多,3G/1G分配策略的问题也逐渐会暴露出来。这是因为一些关键的内核数据结构 (比如用于管理物理内存的mem_map[]) 是存放在1G核心空间之内的。对于32G内存的系统,mem_map[]会占用近 0.5G的低端内存(物理地址896M以下的内存),这样留给核心其他部分的内存就不到所有内存的1.5%;而对于64G内存的系统,mem_map[] 本身就会耗尽所有的低端内存,造成系统无法启动。但是把mem_map[]放到高端内存的做法也不太实际,因为mem_map[]和内存管理,体系结构相关底层实现,文件系统以及驱动等几乎所有的核心的关键部分均有联系,这时候就需要使用hugemem核心了。hugemem 核心:与SMP的3G/1G策略不同,hugemem 使用4G/4G分配方式。可以使核心空间由1G增加到4G,而用户空间也由3G增加到4G。相比3G/1G分配策略,对于4G物理内存系统,使用4G/4G分配可以增加低端内存达3倍以上,而对于32G物理内存系统,则会有更多的提升,达到原来的6倍。 理论上,4G/4G策略可以支持物理内存达200G的x86系统(如果硬件没有限制的话),即使对于这样的系统,4G/4G策略也能保证留有1G可用的低端内存。不论能否理解上面的解释,只须要记住 smp 和 hugemem 两个核心,一个是 3G/1G策略,一个是4G/4G策略即可。二、Oracle Database 版本:Oracle SGA 是挂载在内存用户空间中,不同版本的 Oracle Database ,挂载SGA起始地址是不同的:Oracle 10g Release 1:挂载SGA的起始地址为0×50000000(1.25GB)Oracle 10g Release 2:挂载SGA的起始地址为0×20000000(0.5GB)(其它版本未查正,有兴趣可以自已看看Oracle手册)从这个结果可以看出,理论上若使用3G/1G的smp核心,Oracle 10g Release 1 的SGA可设置到 3GB - 1.25 = 1.75GB 。正是因此,也有人认为Oracle SGA 只能设置到 1.75GB。而升级至 R2 版本,则可以设置到 3GB - 0.5GB = 2.5GB 。相同的,使用 4G/4G 的hugemem 核心能够获得多大的SGA 就很清楚了。

三、kernel shmmax 参数:shmmax定义单个共享内存段的最大值,它的取值范围区间是[0,4294967295], 单位为byte,4294967295 bytes即4294967296 bytes(4GB)减去1。一般来说,它应该足够大以容下整个SGA,避免SGA使用多个共享内存段造成Oracle性能下降。那么,将shmmax设置为最大值4294967295,使用 hugmemem 核心,Oracle 10g R2 版本,则理论上的SGA最大值为 3.5GB。尽管用户进程可用的虚拟地址空间为4GB以及shmmax的最大值为4294967295,仍然可以通过使用内存文件系统(in-memory filesystem,比如tmpfs、ramfs以及hugetlbfs)打开Oracle的Very Large Memory (VLM)特性来扩展SGA超过4GB,比如6GB。但是这种方法有个不方便的地方是,用户不能够再使用Oracle 10g中的Automatic Shared Memory Management了。总结一下:SMP核心和hugemem核心的影响:SMP核心:1GB+3GB,SGA最大值为1.75GB(3GB-1.25GB)Hugemem核心:4GB+4GB , SGA最大值为2.75GB(4GB-1.25GB)Oracle 不同版本的影响:Oracle 10g Release 1:挂载SGA的起始地址为0×50000000(1.25GB)Oracle 10g Release 2:挂载SGA的起始地址为0×20000000(0.5GB)那么:Hugemem 核心 + Oracle 10g Release 2 ,SGA最大值为3.5GB(4GB-0.5GB)BTW:由于64位系统对应16EB寻址范围,而不是32位系统的4GB,所以想要获得更大SGA,性能更好的效果,应该优先使用 64 位系统,而不是通过32系统配合内存文件系统来配置了。

Oracle内存参数调优技术详解

目的

希望通过整理此文档 使大家对 oracle 内存结构有一个全面的了解 并在实际的工作中灵活应用 使 oracle 的内存性能达到最优配置 提升应用程序反应速度 并进行合理的内存使用

实例结构

oracle 实例 = 内存结构 + 进程结构

oracle 实例启动的过程 其实就是 oracle 内存参数设置的值加载到内存中 并启动相应的后台进程进行相关的服务过程

进程结构

oracle 进程 = 服务器进程 + 用户进程

几个重要的后台进程

DBWR 数据写入进程

LGWR: 日志写入进程

ARCH: 归档进程

CKPT: 检查点进程 ( 日志切换 上一个检查点之后 又超过了指定的时间 预定义的日志块写入磁盘 例程关闭 DBA 强制产生 表空间 offline)

LCKn ( ) 封锁进程

Dnnn: 调度进程

内存结构 ( 我们重点讲解的 )

内存结构 =SGA (系统全局区) +PGA (程序全局区)

SGA 是用于存储数据库信息的内存区 该信息为数据库进程所共享 它包含 Oracle 服务器的数据和控制信息 它是在 Oracle 服务器所驻留的计算机的实际内存中得以分配 如果实际内存不够再往虚拟内存中写

我们重点就是设置 SGA 理论上 SGA 可占 OS 系统物理内存的 / —— /

原则 SGA+PGA+OS 使用内存 总物理 RAM

SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+ MB

SGA 系统全局区 ( 包括以下五个区 )

A 数据缓冲区 : ( db_block_buffers )存储由磁盘数据文件读入的数据

大小 : db_block_buffers*db_block_size

Oracle i 设置数据缓冲区为 Db_cache_size

原则 SGA 中主要设置对象 一般为可用内存 %

B 共享池 : ( shared_pool_size ) : 数据字典 sql 缓冲 pl/sql 语法分析 加大可提速度

原则 SGA 中主要设置对象 一般为可用内存 %

C 日志缓冲区 : ( log_buffer )存储数据库的修改信息

原则 K M 之间 不应该太大

D JAVA 池( Java_pool_size )主要用于 JAVA 语言的开发

原则 若不使用 java 原则上不能小于 M 给 M 通常就够了

E 大池( Large_pool_size )   如果不设置 MTS 主要用于数据库备份恢复管理器 RMAN

原则 若不使用 MTS M 之间 不应该太大

SGA= db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size

原则 达到可用内存的 % 就可以了

PGA 程序全局区

PGA 包含单个服务器进程或单个后台进程的数据和控制信息 与几个进程共享的 SGA 正相反 PGA 是只被一个进程使用的区域 PGA 在创建进程时分配在终止进程时回收

A Sort_area_size  用于排序所占内存

B Hash_area_size 用于散列联接 位图索引

这两个参数在非 MTS 下都是属于 PGA 不属于 SGA 是为每个 session 单独分配的 在我们的服务器上除了 OS + SGA 一定要考虑这两部分

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

实例配置

一 物理内存多大

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

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

四 有多少并发连接

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

基本掌握的原则是 db_block_buffer 通常可以尽可能的大 shared_pool_size 要适度 log_buffer 通常大到几百 K 到 M 就差不多了

A 如果 M RAM  单个 CPU   db_block_size 是 bytes

SGA= * M= M 左右

建议 shared_pool_size = M db_block_buffer* db_block_size = M

具体 : shared_pool_size = # M

db_block_buffer=       # M

log_buffer =          # k ( K*CPU 个数 )

large_pool_size=       # M

java_pool_size =     # M

sort_area_size =       # k ( k M)

sort_area_retained_size =    # MTS 时 sort_area_retained_size = sort_area_size

B 如果 G RAM      单个 CPU   db_block_size 是 bytes

SGA= * M= M 左右

建议 shared_pool_size = M db_block_buffer* db_block_size = M

具体 : shared_pool_size=     # M

db_block_buffer=          # M

log_buffer =          # k ( K*CPU 个数 )

large_pool_size=        # M

java_pool_size =     # M

sort_area_size =       # k ( k M)

sort_area_retained_size =    # MTS 时 sort_area_retained_size = sort_area_size

C 如果 G     单个 CPU   db_block_size 是 bytes

SGA= * M= M 左右

建议 shared_pool_size = M db_block_buffer *db_block_size = M

具体 : shared_pool_size=     # M

db_block_buffer=          # M

log_buffer =             # k ( K*CPU 个数 )

large_pool_size=       # M

java_pool_size =       # M

sort_area_size =          # k ( k M)

sort_area_retained_size =    # MTS 时 sort_area_retained_size = sort_area_size

假定 bit ORACLE

内存 G

shared_pool_size = M data buffer = G

内存 G

shared_pool_size = M data buffer = G

内存 G

shared_pool_size = M M data buffer = G

参数更改方式

oracle i

主要都是通过修改 oracle 启动参数文件进行相关的配置

参数文件位置

d:\oracle\admin\DB_Name\pfile\init ora

按以上修改以上参数值即可

Oracle i:

两种方式 第一种是修改 oracle 启动参数文件后 通过此参数文件再创建服务器参数文件

第二种是直接运行 oracle 修改命令进行修改

SQLalter system set db_cache_size= M scope=spfile;

lishixinzhi/Article/program/Oracle/201311/16995

在虚拟系统中安装oracle时怎么增加物理内存

对于虚拟机的物理内存的添加,首先必须关掉虚拟机,

然后选择虚拟机的设置-在里面有一个Physical

Memory(或者中文:内存),在这里就可以调整虚拟机的物理内存。但注意别调到超过你电脑的内存数量

有问题追问或者百度Hi我都行

如何扩大oracle的内存

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 中。

Linux下Oracle如何扩充已满的存储空间

您好,很高兴为您解答,方法如下: /sbin/sysctl -a | grep shm /sbin/sysctl -a | grep sem /sbin/sysctl -a | grep file-max /sbin/sysctl -a | grep ip_local_port_range 如果我的回答没能帮助您,请继续追问。


分享名称:oracle如何扩展内存 oracle如何释放内存
链接地址:http://csdahua.cn/article/hgpsph.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流