2009年2月21日星期六

Linux下,安装oracle 10gR2的准备工作(二)

六、配置内核参数
具体需要的参数参见:http://download.oracle.com/docs/cd/B19306_01/install.102/b15660/pre_install.htm#sthref264
输入命令查看内核参数的值:/sbin/sysctl -a
如果内核参数的值与要求的值不通,可以使用下面的方法来进行修改:
使用文本编辑器,创建或编辑/etc/sysctl.conf,对相应的值进行修改。
注:如果当前值比要求的值要大,那就使用较大的值
当我们指定了/etc/sysctl.conf文件中参数的值,重启系统后,该值仍然存在(they persist)
为oracle用户设定shell限制
为了提高系统中软件的性能,我们必须为oracle用户增加shell限制:
最大数量的打开文件说明词(the maxmum number of open file discriptors),在limits.conf文件中的条目(item)是nofile,硬限制(hard limit)是65536
对某一个用户的最大可用进程数(maximum number of processes available to a single user),在limits.conf文件中的条目是nproc,硬限制为16384
为了增加这些shell限制:
将下面这几行添加到/etc/security/limits.conf文件中:
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
在/etc/pam.d/login文件中,添加或修改以下行:
session required /lib/security/pam_limits.so
session required pam_limits.so
根据oracle用户的默认shell,将下面的内容,添加进默认的shell启动文件:
添加进文件/etc/profile
fi [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh"]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

七、确定需要的软件目录
1、oracle基础目录(oracle base directory)
oracle基础目录是oracle软件安装的最高级的目录,类似在WINDOWS环境下的C:/ORACEL目录,在linux环境下,建议使用跟下面这个类似的目录:
/mount_point/app/oracle_sw_owner
在这个例子中:
mount_point是将要包含oracle软件的文件系统的挂载点目录
oracle_sw_owner是oracle软件拥有者的系统用户名,例如oracle
注:women可以为多个安装使用同一个oracle基础目录,或者我们可以为每个安装创建单独的目录。但是如果在同一个系统中,使用不同的用户名进行安装,每个用户必须创建单独的oracle基础目录。下面的例子可以同时存在同一系统中:
/u01/app/oracle
/u01/app/orauser
/opt/oracle/app/oracle
注:不管我们是创建一个oracle基础目录还是使用一个已经存在的,我们必须将ORACLE_BASE环境变量的值设定为该目录的完全路径。
2、oracle存盘目录(oracle inventory directory)
oracle存盘目录(oraInventory)存储了系统中安装的所有软件的目录,它被所有oracle软件共享,所有oracle软件都会请求这个 目录。第一次安装时,OUI会提示指定这个目录,oracle建议使用路径:oracle_base/oraInventory
OUI会为自动创建我们指定的目录,并为它分配正确的用户、组和权限。
注:所有的oracle软件都会依赖这个目录,应该经常备份这个目录。此外除非已经完全删除了所有oracle软件,否则不要删除这个目录
3、oracle主目录(oracle home directory)
oracle主目录,是我们选择安装某个oracle产品的目录。我们必须将不同的oracle产品或者相同oracle产品的不同版本安装到不同的目录 中。当我们运行OUI的时候,它会提示我们指定一个目录。这个目录必须是oracle基础目录的子目录。oracle要求我们使用类似下面的目录作为 oracle主目录:oracle_base/product/10.2.0/db_1
OUI会创建我们指定的目录,并且为其设置正确的用户、组、权限。
注:在安装的过程中,我们不能将一个已经分配了权限的已经存在的目录,作为oracle的主目录。如果我们这么做了,在安装的过程中,会由于用户所有权限的问题发生错误。

八、确认或创建oracle基础目录
我们可以选择创建一个oracle基础目录,即使其他oracle基础目录已经存在
1、确认一个已经存在的oracle基础目录
已经存在的oracle基础目录可能不是我们建议的目录,如果确认有一个已经存在的oracle存盘目录或者oracle主目录,我们就可以使用下面的方法确认到oracle的基础目录:
确认一个已经存在的oracle存盘目录,输入下面的命令来查看oraInst.loc文件的内容:
more /var/opt/oracle/oraInst.loc
如果oraInst.loc文件存在,那么这个命令的输出类似下面:
inventory_loc=/u01/app/oracle/oraInventory
inst_group=oinstall
inventory_loc参数指定了oracle存盘目录(oraInventory),oraInventory目录的父目录就是一个典型的oacle基础目录。在这个例子中,/u01/app/oracle就是一个基础目录。
确定已经存在的oracle主目录
输入下列命令来查看oratab文件的内容:
more /etc/oratab
如果oratab文件存在,它还包含类似下面的这些行:
*:/u03/app/oracle/product/10.2.0/db_1:N
*:/opt/orauser/infra_904:N
*:/oracle/9.2.0:N
每一行的目录路径指定了一个oracle主目录。如果某个你想使用的oracle软件拥有者的名字,在某个目录路径的末尾,那这个路径就是一个可用的路径。如果我们打算以oracle用户进行安装,那么我们可以使用下面这两个目录中的一个:
/u03/app/oracle
/oracle
注:如果可能,选择类似第一个的路径(/u03/app/oracle),这个符合规范。
在决定使用一个已经存在的oracle基础目录进行安装以前,必须确认它满足以下条件:
它不应该与操作系统在同一个文件系统中
它必须有足够的磁盘空间:如果基础目录只安装软件文件,它至少应该有3G;如果这个目录同时装有软件文件和数据文件,那么要求至少为4G。
注:在生产数据库中,不建议将数据文件和软件文件装到通一个目录下。
使用命令:df -h oracle_base_path,来查看文件系统中的剩余空间。
如果我们想使用一个已经存在的oracle基础目录,我们可以配置oracle的用户环境,并将ORACLE_BASE环境变量的值指向我们选择的目录。
如果oracle基础目录不存在,我们想创建一个,那么按照下面的介绍。
2、创建一个oracle基础目录
在创建以前,首先要确认有足够的磁盘空间,具体需求按照上面所述。
确认合适的文件系统:
使用df -h 命令查看每个被挂在的文件系统上的剩余磁盘空间
找到一个有合适空闲空间的文件系统,这个文件系统必须是一个本地的文件系统或者一个集群文件系统或者是一个在一个被确认(certified)NAS设备上的NFS文件系统。
记录你想使用的文件系统的挂载点的名字。
创建oracle基础目录,指定正确的拥有者,并且赋予合适的权限:
使用下面的命令来创建要求的子目录,并且确定合适的拥有者、组、以及权限:
mkdir -p /mount_point/app/oracle_sw_owner
chown -R oracle:oinstall /mount_point/app/oracle_sw_owner
chmod -R 755 /mount_point/app/oracle_sw_owner
例如:指定挂载点为/u01,oracle软件的所有者的用户名为oracle,那么我们建议的目录路径为:/u01/app/oracle
然后当配置oracle的用户环境变量时,将ORACLE_BASE环境变量指向我们创建的oracle基础目录。

九、选择数据库文件和恢复文件的存储选项
oracle数据库文件包括:数据文件、控制文件、重做日志文件、服务器参数文件和密码文件
对所有的安装而言,我们必须为数据库文件选择存储选项。如果我们想使用为安装使用自动备份功能,那么我们还必须为我们想使用的恢复文件(即flash recovery area),不必为每个文件类型使用相同的存储选项(即可以使用相同的,也可以使用不同的)。
数据库文件支持的存储选项有:文件系统(file system)、自动存储管理(automatic storage management)、裸设备(raw device)
恢复文件支持的存储选项有:文件系统、自动存储管理,但是不支持裸设备
选择存储选项时的建议:
我们可以为每个文件类型选择它所支持的储存选项的任意组合
oracle建议我们为数据库文件和恢复文件选择自动存储管理

十、为数据库文件和恢复文件创建目录
1、选择文件系统来放置数据库文件
如果选择将数据库文件放到文件系统中:
OUI建议的默认路径是oracle基础目录的子目录,为了提高可用性和可靠性,建议使用一个做过RAID的设备。
如果想使用多个文件系统,那么需要为连接到数据库的每个单独的物理磁盘选择文件系统
如果想在安装过程中创建一个预配置的数据库,那么我们选择的这个文件系统必须至少有1.2GB的剩余空间。对生产数据库而言,必须根据实际需要选择空间的大小,以满足实际需要
为了优化性能,我们选择的文件系统必须在一个只被数据库使用的物理设备上。
此外,还必须保证oracle用户拥有对这个目录的写权限。
2、选择文件系统来放置恢复文件
只有在安装过程中启用了自动备份,我们才必须为恢复文件选择一个存储区域。
为了防止由于磁盘的损坏导致数据库文件和恢复文件都不可用,我们建议将数据库文件和恢复文件放到不通的物理磁盘上。
我们选择的文件系统必须有至少2GB的空余磁盘。
这个磁盘空间需求,是为flash 恢复区域分配的默认磁盘限额,是由DB_RECOVERY_FILE_DEST_SIZE初始化参数指定的。
如果你选择自定义安装类型或者增强型数据库配置选项,那么我们可以指定不同的磁盘配额值。在创建了数据库以后,我们可以使用oracle企业管理网格控制活数据库控制指定不同的值。
OUI为flash恢复区域分配的默认路径,建议选择oracle基础目录的子目录,在生产环境下不应该选择默认路径。
oracle用户必须有向我们指定的路径中写文件的权限。
3、创建需要的目录
为数据库文件和恢复文件,在单独的文件系统上创建目录,最好是在oracle 基础目录下:
使用df -h命令来查看每个被挂载的文件系统的剩余磁盘空间
对数据库文件而言,可以选择一个至少有1.2GB剩余磁盘空间的单独的文件系统,或者选择几个文件系统,这几个文件系统的剩余磁盘空间的总和为1.2GB。
对恢复文件而言,选择一个至少2.4GB剩余空间的文件系统。
如果想在一个文件系统中,安装不止一种类型的文件,那么将这些需要的磁盘空间加起来(即需要1.2G+2.4G)
记录我们想使用的文件系统的目录的挂载点
输入类似下面的命令,来创建需要的子目录,并为其设置合适的用户、组、以及权限:
数据库文件目录:
mkdir /mount_point/oradata
chown oracle:oinstall /mount_point/oradata
chmod 775 /mount_point/oradata
恢复文件目录(flash recovery area):
mkdir /mount_point/flash_recovry_area
chown oracle:oinstall /mount_point/flash_recovery_area
chmod 775 /mount_point/flash_recovery_area

Linux下,安装oracle 10gR2的准备工作(一)

一、检查硬件需求
至少有1024MB的物理内存
SWP空间的大小:
如果内存为1024MB到2048MB大小,则SWAP空间至少为1.5倍的内存大小
如果内存为2049MB到8192MB大小,则SWAP空间至少与内存大小相同
如果内存大于8192MB,那么SWAP空间至少为内存的0.75倍
/tmp目录下至少有400MB的磁盘空间
为oracle预留1.5GB到3.5GB磁盘空间,根据安装类型不同
为使用文件系统存储的预配置的数据库保留1.2GB的磁盘空间
这步中用到的命令有:
1、查看物理内存大小:grep MemTotal /proc/meminfo
2、查看配置的SWAP空间的大小:grep SwapTotal /proc/meminfo
3、查看/tmp目录下,可用的磁盘空间:df -k /tmp
如果/tmp目录下的磁盘空间不够,可以使用以下步骤:从/tmp目录中删除不必要的文件以满足空间需求;在设置oracle用户的环境时,设置TMP和TMPDIR环境变量;扩展包含/tmp目录的文件系统
4、查看系统中的空闲磁盘空间:df -k
5、查看处理器的类型,以安装正确的版本:grep "model name" /proc/cpuinfo

二、检查软件需求
1、查看操作系统的版本:cat /etc/issue
2、产看操作系统的内核版本:uname -r
3、查看需要的安装包时候已经被正确的安装:rpm -q package_name

三、检查网络配置
一般情况下,安装数据库的电脑已经被连接到了网络,有本地的存储,有显示器,有CD-ROM或者DVD驱动器。
1、配置名字解析
当我们运行OUI(oracle universal installer)的时候,如果名字解析没有被设置,可能会报错。为了避免这个错误,在开始安装前,我们要确定,主机名仅仅通过/etc/hosts文件来被解析
为了确认主机名只通过/etc/hosts文件来解析:
通过检查nsswitch.conf文件中的主机文件条目,来查看/etc/hosts文件时候被用于名字解析:
cat /etc/nsswitch.conf | grep hosts
使用hostname命令来确认,主机名已经被设置:hostname;命令的输出应该类似:myhost.mycount.com
使用domainname命令,来确认域名没有被动态设置:domainname;使用这个命令应该不输出任何结果
确认主机文件包含完整主机名(fully qualified host name),可以使用如下命令:cat /etc/hosts | grep 'eval hostname'
这个命令的输出应该包含一个本地主机的完整主机名。例如:
192.168.100.16 myhost.us.mycompany.com myhost
127.0.0.1 localhost localhost.localdomain
如果主机文件中没有包含完整主机名,那么打开这个文件,做必要的修改。
2、在多网卡的电脑上安装(installing on multihomed computers)
因为改电脑上绑定了多个IP,每个IP地址对应了一个主机名,此外,我们可以为主机名设置别名。默认情况下,OUI使用ORACLE_HOSTNAME环境变量的设置来寻找主机名,如果在多网卡的电脑上安装oracle,同时没有设置ORACLE_HOME,这个时候,OUI会将/etc/hosts文件中的第一个条目作为主机名。
注:必须保证,客户端能够通过主机名或者是主机名的别名来访问到电脑,可以通过从客户端电脑上使用短名字(仅仅主机名)和全名(主机名和域名)来ping服务器,这个两种都应该是成功的。
使用下面的方法来设置ORACLE_HOSTNAME环境变量:
例如,如果完整主机名(fully qualified hostname)是somehost.us.acme.com,那么输入下面的命令:
ORACLE_HOSTNAME=somehost.us.acme.com
export ORACLE_HOSTNAME
注:如果一个电脑只有一个IP地址,但是有多个别名,名字解析服务会将这些别名中的任何一个解析到同一个电脑上,在这种电脑上安装数据库之前,将ORACLE_HOSTNAME环境变量设置成我们想使用的主机名。

四、创建需要的操作系统用户组和用户
根据是否是第一次在这个系统上安装数据库,我们可能需要创建几个用户组和用户:
OSDBA用户组(dba):如果是第一次在这个系统上安装数据库,我们必须创建这个用户组,它定义了拥有数据库管理权限(SYSDBA权限)的用户账户。这个组的默认名字是dba。如果我们想自定义组名,而不是使用默认的组名,我们必须选择自定义安装类型,来安装软件,或者使用一个不是dba用户组(即非默认用户组)的用户,来打开OUI。在这种情况下,OUI会提示你指定这个组的组名。
OSOPER用户组(oper):这是一个可选的组,如果我们想创建一个拥有某些被限制了的数据库管理权限(SYSOPER权限)的用户组。默认情况下,OSDBA用户组中的成员也拥有OSOPER权限。
没有权限的用户(unprivileged user):必须确认有无权限用户nobody的存在,并且在安装完成以后,必须保证这个nobody用户拥有外部工作的运行能力(the nobody user must own the extenal jobs executable)
接下来创建安装时使用的操作系统用户组和用户:
oracle目录组(the oracle inventory group oinstall):如果第一次安装数据库,那必须创建这个用户组。这个用户组通常的名字是oinstall,这个组拥有oracle的详细目录(inventory),这是安装到系统中的所有oracle软件的目录(catalog)
注:如果系统中已经安装了oracle软件,已经存在的oracle目录组必须是我们用来安装新oracle软件的主要用户组。
oracle软件拥有着用户(一般是oracle):第一次安装oracle软件时,必须创建这个用户。这个用户是在安装过程中,所有安装软件的所有者。这个用户必须将oracle目录组作为自己的主组,它也必须使用OSDBA和OSOPER组作为自己的非主组(secondary group)
注:在第一次安装完成以后,我们可以使用相同的oracle目录组来进行别的oracle软件的安装,也可以创建别的用户组来进行安装。我们可以为系统中的每个数据库创建一个用户组,也可以为系统中的所有数据库创建同一个用户组来进行安装。
1、创建oracle目录组(oracle inventory group)
在系统中第一次安装oracle软件时,OUI会创建oraInst.loc文件,这个文件定义了oracle目录组的名字以及oracle目录的路径(oracle inventory directory)。使用命令:more /etc/oraInst.loc来检查oracle目录组是否存在。如果这个命令的输出显示了oinstall组名,那么这个组已经存在。如果oraInst.loc文件已经存在,那么这个命令的输出类似:
inventory_loc=/u01/app/oracle/oraInventory
inst_group=oinstall
inst_group参数的值显示了oraclen inventory 组的名字是oinstall
如果oraInst.loc文件不存在,使用下面命令创建oracle inventory用户组:
/usr/sbin/groupadd oinstall
2、创建OSDBA用户组
在下面情况(circumstances)下,我们必须创建一个OSDBA用户组:
不存在OSDBA用户组,例如这是我们第一次安装数据库软件
OSDBA用户组存在,但是我们想在一个新的安装过程中,给操作系统的另一个用户组数据库管理权限。
如果OSDBA用户组不存在,我们需要创建一个用户组,使用下列命令,除非dba用户已经存在,否则应该使用dba作为OSDBA用户组的组名:/usr/sbin/groupadd dba
3、创建OSOPER用户组(可选)
如果我们想创建一个用户部分数据库管理权限(a limited set of database administrative privilege (SYSOPER operator privilege))的用户组时,我们可以创建OSOPER用户组。对大部分的安装而言,只创建OSDBA组,是比较有效率的。如果我们想使用OSOPER用户组,一般在下面情况下,需要创建OSOPER用户组:
如果一个OSOPER用户组不存在,例如,这是第一次在系统上安装数据库软件
如果一个OSOPER用户组存在,但是我们想在一个新的ORACLE安装过程中,给别的用户组数据库操作权限。
如果需要一个新的OSOPER用户组,使用下列命令创建,同样的,应该使用oper作为组名,除非这个名字已经被占用:/usr/sbin/groupadd oper
4、创建oracle软件拥有者用户
在下列情况下,我们必须创建oracle软件拥有者用户:
如果oracle软件拥有者用户不存在,例如这是我们第一次安装
如果oracle软件拥有者用户存在,但想在一个新的oracle安装过程中使用不同的用户。
为了检查oracle软件拥有者用户oracle是否存在,输入命令:id oracle
如果oracle用户存在,那么这个命令的输出会类似下面的情况:
uid=440(oracle) gid=200(oinstall) groups=201(dba),202(oper)
如果用户存在,决定是否想使用已经存在用户或者重新创建一个oracle用户。如果想使用已经存在的用户,确定这个用户的主组是oracle inventory用户组,并且这个用户是OSDBA和OSOPER用户组的一员。
注:在修改一个已经存在的用户的时候,要确认不要产生其他的问题。
创建一个oracle软件拥有者用户:
如果该用户不存在,我们需要创建一个新的oracle软件拥有者用户,尽量使用oracle作为用户名,除非已经存在。
创建oracle用户,输入以下命令:
/usr/sbin/useradd -g oinstall -G dba[,oper] oracle
注:因为oper是可选的。这个命令可以为:
/usr/sbin/useradd -g oinstall -G dba oracle 或
/usr/sbin/useradd -g oinstall -G dba,oper oracle(多个值时,用逗号进行分隔)
注:-g选项制定主组。-G指定非主组(secondary group)
为oracle用户设定密码:passwd oracle
修改oracle软件拥有者用户
如果oracle用户存在,但是它的主组不是oinstall,或者它不是OSDBA或者OSOPER组的一员,我们可以使用命令来进行修改:
/usr/sbin/usermod -g oinstall -G dba[,oper] oracle
五、确认用户nobody的存在
1、在安装软件前,确认nobody用户的存在:
使用命令:
id nobody
来确认该用户是否存在,如果这个命令的输出中有关于这个用户的信息,那么不必创建这个用户
2、如果nobody用户不存在,那么使用下面的命令来创建:
/usr/sbin/useradd nobody

2009年2月19日星期四

内存结构memory architecture

oracle在内存中存储以下信息:
程序代码
已连接的会话(session)信息,包括当前活动(active)的及非活动的会话
程序执行过程中所需的信息(例如:某个查询的状态)
需要在oracle进程间共享并进行通信的信息(例如锁信息)
数据文件内数据的缓存(例如:数据块data block及重做日志条目redo log entry)
oracle中的基本内存结构包括:
系统全局区system global area SGA:此区域由所有的服务进程(server process)和后台进程(background process)共享。
程序全局区program global area PGA:此区域是每个服务进程和后台进程所私有的,即每个进程都有一个属于自己的PGA。
oracle的基本内存结构还包括软件代码区(software code area)
一、系统全局区概述overview of the system global area
系统全局区(system global area SGA)是一组包含了oracle数据库数据及实例控制信息的共享的内存结构。当多个用户并发地连接到同一个实例后,这些用户将共享此实例SGA中的数据。因此SGA也被称为共享全局区(shared global area)
oracle实例是由SGA及oracle进程两部分组成的。当用户启动实例时,oracle将自动地为SGA分配内存,当用户关闭实例时,由操作系统负责回收内存。每个实例都有自己的SGA。
SGA是可读写的。当用户连接到一个多进程数据库实例(multiple-process database instance)后能够读取此实例SGA中的信息,有些进程在oracle执行期间可以向SGA中写入信息。
SGA中包含以下数据结构:
数据缓存区database buffer cache
重做日志缓冲区redo log buffer
共享池shared pool
JAVA池java pool
大型池large pool (可选的)
数据流池streams pool
数据字典缓存区data dictionary cache
其他杂项信息
SGA中还包含了数据库及实例的状态信息,供后台进程使用。这部分内容被称为固定SGA(fixed SGA)。用户数据不会存储在这个区域内。SGA中还包含需要在oracle进程间进行交换的信息(例如锁信息)
如果数据库运行在共享服务模式(shared server architecture)下,SGA中还要包含请求与应答队列,以及PGA中的一些信息。
1、初始化参数SGA_MAX_SIZE the SGA_MAX_SIZE Initialization Parameter
SGA中包含了多个内存组件(component),每个组件都可以被看作一个内存池,用于满足特定类型的内存分配请求。所有SGA组件都是以预设的雷杜(granule)为单位进行内存的分配(allocate)和回收(deallocate)的。oracle通过记录每个SGA组件使用的粒度单位的数量来掌握整个SGA的内存使用情况。
粒度单位的大小是由整个SGA的容量决定的。
用户可以设定oracle数据库实例的SGA能够使用的内存总数量。oracle在启动一个实例之初只会为此实例分配最小所需的内存,而在实例运行期间可以通过扩展各个SGA组件来为实例提供更多内存,SGA所使用内存的上限由SGA_MAX_SIZE初始化参数决定。在实例初始化时,如果初始化参数文件(initialization parameter file)或服务器参数文件(server parameter file)中的SGA_MAX_SIZE的值小于oracle为SGA组件分配的内存之和(为SGA各组件分配的内存数量是依据参数文件中的显式(explicitly)设定值或系统默认值),oracle将忽略SGA_MAX_SIZE参数。
注:为了优化系统性能,整个SGA的容量应该与实际需要的内存数量相符,如果系统内存太小,SGA会需要使用虚拟内存(virtual memory),数据库的系统性能将显著下降。因为此时操作系统需要对SGA中的部分内容进行分页(page)(即在磁盘上进行读写操作)。SGA中各个内存组件的容量会对数据库系统的性能有所影响。
SGA容量是由多个初始化参数决定的。主要参数有:
DB_CACHE_SIZE:标准容量数据块(standard block)使用的缓存区的容量
LOG_BUFFER:重做日志缓冲区(redo log buffer)的容量,以字节(byte)为单位
SHARED_POOL_SIZE:存储共享SQL及PL/SQL的内存容量,以字节为单位
LARGE_POOL_SIZE:大型池(large pool)的容量,默认值为0
JAVA_POOL_SIZE:JAVA池(Java pool)的容量
2、共享全局区自动管理
在oracle 10g中,只需要使用SGA_TARGET参数指定实例可以使用的SGA总量即可,oracle能够自动地将内存分配给SGA的各个子组件,以提高内存使用效率。
注:在10g中,SGA_TARGET参数涵盖了SGA的全部内存,在启动时,如果SGA_TARGET参数的值超过了SGA_MAX_SIZE,后者将会被忽略。
注:SGA_TARGET参数不能动态设置,只能在数据库启动时设置。
3、修改及查询SGA内存组件容量adding granules(粒度) and tracking component size
可以使用ALTER SYSTEM 语句修改初始化参数中的相关值来改变SGA中各组件占用的SGA容量。oracle将用户设定的值向上(增大)修正为与其最接近的16M的倍数,并增加或减少内存组件中的粒度单位(granule),使其容量达到用户设定的要求。我们应该保证系统具备足够的内存以满足内存分配请求。只要当前SGA内存容量小于SGA_MAX_SIZE参数的限制,oracle就能为SGA分配更多的内存。
SGA各个内存组件当前使用的粒度单位的大小可以通过V$SGAINFO视图进行查询。各个内存组件当前容量及最近一次修改变量操作的类型和时间可以通过V$SGA_DYNAMIC_COMPONENTS视图进行查询。oracle还维护着一个先进先出的缓冲区(circular buffer),其中记录了最近400次调整SGA内存组件容量的操作。可以通过V$SGA_RESIZE_OPS视图来查询这个缓冲区。
注:如果为内存组件设置的容量不是粒度单位(granule)的整数倍,oracle会将其向上(增大)修正为与其最接近的粒度单位的整数倍。
三、程序全局区概述overview of the program global areas
程序全局区(program global area PGA)是供服务进程(server process)存储数据及控制信息的内存区域。这是一种在服务进程启动时由oracle创建的非共享的内存区。只有服务进程才能访问属于它的PGA,而对PGA的读写操作是由oracle代码实现的。一个oracle实例中为所有服务进程分配的PGA内存也被称为此实例的合计PGA(aggregated PGA)。
1、PGA的内容
PGA内存中存储的内容依据实例服务进程的模式有所不同。但是通常来说,PGA中包含以下内容
私有SQL区(private SQL area):私有SQL区中包含绑定信息(bind information)及运行时内存结构(runtime memory structure)等数据。每个提交了SQL语句的会话都会有一个私有SQL区。每个提交了相同的SQL语句的用户都有自己的私有SQL区,但它们使用同一个共享SQL区(shared SQL area)。即多个私有SQL区可以和同一个共享SQL区相联系。
2、SQL工作区
对于复杂的查询来说(例如,决策支持系统的查询decision-support queries),运行时区域(run-time area)的大部分容量均供需要占用大量内存的操作创建工作区(work area)只用。这些操作包括:
需要进行排序的操作(order by/group by/rollup/window function)
哈希连接(hash-join)
位图融合(bitmap merge)
位图创建(bitmap create)
用户可以对工作区的容量进行控制与调优。一般来说,更大的工作区能够显著提高SQL操作的性能,但是会消耗更多的内存。最理想的情况是,工作区能够容纳SQL语句的全部输入数据及额外的控制内存结构。否则语句的响应时间将增加,因为部分输入数据必须放入临时磁盘区。在极端情况下,如果工作区容量远小于输入数据,那么输入数据需要在临时磁盘区与工作区间多次交换。这会显著地增加SQL操作的响应时间。
3、专用服务模式下的PGA内存管理PGA memory management for dedicated mode
SQL工作区所占的容量可以被统一地且自动的管理。我们只需要设定PGA_AGGREGATE_TARGET初始化参数就能设定一个oracle实例使用的全部PGA容量。此参数的值针对整个实例,oracle将保证所有数据库服务进程使用的全部PGA内存不超过此参数限制。
设定了PGA_AGGREGATE_TARGET参数后,专用服务模式下创建的全部会话所使用的工作区的容量将会被自动地调整。
oracle提供了固定视图(fixed view)供用户查询PGA内存的统计信息。在设置了PGA_AGGREGATE_TARGET参数后,oracle开始收集关于PGA的统计信息。
与工作区内存分配及相关使用的统计信息可以从以下动态性能视图(dynamic performance view)中查询:V$SYSTAT,V$SESSTAT,V$PGASTAT,V$SQL_WORKAREA,V$WORKAREA_ACTIVE
V$PROCESS视图中的以下三列记录了分配给oracle进程使用的PGA内存的情况:PGA_USED_MEM,PGA_ALLOCATED_MEM,PGA_MAX_MEM
注:专用服务器(dedicated server)与共享服务器(shared server)所分配的工作区都可以采用自动PGA内存管理模式。
四、软件代码区software code areas
软件代码区是用于存储可运行的或正在运行的程序代码的内存空间。oracle系统程序的代码也存储在软件代码区,但其在此区域内的位置与用户程序完全不同,系统程序代码所在的位置更独立,且保护更严密。
软件代码区是只读的。