最近在使用OGG时遇到问题,即抽取进程起不来,查看日志后发现跟oracle共享内存池设置有关,顺着这条线索找到了memory_target参数,它几乎是控制oracle内存最原始的参数。
一、参数原理和背景介绍
1.1 memory_max_targethe和memory_target
从oracle 11g 开始提供了memory_max_target、memory_target两个新的管理参数,进一步简化了Oracle的内存管理。 MEMORY_TARGET参数确定了整个Oracle数据库可用用内存值,该参数应该大于等于SGA和PGA之和。注意,这个参数依赖于memory_max_target参数,即memory_target的值不能大于memory_max_target的值,所以要修改memory_target参数的值,首先要设置memory_max_target参数值。
-
如果设置memory_max_target、memory_target为0,则关闭内存自动管理,内存的管理方式与oracle 10g保持一致。oracle官方强烈建议开始自动内存管理。
-
如果设置memory_max_target、memory_target为非0,则打开内存自动管理。这时候根据官方建议sga_target、pga_aggregate_target应当设置为0。这个时候如果sga_max_size也设置为了0,那么在数据库启动的时候,sga_max_size会自动设置为memory_target x 0.6,也就是说sga_target最大不会超过memory_target x 0.6,如果sga_max_size设置为了一个数值,那么在数据库启动的时候,sga会分配为memory_target x 0.6,pga会分配为memory_target x 0.4,后期会根据实际使用情况自动进行调整,但是不会超过sga_max_size。
1.2 操作系统共享内存 /dev/shm
memory_target 和 /dev/shm(即tmpfs)有紧密联系,tmpfs的大小制约了memory_target的使用范围。想要修改memory_target 大小,须先用 df -h
命令查看/dev/shm的大小,因为memory_target不能大于/dev/shm的大小。
什么是tmpfs?
tmpfs是一种基于内存的文件系统,它和虚拟磁盘ramdisk比较类似,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储。而且传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。tmpfs是最好的基于RAM的文件系统。tmpfs优势是根据需求动态调整大小,速度快。
tmpfs默认情况下会mount到/dev/shm目录下,要使用tmpfs,需要在内核配置时,启用“Virtual memory file system support”。
二、开始设置MEMORY_TARGET
查看当前MEMORY_TARGET
show parameter MEMORY_TARGET
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 6G
1、设置 /dev/shm 的大小
原因是MEMORY_MAX_TARGET 的设置不能超过 /dev/shm 的大小,否则启动数据库时会报如下错误:
SQL> startup
ORA-00845: MEMORY_TARGET not supported on this system
查看当前/dev/shm大小
[root@oracle_db user]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 8.0G 28K 1.0G 1% /dev/shm
tmpfs 3.9G 12M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 87G 24G 64G 27% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 781M 0 781M 0% /run/user/1000
执行如下命令设置 /dev/shm 的大小
mount -o remount,size=8G /dev/shm/
再次查看/dev/shm大小
[root@oracle_db user]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 8.0G 28K 8.0G 1% /dev/shm
tmpfs 3.9G 12M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 87G 24G 64G 27% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 781M 0 781M 0% /run/user/1000
2、创建spfile
想要设置MEMORY_MAX_TARGET参数,首先得存在spfile文件。
查看spfile文件
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile
创建spfile文件
SQL> create spfile from pfile;
File created.
重启数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 763359832 bytes
Fixed Size 8901208 bytes
Variable Size 494927872 bytes
Database Buffers 251658240 bytes
Redo Buffers 7872512 bytes
Database mounted.
Database opened.
查看spfile文件是否创建
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /opt/oracle/product/19c/dbhome
_1/dbs/spfileORCL.ora
3、设置MEMORY_MAX_TARGET
SQL> ALTER SYSTEM SET MEMORY_MAX_TARGET = 6G SCOPE=SPFILE;
System altered.
注意:这一步设置成功后,必须重启数据库,该设置才会生效,生效后才能设置MEMORY_TARGET。
重启数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 4294963368 bytes
Fixed Size 8941736 bytes
Variable Size 4148166656 bytes
Database Buffers 130023424 bytes
Redo Buffers 7831552 bytes
Database mounted.
Database opened.
4、设置MEMORY_TARGET
SQL> ALTER SYSTEM SET MEMORY_TARGET = 6G ;
System altered.
完。
网友评论