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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使oracle的SGA在32位的操作系统下超出2G?相关的知识,希望对你有一定的参考价值。

如何使oracle的SGA在32位的操作系统下超出2G?比如:windows2003和linux redhat AS5.3

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系统配合内存文件系统来配置了。
参考技术A 32bit oracle默认情况下SGA不能超过1.7g。
所以要对一些进行windows和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需要内存的大小:例如:4G时为:4*1024*1024*1024
这个参数如果没有则新建一个字符串名为AWE_WINDOW_MEMORY,值为上面讲过的大小,这个值需要足够大,不够时将报内存不足

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
数据库装载完毕。
数据库已经打开。
最后注意下,最好不要这么用,因为32bit操作系统本身就限制操作系统的内存,如最大为4g,oracle分配过多,其他进程就用的少了,有时会出现问题。
参考技术B 32位的操作系统,SGA在分配内存的时候最多只能分配1.7G

建议你升级操作系统到64位,并且安装64位的Oracle
参考技术C 这个是做不到的 32位系统 SGA 最高只能到1.7G。 如果一定要>2G, 建议换64位 Oracle

在Oracle实例关闭情况下如何修改spfile的参数

重要说明:由于本文由本人测试并完成,其中可能还有不足之处,另外不同的环境可能也有不同的解决方法,本文仅供参考,并欢迎指证

问题描述:

在11G单机ASM中修改sga大小,修改完后,关闭instance并startup时,提示sga没有达到最小值,因些无法启动,而此时数据库实例已经关闭,已不能在之前的那种模式修改参数,具体的操作如下:

1、查询sga大小

SQL> show parameter sga
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
lock_sga                 boolean     FALSE
pre_page_sga                 boolean     FALSE
sga_max_size                 big integer 1G
sga_target                 big integer 1G

2、修改sga大小为500M

SQL> alter system set sga_target=500M scope=spfile;
System altered.

3、因为是指定参数为spfile,因此要重启instance才能使参数生效

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

4、重启instance 时,提示sga最小值应该为668M

SQL> startup
ORA-01078: failure in processing system parameters
ORA-00821: Specified value of sga_target 500M is too small, needs to be at least 668M


解决细路:

首先我们要理解一下oracle数据库在启动过程中调用 的参数,其顺序为:

spfilesid.ora -> spfile.ora ->initsid.ora-> init.ora  从这条启动线来说,如果第一个spfilesid.ora文件找不到的话,它会找到二个spfile.ora文件,如果能找到就能正常启动,若找不到,再继续找下一个initsid.ora文件,一直找到最后一个init.ora文件,说明:如果找到其中一个则会正常启动instance


解决方法:

通过创建pfile文件方式来启动数据库,然后再以pfile文件为模板创建spfile,具体步骤是:

1、以spfile模板创建pfile文件,并指定路径为本地硬盘位置

create pfile=‘/oracle/initudevasm.ora‘ from spfile=‘+DGDATA02/udevasm/spfileudevasm.ora‘;

2、修改initudevasm.ora文件,找到sga_target字段,修改大于668M

vi /oracle/initudevasm.ora

udevasm.__db_cache_size=826277888
udevasm.__java_pool_size=4194304
udevasm.__large_pool_size=8388608
udevasm.__oracle_base=‘/oracle/app/oracle‘#ORACLE_BASE set from environment
udevasm.__pga_aggregate_target=629145600
udevasm.__sga_target=1073741824
udevasm.__shared_io_pool_size=0
udevasm.__shared_pool_size=222298112
udevasm.__streams_pool_size=0
*.audit_file_dest=‘/oracle/app/oracle/admin/udevasm/adump‘
*.audit_trail=‘db‘
*.compatible=‘11.2.0.4.0‘
*.control_files=‘+DGDATA02/udevasm/controlfile/current.256.945212019‘
*.db_block_size=8192
*.db_create_file_dest=‘+DGDATA02‘
*.db_domain=‘‘
*.db_name=‘udevasm‘
*.db_recovery_file_dest_size=3221225472
*.diagnostic_dest=‘/oracle/app/oracle‘
*.dispatchers=‘(PROTOCOL=TCP) (SERVICE=udevasmXDB)‘
udevasm.log_archive_dest_1=‘LOCATION=+DGRECOVERY/‘
*.nls_language=‘AMERICAN‘
*.nls_territory=‘AMERICA‘
*.open_cursors=300
*.pga_aggregate_target=629145600
*.processes=1000
*.remote_login_passwordfile=‘EXCLUSIVE‘
*.sessions=170
*.sga_target=754288000  --大于668M
*.undo_tablespace=‘UNDOTBS1‘
3、以pfile文件启动instance

SQL> startup pfile=‘/oracle/initudevasm.ora‘
ORACLE instance started.
Total System Global Area  751595520 bytes
Fixed Size            2257032 bytes
Variable Size          603983736 bytes
Database Buffers      142606336 bytes
Redo Buffers            2748416 bytes
Database mounted.
Database opened.

4、以pfile文件为模板创建spfile文件

SQL> create spfile=‘+DGDATA02/udevasm/spfileudevasm.ora‘ from pfile=‘/oracle/initudevasm.ora‘;
File created.

5、关闭实例,并重新启动spfile,因为在在创建spfile时已经默认指定原来的路径,并把原来的spfile文件覆盖了,所以只要直接启动即可

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area  751595520 bytes
Fixed Size            2257032 bytes
Variable Size          603983736 bytes
Database Buffers      142606336 bytes
Redo Buffers            2748416 bytes
Database mounted.
Database opened.

6、查询修改后的sga大小

SQL> show parameter sga
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
lock_sga                 boolean     FALSE
pre_page_sga                 boolean     FALSE
sga_max_size                 big integer 720M
sga_target                 big integer 720M

通过上面查询则判断已经修改并恢复成功

总结:

    1、当数据库发生因为有关参数文件异常无法启动正常时,可以先把原理理解,然后通过创建pfile与spfile文件方式解决启动问题。

    2、要备份有关数据库参数文件以防止误操作导致数据库无法正常启动


本文出自 “我主梁缘” 博客,请务必保留此出处http://xiaocao13140.blog.51cto.com/6198256/1946083

以上是关于如何使oracle的SGA在32位的操作系统下超出2G?的主要内容,如果未能解决你的问题,请参考以下文章

转载64位Win7下成功安装64位的Oracle32位的InstantClient和PLSQL Developer

配置:使安装在64位系统上的IIS7支持32位的应用程序

Oracle内存结构:SGA PGA UGA

32位的xp系统用plsql连接32位的oracle时初始化失败找不到库oci.dll,求解释

Oracle SGA具体解释

64位系统下报错:cannot load OCI DLL,126