文档 · 2020年8月11日 0

Oracle11G内存参数调整

环境:

系统:centos7.2

oracle版本:Oracle 11.2.1

原配置:4C 8G

升级后配置: 4C 16G

服务器中只运行一个oracle实例。

Oracle 11g 版本加入了memory_max_target,memory_target参数,memory_target 和 /dev/shm(tmpfs)有紧密联系,tmpfs的大小制约了memory_target的使用范围。

memory_target 是动态控制sga和pga时两者大小之和,memory_target最大不能超过memory_max_target。

memory_target 可以直接修改,不用重启数据库。

本次只是针对内存做了扩容的操作,增加了内存后调整oracle相应的内存管理参数以充分利用资源。并根据期间出现的内存调整问题进行解决。

好了开始调整Oracle内存:

第一步:

计划给oracle分配多少内存:

以我的实际内存16G来算,很多文章说建议使用物理内存的80%左右,那我们本次就设置为12G。1个人建议物理内存的一半,因为我测试时候超过8G启动数据库都是内存溢出,可能与我的配置有关。当然你要是内存很大比肯定不能对半分,那不成了浪费资源了。所以分配物理内存的50%-80% 自己考虑。

第二步:

为了不给后面埋坑提前备份数据库,并检查是否有历史的pfile启动文件,通常在oracle安装目录的/$ORACLE_HOME/admin/orcl/pfile/init.ora.xxxxxxxxx

主要是为了万一修改内存出现异常方便能够启动数据库。

[root@db-01 pfile]# pwd
/app/admin/orcl/pfile
[root@db-01 pfile]# ls
init.ora.9192018113639  init.ora.9192018134810  init.ora.9192018134957
[root@db-01 pfile]#

#这个文件夹里面数量不一定是几个,但是至少要有一个init.ora.xxxxx的文件。
#如果实在没有,但是后期又出了问题,还可以从其他相同版本的oracle里面拷贝一份过来使用。

 

第三步:

以上操作都搞定后修改sysctl.conf 文件,这个一般在安装数据库的时候都会手动去设置一些参数。比如共享内存这些。所以修改数据库之前先修改这些参数。

[root@db-01 /]# vim /etc/sysctl.conf 

fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmall = 2097152
kernel.shmmax = 12884901888   #只修改这一项,你想给数据库设置多大内存就写多少,我打算分配12G给oracle,计算方法就是 12x1024x1024x1024=12884901888
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

#修改完成后保存,并运行sysctl -p使修改生效

[root@db-01 /]# sysctl -p

#挂载/dev/shm虚拟内存,通常系统已经挂载了这个文件系统但是空间太小了所以我们remount一个大一些的空间,这个大小一定要比分配给oracle的大,但是不要超过实际的物理内存大小。

#系统中未挂载/dev/shm的使用:mount tmpfs /dev/shm -t tmpfs 

#系统中已经挂载/dev/shm的使用   mount -o remount,size=14G /dev/shm 

[root@db-01 /]# mount -o remount,size=14G /dev/shm    

#检查是否挂载成功
[root@db-01 /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.7G     0  7.7G   0% /dev
tmpfs            14G  4.8G  9.3G  34% /dev/shm       #在这里哦
tmpfs           7.8G   17M  7.7G   1% /run
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/vda2        39G  3.0G   34G   9% /
/dev/vdb1       296G  175G  106G  63% /volumes01
tmpfs           1.6G     0  1.6G   0% /run/user/1000
tmpfs           1.6G     0  1.6G   0% /run/user/0

#加入开机自启:
[root@db-01 /]# vim /etc/fstab
tmpfs /dev/shm tmpfs  defaults,size=14336M      0 0

#保存退出即可

第四步:

登录oracle修改内存参数:

[root@db-01 ~]$ su - oracle
[oracle@db-01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Tue Aug 11 14:18:08 2020

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> conn sys/sys as sysdba
Connected.

#查看当前内存设置,这是原始的配置。
SQL> show parameter target

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target		     integer	 0
db_flashback_retention_target	     integer	 1440
fast_start_io_target		     integer	 0
fast_start_mttr_target		     integer	 0
memory_max_target		     big integer 4G      #这是我原始的内存
memory_target			     big integer 4G      #这是我原始的内存
parallel_servers_target 	     integer	 32
pga_aggregate_target		     big integer 0
sga_target			     big integer 0

#修改内存
SQL> alter system set memory_max_target = 12288M scope=spfile;
System alterd

SQL> alter system set memory_target = 12288M scope=spfile;
System alterd

#关闭数据库
SQL> shutdown immediate   
Database closed.
Database dismounted.
ORACLE instance shut down.

#启动数据库
SQL> startup

#查询内存是否设置生效
SQL> show parameter target
...
memory_max_target big integer 12G    #12G 已经生效了欧
memory_target big integer 12G        #12G 已经生效了欧
...

第五步:

如果你第四步startup后没有报错启动成功了且已经生效了,那么恭喜你,你的oracle内存已经配置成功了,可以回家睡觉啦。

很显然事情并没有那么简单:下面介绍一下我这里出现的问题。

 

问题1:修改完oracle内存参数,启动数据库时候出现

ORA-00845: MEMORY_TARGET not supported on this system

问题原因:设置的memory_target 超出了操作系统的虚拟内存 /dev/shm

解决办法:参考第三步设置/dev/shm 虚拟内存,

 

问题2:修改oracle内存参数之后startup时报内存溢出的错误,信息如下

ORA-01034: ORACLE not available
ORA-27102: out of memory
Linux-x86_64 Error: 12: Cannot allocate memory

问题原因: 内存分配不合理导致内存溢出。

解决办法:关闭无用的应用程序释放物理内存,重启(重启需谨慎)服务器后再次启动数据库,如果还是内存溢出那说明给oracle配置的内存太大了应该配置小一点。

 

最终解决办法:以上两个问题不管你遇到哪一个,如果没能解决,那么都可以使用这个方法

#第一步,找到数据库的历史启动文件(参考本文第二步):
#我的在目录/app/admin/orcl/pfile/

[root@db-01 /]$su - oracle

[oracle@db-01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Tue Aug 11 14:18:08 2020

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> startup pfile=/app/admin/orcl/pfile/init.ora.9192018113639        #你的历史启动文件


SQL> create spfile from pfile='/volumes01/admin/orcl/pfile/init.ora.9192018113639';    #注意这里加了单引号;

SQL> shutdown immediate

SQL>startup
ORACLE instance started.
Total System Global Area  795127808 bytes
Fixed Size                    1339456 bytes
Variable Size               478154688 bytes
Database Buffers   310378496 bytes
Redo Buffers                  5255168 bytes
Database mounted.
Database opened.

#数据库正常启动了但是刚刚第四步修改的内存参数已经恢复成原来的样子了,需要重新设置一遍。

#之前设置的是12G 既然内存溢出了那么这次我们按照第三第四步设置为50%也就是8G。或者您有时间可以试试10G 总之出现问题可以用此方法启动数据库。 

#亲测,设置为10G依然是内存溢出。也可能是我本身配置问题。



 

小知识:

配置文件分两种,一种叫pfile,一种叫spfile,区别在于spfile是二进制文件,给机器看的,pfile是文本文件,给用户看的,但是oracle启动的时候只会加载其中一个文件,当然最好是加载二进制的spfile,速度更快。但是二进制文件损坏了之后,我们依然可以使用pfile文件启动数据库并恢复spfile文件。

tmpfs   是一种基于内存的文件系统,它和虚拟磁盘ramdisk比较类似,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储。而且传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。tmpfs是最好的基于RAM的文件系统。

 

 

 

 

 

 

 

打赏