知识大全 32bitoracle扩展SGA原理

Posted 地址

篇首语:就算生活是个悲剧,也要做一个上品青花瓷。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 32bitoracle扩展SGA原理相关的知识,希望对你有一定的参考价值。

32bitoracle扩展SGA原理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   bit oracle由于位数限制 使得oracle进程只能访问 g( 的 次方)以下的虚拟内存地址 在很多时候这是一个很让人头疼的问题 因为空着许多内存而不能使用 而默认情况下SGA不能超过 g 比如我们的linux下有 g内存 却有部分空着不能用干着急 这个时候我们就要考虑怎样扩展oracle的SGA 那么首先 如何识别 bit的oracle呢?我们可以通过如下查询得到

  sys@OCN> select * from v$version;

  BANNER        Oracle i Enterprise Edition Release Production    PL/SQL Release Production    CORE Production    TNS for Linux: Version Production    NLSRTL Version Production

  如果是 bit oracle 在查询结果中一定会显示 bit 字样 没有出现 则一定是 bit oracle 当然 在os上通过file oracle 也能看到

  [oracle@ocn bin]$ cd $ORACLE_HOME/bin    [oracle@ocn bin]$ file oracle    oracle: setuid setgid ELF bit LSB executable Intel version dynamically linked (uses shared libs) not stripped    [oracle@ocn bin]$

  在某些os上 比如AIX上 bit oracle 会正常显示信息 bit则不正常显示

  在确认了 bit oracle之后 我们要明白 通常情况下我们的OS进程只能访问 g以下的空间 redhat linux AS 或者AS 版本例外 他们可以提供VLM(Very large memory)功能支持 使得通过转换可以使用 bit来标志内存地址 那么就是 的 次方理论上最大可支持 g内存访问 在oracle中 则是通过将内存当作文件来访问的 虚拟一个 /dev/shm 的文件系统 这个文件系统是完全由内存组成的 这样将突破 g的限制 那回过来我们看看 既然进程可以访问 g以下内存为何通常SGA又是 g呢

  在OS中 规定了一个进程在应用程序中 能访问的虚拟内存空间为 g 而 g g这段虚拟地址空间是保留给kernel使用的 要注意我们这里强调的是虚拟地址空间 并没有说物理地址空间 也就是说 假设有 g的内存 这 g的虚拟地址空间可能出现在 g内存的 g g部分内存段 并不是说是物理内存的 g段 而在这 g的虚拟地址中 oracle又是如何来使用的呢 这是固定好了地址的

  +++++++++++++++ g    + +    + +    + +    +++++++++++++++ g: kernel    + +    + +    + +    +++++++++++++++ g: process stack    + +    + +    +++++++++++++++ g: SGA起点    +++++++++++++++ g: oracle 共享库装载起点    + +    + +    + +    +++++++++++++++ g: oracle program(可执行代码)装载起点

  在这段虚拟地址的分配中 g是sga的起点 而进程的私有空间的分配(stack部分)却是从靠近 g处开始的 也就是实际上SGA和进程私有空间是共用了 g g这部分的 由于进程私有空间特别小 通常我们习惯性地认为SGA可以达到 g 进程私有空间有 g足够了 从oracle一启动开始 或者从任何一用户进程登陆开始 所有虚拟地址的分配都已经固定好了 只有用户私有空间还可以扩展 我们来看一下数据库启动后pmon进程(实际上任何一个进程都是一样的)的虚拟地址分配情况 由于我一台机器上跑着 个数据库 所以我们看其中一个 先看看数据库SGA相关信息

  [root@ocnsb root]# su oracle    [oracle@ocnsb oracle]$ sqlplus / as sysdba

  SQL*Plus: Release Production on Mon Jul : :

  Copyright (c) Oracle Corporation All rights reserved

  Connected to:    Oracle i Enterprise Edition Release Production    With the Partitioning Real Application Clusters OLAP and Oracle Data Mining options    JServer Release Production

  select >sys@OCN>select INSTANCE_NAME from v$instance ;

  INSTANCE_NAME        roocn

  show >sys@OCN>show sga

  Total System Global Area bytes    Fixed Size bytes    Variable Size bytes    Database Buffers bytes    Redo Buffers bytes    sys@OCN>

  exit >sys@OCN>exit    Disconnected from Oracle i Enterprise Edition Release Production    With the Partitioning Real Application Clusters OLAP and Oracle Data Mining options    JServer Release Production    [oracle@ocnsb oracle]$ ipcs

   Shared Memory Segments     key shmid owner perms bytes nattch status    x a bdc oracle     x cc ac oracle

   Semaphore Arrays     key semid owner perms nsems status    x df oracle     x d oracle

   Message Queues     key msqid owner perms used bytes messages

  [oracle@ocnsb oracle]$

  我这里的共享内存段只有一个 并且就是SGA的大小(shmid为 ) 这是因为shnmax设置太大的缘故

  [oracle@ocn kernel]$ more /proc/sys/kernel/shmmax        [oracle@ocn kernel]$

  接下来我们看看PMON信息 首先要找到pmon进程号 然后去 /proc/pid/maps 中看该进程的虚拟地址分配信息

  [oracle@ocnsb oracle]$ ps ef|grep pmon    oracle Jul ? : : ora_pmon_roocn     oracle Jul ? : : ora_pmon_ocn     oracle : pts/ : : grep pmon    [oracle@ocnsb oracle]$

  [oracle@ocnsb oracle]$ more /proc/ /maps    a ba r xp : /opt/oracle/products/ /bin/oracle    a ba ad rw p : /opt/oracle/products/ /bin/oracle    ad ae rwxp :

  这部分是oracle program装载信息 我们可以看到空间使用了 ae 这部分大小不足 MB

   r xp : /lib/ld so

  这是oracle 共享库装载的起点 x 正好是 g

   rw p : /lib/ld so    rw p :     r xp : /opt/oracle/products/ /lib/libodmd so    a rw p : /opt/oracle/products/ /lib/libodmd so    a r xp : /opt/oracle/products/ /lib/libskgxp so    a rw p b : /opt/oracle/products/ /lib/libskgxp so    a r xp : /opt/oracle/products/ /lib/libskgxn so    rw p d : /opt/oracle/products/ /lib/libskgxn so    d rw p :     d c r xp : /opt/oracle/products/ /lib/libjox so    c c rw p de : /opt/oracle/products/ /lib/libjox so    c e rw p :     e r xp : /lib/libdl so    rw p : /lib/libdl so    rw p :     r xp : /lib/libm so    rw p : /lib/libm so    r xp : /lib/libpthread so    d rw p e : /lib/libpthread so    d r xp : /lib/libnsl so    rw p : /lib/libnsl so    rw p :     r xp : /usr/lib/libaio so     rw p : /usr/lib/libaio so     ca r xp : /lib/libc so    ca cf rw p : /lib/libc so    cf d rw p :     d d r xp : /lib/libredhat kernel so     d d rw p : /lib/libredhat kernel so     d f rw p :     fa r xp : /lib/libnss_files so    rw p : /lib/libnss_files so    rw p : /dev/zero    c rw p :

  共享库消耗了不到 MB的空间

   b rw s : /SYSV a bdc (deleted)

  这是SGA的起点 x 表示 g

   b b r s b : /SYSV a bdc (deleted)    b b a rw s b : /SYSV a bdc (deleted)    b a b a r s b a : /SYSV a bdc (deleted)    b a b rw s b a : /SYSV a bdc (deleted)

  sga虚拟空间分配到这里 通过计算 进制数 正好和我们的SGA大小吻合 就是我们在ipcs查看的时候的 shmid

  bffe bffee rwxp ffff :     bfff bfff r xs : /dev/vsys

  由于 xc 正好是 g( 进制数c= * = x 表示 g) 则这里表示进程私有空间的分配的起点 查看oracle任何一个用户登陆进程也将发现这样的虚拟地址分配 在这里我们很容易看出来 oracle program 和共享内存库所占用的空间很小 没有必要给那么大 实际上 oracle program 给 M足够安全 而共享库给 M也足够安全了 也就是从理论上来讲 我们可以把oracle program所需要压缩在 x 以下 共享库所需要内存压缩在 x 以下 这样SGA的起点就可以提升到 x ( g) 而原来是从 x ( g)开始的 只有大约 g分配给SGA 现在从 g开始分配SGA则可以接近 g 比如分配 g内存给SGA 要实现这个功能 我们需要重新编译oracle program 降低共享库虚拟内存分配的地址和SGA的分配起点位置 x 这个共享库装载的起点 是由进程的mapped_base来决定的

  [oracle@ocnsb oracle]$ more /proc/ /mapped_base   

  这个大小是 G 则意味着共享库的装载从虚拟地址的 g位置开始 如果要降低这个地址 需要在oracle启动之前 也就是用root用户把将启动oracle的进程的mapped_base降低到 M 这样oracle启动之后的产生的进程都将继承这个值

  su root echo > /proc//mapped_base

  当然我们也可以通过一些shell来实现oracle用户登陆之后自动降低mapped_base的功能 这个在google上就能找到了 或者参考

  中文章内容如下

  Giving Oracle Users the Privilege to Change the Base Address for Oracle s Shared Libraries Without Giving them root Access

  As shown above only root can change the base address mapped base for shared libraries Using sudo we can give Oracle users the privilege to change mapped base for their own shells without giving them full root access Here is the procedure:

  su root

  # E g create a script called /usr/local/bin/ChangeMappedBase

  # which changes the mapped base for the parent process

  # the shell used by the Oracle user where the sudo program # is executed (forked) Here is an example:

  #/bin/sh

  # Lowering mapped base to x echo > /proc/$PPID/mapped_base

  # Make sure that owernship and permissions are correct chown root root /usr/local/bin/ChangeMappedBase

  chmod /usr/local/bin/ChangeMappedBase

  # Allow the Oracle user to execute /usr/local/bin/ChangeMappedBase via sudo echo oracle ALL=/usr/local/bin/ChangeMappedBase >> /etc/sudoers    Now the Oracle user can run /usr/local/bin/ChangeMappedBase to change mapped base for it s own shell:

  $ su oracle

  $ cat /proc/$$/mapped_base; echo

  $ sudo /usr/local/bin/ChangeMappedBase Password:

  # type in the password for the Oracle user account

  $ cat /proc/$$/mapped_base; echo $    When /usr/local/bin/ChangeMappedBase is executed the first time after an Oracle login sudo will ask for a password The password that needs to be entered is the password of the Oracle user account

  Changing the Base Address for Oracle s Shared Libraries Automatically During an Oracle Login

  The procedure in the previous section asks for a password each time /usr/local/bin/ChangeMappedBase is executed the first time after an Oracle login To have mapped base changed automatically during an Oracle login without a password the following can be done:

  Edit the /etc/sudoers file with visudo:

  su root visudo    Change the entry in /etc/sudoers from:

  oracle ALL=/usr/local/bin/ChangeMappedBase    to read:

  oracle ALL=NOPASSWD: /usr/local/bin/ChangeMappedBase    Make sure bash executes /usr/local/bin/ChangeMappedBase during the login process You can use e g ~oracle/ bash_profile:

  su oracle echo sudo /usr/local/bin/ChangeMappedBase >> ~/ bash_profile    The next time you login to Oracle the base address for shared libraries will bet set automatically

  $ ssh oracle@localhost

  oracle@localhost s password: Last login: Sun Apr : : from localhost

  $ cat /proc/$$/mapped_base; echo $

  SGA起点从 g降低到 g则需要重新编译oracle program 必须要强调的是 SGA的起点是和共享库的起点mapped_ase相关的 SGA的起点至少得大于共享库的起点 g以上才是安全的 否则数据库将不能启动或者崩溃

  关闭oracle    su oracle    cd $ORACLE_HOME/rdbms/lib

  修改共享库装载地址的文件定义

  genksms s x > ksms s

  编译好目标文件

  make f ins_rdbms mk ksms o

  重新编译oracle可执行文件    make f ins_rdbms mk ioracle

  至于 redhat linux AS 以上版本 oracle的VLM的使用则也是比较简单的了 参考       

  当然 internet上还有更多文章可以供参考

  在这里我要指出一个问题 也是我们在实践中遇到的一个问题 那就是 若SGA分配的很大 但没有使用VLM 几乎很靠近 g的时候 大约只留下 m左右 这样当一个进程进行hash join 由于我们的pga_aggregate_target设置为 g oracle默认单个进程使用PGA可以达到pga_aggregate_target * % = M 则使得在进行hash join的时候出错

  ORA : out of process memory when trying to allocate bytes (hash join subh kllcqas:kllsltba)

cha138/Article/program/Oracle/201311/16567

相关参考

知识大全 JAVA拦截器原理及Struts2扩展

JAVA拦截器原理及Struts2扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近发现很

知识大全 oracle中SGA的设置

oracle中SGA的设置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  关于SGA设置的一点总

放射自显影技术的原理根据是什么?为何常用H3、C14、P32标记物做放射自显影?

(一)原理根据:  放射性同位素发射出的各种射线具有使照相乳胶中的溴化银晶体还原(感光)的性能。利用放射性物质使照相乳胶膜感光,再经显影以显示该物质自身的存在部位。  (二)用H3、C14、P32标记

知识大全 Oracle内存结构:SGA的区域信息

Oracle内存结构:SGA的区域信息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SGA的区

知识大全 修改oracle的SGA区大小

修改oracle的SGA区大小  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  备份数据库  关机

知识大全 查看SGA区剩余可用内存的方法

查看SGA区剩余可用内存的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SQL>co

知识大全 关于SGA设置的一点总结

关于SGA设置的一点总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本总结不针对特例仅对服务

知识大全 Oracle诊断案例2 -SGA与Swap

Oracle诊断案例2-SGA与Swap  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  案例描述

64S型继电半自动闭塞为什么在TCJ电路中加入SGA的第一组和第二组接点?

  在设备故障不能办理正常到达复原时,需拉出SGA办理事故复原。在拉出SGA后,TCJ吸起,然后DDJ吸起并自闭。电路中将SGA的两组接点串联加入是因为此时DDJ吸起的必要条件是SGA第一组接点接通,

64S型继电半自动闭塞为什么在TCJ电路中加入SGA的第一组和第二组接点?

  在设备故障不能办理正常到达复原时,需拉出SGA办理事故复原。在拉出SGA后,TCJ吸起,然后DDJ吸起并自闭。电路中将SGA的两组接点串联加入是因为此时DDJ吸起的必要条件是SGA第一组接点接通,