首页 > 数据库 > Oracle > Oracle 数据库参数调整
每个Oracle数据库都是由实例(Instance)与数据库(datafiles,controlfiles、redologfiles)组成,其中所谓实例就是用户同数据库交互的媒介,用户通过与一个实例相连来操作数据库。而实例又是由统一的内存结构(SGA,PGA,UGA)和一批内存驻留进程组成。实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识,它们两个的值是相同的。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),构成了Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的 进程结构,内存区域和后台进程合称为一个Oracle实例。
Oracle的内存配置与oracle性能息息相关。关于内存的配置,是最影响Oracle性能的配置。内存还直接影响到其他两个重要资源的消耗:CPU和IO。
[@more@]1. SGA 和 PGA
先来看看初始化参数:
SQL> SHOW PARAMETER SGA;
NAME TYPE VALUE
-------------------- ----------- -----------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 584M
sga_target big integer 584M
SQL> col name format a30;
SQL> col value format a15;
SQL> col sys_mode format a20;
SQL> SELECT NAME , VALUE , ISSYS_MODIFIABLE "SYS_MODE" FROM V$PARAMETER WHERE NAME LIKE '%sga%';
NAME VALUE SYS_MODE
---------- --------------- --------------------
sga_max_size 612368384 FALSE
pre_page_sga FALSE FALSE
lock_sga FALSE FALSE
sga_target 612368384 IMMEDIATE
SQL> SHOW PARAMETER PGA;
NAME TYPE VALUE
------------------------------------ ----------- -----------
pga_aggregate_target big integer 194M
SQL> SELECT NAME , VALUE, ISSYS_MODIFIABLE "SYS_MODE" FROM V$PARAMETER WHERE NAME LIKE '%pga%';
NAME VALUE SYS_MODE
-------------------- --------------- --------------------
pga_aggregate_target 203423744 IMMEDIATE
如果ISSYS_MODIFIABLE返回的值为FALSE,则表示该参数修改后需要重启数据库,而且不能使用ALTER SYSTEM 语句动态修改,SGA_MAX_SIZE 是不可以动态调整的。
一般我们是在安装之后设置SGA和PGA,因为SGA_MAX_SIZE是非动态参数,修改之后需要重启数据库,所以我们可以把SGA_MAX_SIZE设置大一些,SGA_TARGET是动态的,可以根据需要进行调整,这个主要根据业务的命中率来调整。SGA_TARGET的调整必须小于等于SGA_MAX_SIZE,当设置小于SGA_MAX_SIZE时,重启后SGA_TARGET自动调整等于SGA_MAX_SIZE。对于OLTP系统SGA和PGA一般将SGA_MAX_SIZE设置为物理内存的40%-60%,PGA一般设置为物理内存的20%左右,这个具体需要根据业务需求来设置。
参数可以在pfile里修改,也可以通过命令直接修改。
alter system set pga_aggregate_target=2g scope=spfile sid='tangyun';
--动态(根据连接数来调整)
alter system set sga_max_size=4g scope=spfile sid='tangyun';
--静态(根据主机内存大小来调整)
alter system set sga_target=4g scope=spfile sid='tangyun';
--动态,根据主机内存大小来调整,不能超过sga_max_size的值,一般设跟sga_max_size一样大,不然浪费内存资源)
以上都是针对Oracle 10g 版本的。 如果是9i的话,还需要对每个参数进行配置,如Share Pool,DB buffer,Java Pool,redo log buffer等。
2. 调整processes、sessions、db_files、open_cursors参数
SQL> SELECT NAME , VALUE , ISSYS_MODIFIABLE "SYS_MODE" FROM V$PARAMETER WHERE NAME ='sessions';
NAME VALUE SYS_MODE
------------------------------ --------------- --------------------
sessions 170 FALSE
SQL> SELECT NAME , VALUE , ISSYS_MODIFIABLE "SYS_MODE" FROM V$PARAMETER WHERE NAME ='processes';
NAME VALUE SYS_MODE
------------------------------ --------------- --------------------
processes 150 FALSE
SQL> SELECT NAME , VALUE , ISSYS_MODIFIABLE "SYS_MODE" FROM V$PARAMETER WHERE NAME ='open_cursors';
NAME VALUE SYS_MODE
------------------------------ --------------- --------------------
open_cursors 300 IMMEDIATE
SQL> SELECT NAME , VALUE , ISSYS_MODIFIABLE "SYS_MODE" FROM V$PARAMETER WHERE NAME ='db_files';
NAME VALUE SYS_MODE
------------------------------ --------------- --------------------
db_files 200 FALSE
数据库默认的sessions 是170,processes 是150,db_files是200,open_cursors是300这4个数值肯定不能满足系统需求。我们需要把这4个参数调大一点。其中sessions、processes、db_files是静态的,修改后需要重启,我们可以通过直接修改pfile后重启也可以使用SQL修改后重启数据库。建议把不能动态修改的参数设置大一些(参考:sessions:2000,processes:1200,db_files:2000, open_cursors:1024)
alter system set sessions=2000 scope=spfile sid='tangyun';
--静态
alter system set open_cursors=1024 scope=spfile sid='tangyun';
--动态
alter system set processes=1200 scope=spfile sid='tangyun';
--静态(控制连接数)
alter system set db_files=2000 scope=spfile sid='tangyun';
--静态(数据文件数)
3. 调整temp和undo 表空间
临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理。当oracle里需要用到sort的时候,PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间,正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段的。但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。
SQL>ALTER DATABASE TEMPFILE 'D:ORACLEPRODUCT10.2.0ORADATATANGYUNTEMP01.DBF' RESIZE 100M;
和UNDO 一样,可以设为20G 或者8G,具体情况具体对待。如果遇到temp tablespace 满了的话,我们也可以重建其表空间。
undo 表空间放的是数据的前镜像,当做某个记录多修改时,原记录就会放到undo 中。所以Undo 表空间的大小影响数据的恢复能力。
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ---------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
undo_retention 只是指定undo 数据的过期时间,默认是900s,15分钟。建议改成10800s,即3个小时。
SQL> alter system set undo_retention=10800 scope=both;
至于undo 表空间的大小,如果磁盘空间允许,就将表空间设为20G,如果空间有限,就设为8G。不过现在的服务器硬盘都是比较大,如果放在存储上,那空间更大,所以20G。相对而言就就是一个很小的空间了。
SQL>ALTER DATABASE DATAFILE 'D:ORACLEPRODUCT10.2.0ORADATATANGYUNUNDOTBS01.DBF' RESIZE 100M;
大量的DML 操作会产生大量的undo,尤其是update,delete。当Undo 特别大的时候,我们可以把undo 删了重建。
Oracle 默认只会创建spfile,但这是个二进制文件,无法进行修改。Windows 下生成的pfile 文件默认在$ORACLE_HOME/database 下,Linux 默认位置在$ORACLE_HOME/dbs 下。
为了在设置参数时保险起见。我们要在开始就创建一个pfile 文件,语句很简单。
SQL>create pfile=' u01apporacleproduct10.2.0tangyuninittangyun.ora' from spfile;
当然,调整完参数最好再做一个备份。具体可以参考:
http://tangyunoracle.itpub.net/post/42756/509383
可以解决一些ORA-27101之类的问题。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24930246/viewspace-1042797/ ,如需转载,请注明出处,否则将追究法律责任。