linux 共享内存 oracle,SGA与共享内存

本文详细介绍了在Linux环境下创建OracleDB时如何设置和调整shmmax参数,该参数决定了单个共享内存段的最大值。通过实验展示了设置过大或过小 shmmax 对数据库运行的影响,包括导致数据库无法启动、SQLPLUS连接失败等问题,并通过ipcs命令观察内存使用情况。同时,文章提到了进程内存分配的检查方法以及遇到无法释放内存段的情况,并给出了手动释放的命令。
摘要由CSDN通过智能技术生成

我们在创建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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值