1. 错误场景
最初安装Orale11g时,采用默认自动内存管理,使用1/2Mem。后来想增大最大内存使用值。系统内存8G Mem,想修改为3/4Mem: 8*3/4=6G=6144M = 6442450944B
[root@HM311~]# vim /etc/sysctl.conf
kernel.shmmax = 6442450944
[root@HM311~]# sysctl -p
[root@HM311~]# splplus / as sysdba
sql> show parameter target;
sql> alter system set memory_max_target=6144M scope=spfile;
sql> alter system set memory_target=6144M scope=spfile;
需要重启数据库才能生效。
sql> startup
ORA-00845: MEMORY_TARGET not supported on this system
查找资料后发现在oracle 11g中新增的内存自动管理的参数MEMORY_TARGET,它能自动调整SGA和PGA,
这个特性需要用到/dev/shm共享文件系统,而且要求/dev/shm必须大于MEMORY_TARGET,如果/dev/shm比MEMORY_TARGET小,就会报错。
2. 解决方案
2.1 初始化参数MEMORY_TARGET或MEMORY_MAX_TARGET不能大于共享内存(/dev/shm),为了解决这个问题,可以增大/dev/shm
[root@HM311~]# mount -t tmpfs shmfs -o size=6144M /dev/shm
// 但如果之前已经mount过了,则执行remount
[root@HM311~]# mount -o remount,size=6144M /dev/shm
2.2 为了确保操作系统重启之后能生效,需要修改/etc/fstab文件
[root@HM311~]# vi /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=6144M 0 0
2.3 如果/dev/shm没有挂载也会报上面的错,所认需要确保已经挂载,执行目录查看:
[root@HM311~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 800G 642G 159G 81% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 8.0G 4.6G 3.5G 57% /dev/shm
tmpfs 3.9G 17M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs 783M 0 783M 0% /run/user/1001
tmpfs 783M 0 783M 0% /run/user/0
2.4 重新启动数据库
$ sqlplus / as sysdba
SQL> startup
- startup : 启动
- shutdown normal : 正常关闭数据库。不允许新的连接,等待会话结束,等待事务结束,做一个检查点并关闭数据文件。启动时不需要实例恢复。
- shutdown transactional : 不允许新的连接,不等待会话结束,等待事务结束,做一个检查点并关闭数据文件。启动时不需要实例恢复。
- shutdown immediate : 立即方式关闭数据库。不允许新的连接,不等待会话结束,等待事务结束,做一个检查点并关闭数据文件。没有结束的事务自动回滚,启动时不需要实例恢复。
- shutdown abort : 直接关闭数据库,正在访问数据库的会话会被突然终止。如果数据库中有大量操作正在执行,这时执行shutdown abort后,重新启动数据库需要很长时间