之前发表过smon一些相关的文章,主要是讨论回滚方面的事宜,最近在项目上碰到pmon的相关问题,因此也学习了一些相关的知识,10g之前的版本跟踪方式主要局限于操作系统版本的命令跟踪,这里不做讨论
11g 跟踪命令
从 11.1.0.7 到 18.0, 可以使用下面的命令来启动 tracing:
alter system set events=’immediate trace name listener_registration level 3′;
当收集结束后,使用下面的命令来停止跟踪:
alter system set events=’immediate trace name listener_registration level 0′;
19c开始使用下面的命令
开启 Trace:
alter system set events ‘trace[LREG] disk highest’;
alter system set events = ‘immediate trace name LREG_STATE level 3’;
要关闭 Trace:
alter system set events ‘trace[LREG] disk disable’;
Trace的默认路径是:
$ORACLE_BASE/diag/rdbms/trace/
ls -l | grep -i lreg
这会将 PMON 的信息写入到名字包含 pmon 的 trace 文件中,存放在后台进程 trace 目录。Trace 文件会显示类似下面的信息:
Start Registration Information
——————————
Last update: 1188938571 (99 seconds ago)
Flag: 0x4, 0x0
State: succ=1, wait=0, fail=0
Listeners:
0 – (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521)): <— 监听地址
state=1, err=0
nse[0]=0, nse[1]=0, nte[0]=0, nte[1]=0, nte[2]=0
ncre=0
Instance: <— 实例名
flg=0, upd=0
info=(HOST=) <– 主机名
node load=57, max=40960 <– 节点负载
inst load=1, max=170 <– 实例负载
Services:
0 – : <– 服务名
flg=4, upd=6
goodness=0, delta=1 <– Goodness 和 Delta 值
1 – _XPT:
flg=4, upd=0
goodness=0, delta=0
2 – XDB:
flg=5, upd=6
goodness=0, delta=1
Handlers:
0 – Dedicated
flg=80002002, upd=2
services=,_XPT
hdlr load=22, max=149
Dispatchers:
0 – D000:
addr=(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=33099))
inf=DISPATCHER , pid: 10850>
flg=1004, upd=0
services=XDB
hdlr load=0, max=1022
CMON Handlers:
Listen Endpoints:
—————————-
End Registration Information
—————————-
注意:Oracle Net Server trace,TNS 监听 trace 和 event 10257 在 11g 仍然可用,之前的文章介绍过跟踪监听的方法。详见下面 12c 之前版本的介绍。
12c LREG 故障排除
从 12c 开始,引入了新的后台进程 ora_lreg_sid-name。
在之前的版本中,PMON 负责处理实例注册。12c 中,LREG(Listener REGistration)接管实例注册逻辑。
LREG:
将实例信息注册到监听。
是每个数据库实例的关键后台进程(如果被杀死,oracle 将宕机)。
接管旧版本中 PMON 的一些职责,并且在 listener.log 中更新 service_update,service_register,service_died 信息。
跟踪 LREG 的方法与跟踪 PMON 的方法相同:
开启 Oracle Net 服务器端 sqlnet trace 会从实例启动时开始跟踪 LREG。
旧的 PMON trace 现在跟踪 LREG:alter system set events = ‘10257 trace name context forever, level 5’;
监听注册信息也可以通过这种方式被转储到 ora_lreg trace 文件中:alter system set events = ‘immediate trace name listener_registration level 3’;
可以动态跟踪 LREG。
12c 之前版本,使用下面的方法跟踪 PMON 注册问题 A) Oracle Net server 和 listener traces 或者 B) PMON tracing
A) 搜集匹配的 Oracle Net Server trace 和 Listener Trace 文件
服务器端 TRACE:
1. 在文件 SQLNET.ORA 中添加下面的参数来开启 Oracle Net Server tracing:
DIAG_ADR_ENABLED=off # Disable ADR if database version 11g TRACE_LEVEL_SERVER = 16 # Enable level 16 trace
TRACE_DIRECTORY_SERVER = # Control trace file location
2. 使用特权用户通过 SQL*Plus 连接数据库:
SQL> connect / as sysdba
Connected.
SQL> select spid from V$process, V$session where audsid=userenv(‘SESSIONID’) and paddr=addr;
SPID
————
3940
生成的 trace 文件的名字,将包含上面的返回值。
3. 执行注册命令:
SQL > alter system register
SQL > exit
4. 关闭服务器端 trace:
如果需要禁用 trace,那么可以删除 SQLNET.ORA 中刚加入的参数。到 TRACE_DIRECTORY_SERVER 设置的路径下,找到名字包含 SPID 值的 trace 文件。文件中会包含 alter system register 命令:
Listener tracing:
1. 在 listener.ora 中添加下面的参数,然后 reload listener:
DIAG_ADR_ENABLED_ =off # 如果数据库版本是 11g,需要关闭 ADR。
TRACE_LEVEL_ = 16 # 启用 level 16 trace
TRACE_TIMESTAMP_ = ON # 设置 trace 文件中的时间戳
TRACE_DIRECTORY_ = # 设置 trace 文件路径
2. 执行‘alter system register’强制注册:
SQL> alter system register;
System altered.
listener trace 文件中会看到类似下面的信息:
(信息会由于版本不同或者单节点、RAC 等因素有细微差别)
nsglgrDoRegister: inst loads: ld1:17 mld1:10240 ld2:1 mld2:248
nsglgrDoRegister: instance flags – req:0 cur:16
nsglgrDoRegister: Creating new service: “XDB.*****.com”.
nsglgrDoRegister: service:..oracle.com flag:3 goodness:0 delta:1
nsglgrDoRegister: Creating new service: “..oracle.com”.
nsglgrDoRegister: service:..oracle.com flag:2 goodness:0 delta:1
B) 12c 之前的版本启用 PMON trace 的方法:
1. 找到 PMON 的进程 ID:
SQL> select SPID,PROGRAM from v$process;
SPID PROGRAM
———————— ————————————————
PSEUDO
10096 oracle@ (PMON)
10098 oracle@ (PSP0)
10100 oracle@ (VKTM)
10104 oracle@ (GEN0)
10106 oracle@ (DIAG)
10108 oracle@ (DBRM)
10110 oracle@ (DIA0)
10112 oracle@ (MMAN)
10114 oracle@ (DBW0)
10116 oracle@ (LGWR)
SPID PROGRAM
———————— ————————————————
10118 oracle@ (CKPT)
10120 oracle@ (SMON)
10122 oracle@ (RECO)
10124 oracle@ (MMON)
10126 oracle@ (MMNL)
10128 oracle@ (D000)
10130 oracle@ (S000)
10175 oracle@ (Q000)
10280 oracle@ (SMCO)
22191 oracle@ (TNS V1-V3)
10159 oracle@ (QMNC)
SPID PROGRAM
———————— ————————————————
10177 oracle@ (Q001)
10173 oracle@ (CJQ0)
22186 oracle@ (W000)
25 rows selected.
2. 对 PMON 做 oradebug:
SQL> oradebug setospid 10096
Oracle pid: 2, Unix process id: 10096, image: oracle@(PMON)
3. 对进程设置 event:
SQL> oradebug Event 10257 trace name context forever, level 16
Statement processed.
4. trace 文件的位置可以通过下面的命令查看:
SQL> oradebug tracefile_name
Trace file /app/oracle/diag/rdbms///trace/_pmon_10096.trc
5. 执行注册命令,或者等待 PMON 注册(默认轮询时间是60秒):
SQL> alter system register;
System altered.
6. 关闭 event:
SQL> oradebug Event 10257 trace name context OFF;
Statement processed.
到 trace 所在的目录下并上传 trace。
注册成功会显示类似下面的信息:
Trace file /app/oracle/diag/rdbms///trace/_pmon_10096.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /app/oracle/product/11.2.0/dbhome_1
System name: Linux
Node name:
Release: 2.6.18-238.19.1.0.1.el5
Version: #1 SMP Fri Jul 15 04:42:13 EDT 2011
Machine: x86_64
Instance name:
Redo thread mounted by this instance: 1
Oracle process number: 2
Unix process pid: 10096, image: oracle@ (PMON)
Received ORADEBUG command (#1) ‘Event 10257 trace name context forever, level 16’ from process ‘Unix process pid: 22065, image: ‘
Finished processing ORADEBUG command (#1) ‘Event 10257 trace name context forever, level 16’
err=-300 lbflgs=0x0 tbtime=0 tntime=0 etime=300 srvs=1 nreqs=0 sreqs=0 asrvs=1
error=-300 etime=300 control=0 integral=0 lasterr=-300 lastetm=300
kmmlrl: status: succ=1, wait=0, fail=0
kmmlrl: update for process drop delta: 3166 3166 25 28 149
kmmgdnu:
goodness=0, delta=1,
flags=0x5:unblocked/not overloaded, update=0x6:G/D/-
kmmgdnu:
goodness=0, delta=1,
flags=0x4:unblocked/not overloaded, update=0x6:G/D/-
kmmlrl: 25 processes
kmmlrl: instance load 1
Bug 5755010 Listener registration never completes
详细信息: 尽管并没有注册失败的错误,但是监听注册会失败
修复版本:10.2.0.4 and 11.1.0.6
Bug 8232287 PMON stops registering its services (ORA-12516 errors)
详细信息:pmon 停止注册到监听,会引发 ORA-12516 错误。
修复版本:10.2.0.5 and 11.2.0.1
Bug 7133740One Instance of Bug ( 2 – NODE RAC DATABASE) I Crashed Due To Ora-600
请参考:
Document 759083.1 Connections get TNS-12520 error on RAC & PMON is stuck on ‘ges cancel’ wait event
Document 779318.1 Repeating ‘* Service_died * 0′ Messages In The 9i R2 Listener.Log File
Document 419824.1RAC Instance Status Shows Ready Zero Handlers For The Service
Document 1130713.1 Pmon Spins While Cleaning Dead Process
诊断方法:
1.检查 Oracle net 名字解析方式是否正确。例如:SQLNET.ORA 文件中的 NAMES.DIRECTORY_PATH 。Oracle net 会尝试正确的名字解析方式。
2.确保使用了正确的网络管理文件:SQLNET.ORA 和 TNSNAMES.ORA。Note:464410.1 Search Order for TNS files – listener.ora, sqlnet.ora, tnsnames.ora ..etc.
3.检查在数据库启动之前是否设置了 TNS_ADMIN ,如果是 RAC 环境,是否使用 srvctl 设置了 TNS_ADMIN,TNS_ADMIN 可以 影响搜索顺序。数据库只在启动的时候读取环境变量。如果在启动数据库之后设置了 TNS_ADMIN,然后做了修改,修改后的值是不会被读取到的。
4.检查 LOCAL_LISTENER 或者 REMOTE_LISTENER 使用的网络服务名是否可以 tnsping 通。如果不通,重建条目或者参考第6步。
5.确保使用的主机名与 nslookup 返回的结果相同,并且返回的地址是预期的。
C:\>nslookup
Server:
Address: ….
Name:
Address:….
6.修改 LOCAL_LISTENER 或者 REMOTE_LISTENER 的值,确保不使用名字解释方式。不使用网络管理文件,确认是否问题出在网络管理文件或是没找到它们。
例如 LOCAL_LISTENER
sqlplus / as sysdba
SQL>alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521));
例如两节点 RAC 中的 REMOTE_LISTENER
SQL>alter system set REMOTE_LISTENER=’ (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521)))’;
7.检查 HOST 到 ip 地址的转换是否允许注册。
8.使用 IPC 替代 TCP 完成 LOCAL_LISTENER 的注册,验证问题是否与 TCP 或主机名有关。
sqlplus / as sysdba
SQL>alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=IPC)(KEY=KEY1))’;
Key 值必须与 LISTENER.ORA 文件中的 IPC 地址一致。