今天遇到一个问题。11gRAC ASM实例后台日志告警连接数满了, 这个错误在ASM实例身上很少见:
Mon Mar 29 03:30:13 2021
ORA-00020: maximum number of processes (3880) exceeded
ORA-20 errors will not be written to the alert log for
the next minute. Please look at trace files to see all
the ORA-20 errors.
复制
看了一眼服务器后台日志,好家伙!几千个"sqlplus -S "的查询会话:
grid 241506 241505 0 Mar26 ? 00:00:04 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 241551 1 0 Mar20 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
root 241552 241551 0 Mar20 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
grid 241559 241552 0 Mar20 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
grid 241584 241559 0 Mar20 ? 00:00:00 u01/app/11.2.0.4/grid/bin/sqlplus -S
grid 241586 241584 0 Mar20 ? 00:00:12 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 241672 80873 0 Mar26 ? 00:00:00 [sh] <defunct>
root 241684 1 0 Mar21 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
root 241685 241684 0 Mar21 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
grid 241687 241685 0 Mar21 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
grid 241702 1 0 Mar26 ? 00:00:00 u01/app/11.2.0.4/grid/bin/sqlplus -S as sysasm
grid 241703 241702 0 Mar26 ? 00:00:04 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
grid 241716 241687 0 Mar21 ? 00:00:00 u01/app/11.2.0.4/grid/bin/sqlplus -S
grid 241717 241716 0 Mar21 ? 00:00:10 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 241723 1 0 Mar24 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
root 241725 241723 0 Mar24 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
root 241727 1 0 Mar24 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
root 241729 1 0 Mar24 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
root 241730 241727 0 Mar24 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
root 241733 241729 0 Mar24 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
grid 241745 241725 0 Mar24 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
grid 241753 241730 0 Mar24 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
grid 241755 241733 0 Mar24 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
复制
其核心里一条监控asm磁盘组使用率的sql:
/bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:$ORACLE_HOME/rdbms/lib;export PATH=$ORACLE_HOME/bin:/usr/bin:/usr/sbin:/usr/local/bin:$PATH;/u01/app/11.2.0.4/grid/bin/sqlplus -S "/ as sysasm"' <<EOF
set echo off;
set heading off;
set line 100;
set linesize 20000 set long 2000000000;
set longchunksize 255;
set wra on;
set newpage none;
set pagesize 0;
set numwidth 12;
set termout off;
set trimout on;
set trimspool on;
set feedback off;
set timing off;
spool tmp/grid_record1.txt;
select GROUP_NUMBER||','||NAME||','||SECTOR_SIZE||','||BLOCK_SIZE||','||ALLOCATION_UNIT_SIZE||','||STATE||','||TYPE||','||TOTAL_MB||','||FREE_MB||','||HOT_USED_MB||','||COLD_USED_MB||','||REQUIRED_MIRROR_FREE_MB||','||USABLE_FILE_MB||','||OFFLINE_DISKS||','||COMPATIBILITY||','||DATABASE_COMPATIBILITY||','||VOTING_FILES||','
from v\$asm_diskgroup;
spool off;
exit;
EOF
复制
是由一体机厂家自身的一个监控Python脚本不停的调起。按理说杀掉这个脚本,再杀掉会话,事情就告一段落。但作为一名合格的DBA,怎么也得探究探究。尝试手动执行v$asm_diskgroup和v$asm_disk确认非常缓慢,一直不返回结果,另一个节点ASM实例则能快速返回。
怀疑一:Oracle Bug
以前遇到过这种问题,是oracle自身的bug。MOS上有一篇”ASM Queries (v$asm_diskgroup, v$asm_disk) Slow in 11.2.0.3.0 and Solaris (Doc ID 1383019.1)”,可惜版本对不上,同时现场的数据库版本已经是11204.1904,是比较新的了,可以排除。
怀疑二:ASM_DISKSTRING未设置
检查发现有设置 ASM_DISKSTRING='/dev/asmdisk*',测试了下磁盘扫描的速度,没有问题,很快返回:
kfod asm_diskstring='/dev/asmdisk*' disks=all
复制
再次排除。
怀疑三:会话阻塞或异常等待
这个在ASM实例中真没考虑到,只能试试,试试就逝逝,真发现了:
SID SERIAL# SQL_ID EVENT BLOCKING_SESSION
---- ---------- ------------- -------------------------- ----------------
9 9 cpf9um5thhkzv enq: DD - contention 2869
34 11 cpf9um5thhkzv enq: DD - contention 2869
35 17 cpf9um5thhkzv enq: DD - contention 2869
37 23 cpf9um5thhkzv enq: DD - contention 2869
73 9 fxdyd5rygqhry enq: DD - contention 2869
83 15 cpf9um5thhkzv enq: DD - contention 2869
90 31 cpf9um5thhkzv enq: DD - contention 2869
98 9 cpf9um5thhkzv enq: DD - contention 2869
....
复制
PS:你问我怎么进的ASM实例,冒险杀了几十个ASM会话。。。冒险是因为DB实例本身会维持几个到ASM实例的会话,注意服务进程的时间就不会杀错。
发现确认有BLOCKING_SESSION,继续查下去:
SQL> select sid,serial#, sql_ID,event, blocking_session from v$session where sid=2869;
SID SERIAL# SQL_ID EVENT BLOCKING_SESSION
---------- ---------- ------------- -------------------- ----------------
2869 54255 fxdyd5rygqhry rdbms ipc reply 1099
SQL> select sid,serial#, sql_ID,event, blocking_session from v$session where sid=1099;
SID SERIAL# SQL_ID EVENT BLOCKING_SESSION
---------- ---------- ------------- ------------------- ----------------
1099 1 GPnP Get Item
复制
“enq: DD - contention”、“GPnP Get Item”这两个等待事件都没见过啊?百度之,发现著名Buddy Yuan的博文:
http://www.dboracle.com/archivers/%E8%AE%B0%E4%B8%80%E6%AC%A1ora-asm%E6%9C%8D%E5%8A%A1%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8%E5%92%8Cgpnp-get-item%E7%9A%84%E9%97%AE%E9%A2%98.html
摘抄一段:
通过查看文档Diskgroup Mount Hangs with RBAL Waiting on ‘GPnP Get Item’ and ‘enq: DD – contention’ (文档 ID 1375505.1),发现这个问题是这是由未发布的bug:12398300引起的。这个问题的最根本原因就是gpnp进程stuck了,然后就会导致rbal进程产生等待。解决办法其实很简单,就是干掉节点1的gpnp进程就会释放。而干掉gpnp进程集群不会重启,它只会单独的把该进程重启。
问题是类似的!
处理方法:
$ ps -ef|grep gpnp
grid 26895 1 0 2019 ? 16:35:36 /u01/app/11.2.0.4/grid/bin/gpnpd.bin
grid 132467 65803 0 11:14 pts/3 00:00:00 grep --color=auto gpnp
$ kill -9 26895
$ ps -ef|grep gpnp
grid 151655 1 3 11:16 ? 00:00:00 /u01/app/11.2.0.4/grid/bin/gpnpd.bin
grid 154084 65803 0 11:16 pts/3 00:00:00 grep --color=auto gpnp
复制
杀掉gpnpd.bin进程会v$asm_diskgroup的相关查询会话慢慢完成并退出,ASM实例会话数恢复正常。
原因:
处理后客户也找到一体机的厂商,厂商工程师估计经常遇到这个问题,看到等待事件就知道原因了,他的原文解释如下:
端口扫描的时候如果扫到了gpnp的端口会导致gpnp进程异常,需要把gpnp进程重启一下:kill -HUP gpnp进程号
gpnp端口号一般都比较大,后面做安全扫描的话,可以考虑以跳过9000以上的端口。