在oracle9i以前的版本中,你只能在启动数据库的时候控制oracle使用的unix内存。oracle提供了一些init.ora参数来检测系统全局区(system global area,sga)的ram大小。一旦启动了数据库,你将不能再改变sga的大小和配置。
oracle向一个24/7数据库迈进的目标,提出了调整unix内存区的大小而不必停止和重启数据库的要求。更重要的是,oracle9i的动态sga特性允许你监控sga内的物理内存使用,并根据现有的oracle数据库的需求调整sga内存区域。
oracle9i还加入了一项新的内存管理技术,使得你能够为所有的程序全局区(program global area,pga)预分配内存,并允许oracle按照各类连接的不同需求为各连接分配内存。这是对传统oracle数据库的一项相当激进的更改,而且使得sort_area_size和其他pga参数被废弃。
不仅要分配sga,oracle9i dba还必须担负为unix oracle服务器分配所有内存的责任,同时还要为unix的管理需要预留20%的内存。
在oracle9i之前的版本中,同时拥有数个init.ora参数文件并不罕见,因为这样可以方便地调整数据库并重新配置sga以改变运行模式。比如,为在线事务处理(online transaction processing,oltp)而分配的sga和oracle数据仓库处理模式的有很大不同。
oracle推荐为oltp数据库和决策支持系统(decision support system,dss)应用程序——如oracle数据仓库——使用不同的内存配置方案。oltp系统应该将unix内存的大部分分配给sga,而数据仓库和dss应用程序对内存较为敏感,则应分配大部分内存给pga连接。
当然,如果一个数据库会以两种方式运作,你可以运行一个脚本来动态改变内存分配。例如,如果一个数据库在白天以oltp模式运行,而在晚上以dss模式运行,那么你可以运行一个脚本从sga中拿些内存出来,重新分配到pga区域。
alter system set sga_memory_max = 3g;
alter system set pga_aggregate_target = 3g;
在oracle9i中,oracle提供了增加或减少sga内存以下部分大小的能力:
data buffer size - alter system set db_cache_size=300m;
shared pool size - alter system set shared_pool_size=200m;
total pga ram memory size - alter system set pga_aggregate_target=2000m;
在unix上,oracle通过修改unix内存区的物理地址空间来达到动态内存分配的目的。你在unix上用malloc()和free()命令就能做到。
新的动态sga特性使得oracle sga可以以一个较小的容量开始,并根据需要逐渐增加。为了便利这个过程还提供了一个新的sga_max_size参数。
新闻热点
疑难解答