我们在创建Oracle DB的时候,如果是在Linux系统的时候,会进行一些相关参数的设置。如shmmax,所在位置/proc/sys/kernel/shmmax,通常在/etc/sysctl.conf中配置这个参数值。
shmmax内核参数定义的是系统允许的单个共享内存段的最大值。做个试验:kernel.shmmax = 17179869180
[oracle@021Y-SH-BKAP ~]$ ipcs -sa
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0xfc8fb410 17498130 oracle 660 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
0xbdab17f8 14581763 oracle 660 154
------ Message Queues --------
key msqid owner perms used-bytes messages
我尝试修改shmmax大小:kernel.shmmax = 8589934592
sysctl -p
重启数据库,通过ipcs命令查看,内存被分成多个共享段来满足SGA的设置需求。
[oracle@021Y-SH-BKAP ~]$ ipcs -sa
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 17563666 oracle 660 4096 0
0x00000000 17596456 oracle 660 4096 0
0x00000000 17629225 oracle 660 4096 0
0x00000000 17661994 oracle 660 4096 0
0x00000000 17727531 oracle 660 4096 0
0x00000000 17760300 oracle 660 4096 0
0x00000000 17793069 oracle 660 4096 0
0x00000000 17858606 oracle 660 4096 0
0x00000000 17891375 oracle 660 4096 0
0x00000000 17924144 oracle 660 4096 0
0x00000000 17989681 oracle 660 4096 0
0x00000000 18022450 oracle 660 4096 0
0x00000000 18055219 oracle 660 4096 0
0x00000000 18186292 oracle 660 4096 0
0x00000000 18219061 oracle 660 4096 0
0xfc8fb410 19267638 oracle 660 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
0xbdab17f8 15237123 oracle 660 154
------ Message Queues --------
key msqid owner perms used-bytes messages
在这里我尝试过将shmmax分配的非常小的情况,甚至影响到了使用sqlplus连接实例,也就是说sqlplus连接实例也需要占用一定的内存ERROR:
ORA-12547: TNS:lost contact
Process J000 died, see its trace file
kkjcre1p: unable to spawn jobq slave process
Errors in file /DBBK/oracle/diag/rdbms/orcl/orcl/trace/orcl_cjq0_32725.trc:
*** 2015-02-20 14:04:49.793
Process J000 is dead (pid=832 req_ver=6 cur_ver=6 state=KSOSP_SPAWNED).
告警提示J000进程已经挂掉了,逐步放大shmmax,虽然数据库可以起来,但观察告警日志,仍有报错:Errors in file /DBBK/oracle/diag/rdbms/orcl/orcl/trace/orcl_j000_4353.trc (incident=119768):
ORA-07445: exception encountered: core dump [lxgcvp()+5237] [SIGSEGV] [ADDR:0x7F74B376A000] [PC:0x84FB395] [Invalid permissions for mapped object] []
Incident details in: /DBBK/oracle/diag/rdbms/orcl/orcl/incident/incdir_119768/orcl_j000_4353_i119768.trc
Exception [type: SIGSEGV, SI_KERNEL(general_protection)] [ADDR:0x0] [PC:0x70F26DE, kohdmpins()+78] [flags: 0x0, count: 2]
Errors in file /DBBK/oracle/diag/rdbms/orcl/orcl/trace/orcl_j000_4353.trc (incident=119769):
ORA-07445: exception encountered: core dump [kohdmpins()+78] [SIGSEGV] [ADDR:0x0] [PC:0x70F26DE] [SI_KERNEL(general_protection)] []
ORA-07445: exception encountered: core dump [lxgcvp()+5237] [SIGSEGV] [ADDR:0x7F74B376A000] [PC:0x84FB395] [Invalid permissions for mapped object] []
Incident details in: /DBBK/oracle/diag/rdbms/orcl/orcl/incident/incdir_119769/orcl_j000_4353_i119769.trcErrors in file /DBBK/oracle/diag/rdbms/orcl/orcl/trace/orcl_j000_2179.trc
----- Error Stack Dump -----
----- Current SQL Statement for this session (sql_id=4jrfrtx4u6zcx) ----
这边报错语句姑且不看,但通过网上了解Oracle有一个叫Error Stack的诊断,类似于10046,用法另开篇介绍。
这里的报错我打算也放到后续再分析。
针对某个进程还可以通过pmap系统命令查看该进程分配在哪些共享内存段中:[oracle@021Y-SH-BKAP ~]$ ps -ef | grep dbw
oracle 2779 1 0 14:20 ? 00:00:00 ora_dbw0_orcl
[oracle@021Y-SH-BKAP ~]$ pmap 2779
2779: ora_dbw0_orcl
0000000000400000 155144K r-x-- /DBBK/oracle/product/11.2.0.1.0/bin/oracle
0000000009d81000 12400K rwx-- /DBBK/oracle/product/11.2.0.1.0/bin/oracle
000000000a99d000 284K rwx-- [ anon ]
000000000bfee000 536K rwx-- [ anon ]
0000000060000000 4K r-xs- /dev/shm/ora_orcl_19333174_0
0000000060001000 65532K rwxs- /dev/shm/ora_orcl_19333174_0
0000000064000000 65536K rwxs- /dev/shm/ora_orcl_19333174_1
0000000068000000 65536K rwxs- /dev/shm/ora_orcl_19333174_2
000000006c000000 65536K rwxs- /dev/shm/ora_orcl_19333174_3
0000000070000000 65536K rwxs- /dev/shm/ora_orcl_19333174_4
0000000074000000 65536K rwxs- /dev/shm/ora_orcl_19333174_5
0000000078000000 65536K rwxs- /dev/shm/ora_orcl_19333174_6
000000007c000000 65536K rwxs- /dev/shm/ora_orcl_19333174_7
0000000080000000 65536K rwxs- /dev/shm/ora_orcl_19333174_8
0000000084000000 65536K rwxs- /dev/shm/ora_orcl_19333174_9
0000000088000000 65536K rwxs- /dev/shm/ora_orcl_19333174_10
000000008c000000 65536K rwxs- /dev/shm/ora_orcl_19333174_11
0000000090000000 65536K rwxs- /dev/shm/ora_orcl_19333174_12
0000000094000000 65536K rwxs- /dev/shm/ora_orcl_19333174_13
0000000098000000 65536K rwxs- /dev/shm/ora_orcl_19333174_14
000000009c000000 65536K rwxs- /dev/shm/ora_orcl_19333174_15
00000000a0000000 65536K rwxs- /dev/shm/ora_orcl_19333174_16
00000000a4000000 65536K rwxs- /dev/shm/ora_orcl_19333174_17
00000000a8000000 65536K rwxs- /dev/shm/ora_orcl_19333174_18
把shmmax加大到足够在一个内存段中就容纳下SGA时,上述的问题将不在遇到。不过我这里遇到一个无法释放内存段的情况(我已经关闭数据库了。但内存段还是没有释放)
通过命令ipcrm手动释放,如果有多个可以通过脚本释放:for i in `ipcs -sa | grep -v shmid | awk '{print $2}'` ; do ipcrm -m $i ; done