I was lucky enough to attend UKOUG Conference 2011 last year. I saw several great presentations, one of which was a presentation on troubleshooting RAC by Julian Dyke. During this presentation Julian commented that we need to watch out for SCAN listeners having their ADR home inside the Grid Infrastructure home instead of with the Database listeners in the ADR home under $ORACLE_BASE.
Well this was one of the few things in his presentation I was fit to comment on so I tried to attract Julian’s attention by waving my arm, sadly my timid nature meant I went unnoticed. So this blog post is me going public with my attempted interruption.
First an example of how the log location for SCAN listeners typically differs to that of Database listeners. I personally do not like this behaviour as I like my Grid Infrastructure home to have resonably stable size, which it can have once the log directory’s rotation is mature, however the ADR home for listeners is not cleared down automatically so you can end up with a directory growing unchecked.
[grid@n01 n01]$ $GRID_HOME/bin/lsnrctl status LISTENER|grep Log Listener Log File /u01/app/oracle/diag/tnslsnr/n01/listener/alert/log.xml [grid@n01 n01]$ $GRID_HOME/bin/lsnrctl status LISTENER_SCAN3|grep Log Listener Log File /u01/app/grid/11203/ghome_1/log/diag/tnslsnr/n01/listener_scan3/alert/log.xml
And we know from the Oracle documentation that ADR_BASE is defined as:
To specify the base directory into which tracing and logging incidents are stored when ADR is enabled.
The default on the server side is ORACLE_BASE, or ORACLE_HOME/log, if ORACLE_BASE is not defined.
So… let’s check ORACLE_BASE for CRS resources:
[grid@n01 ~]$ $GRID_HOME/bin/crsctl stat res ora.LISTENER.lsnr -p|grep -i base USR_ORA_ENV=ORACLE_BASE=/u01/app/oracle [grid@n01 ~]$ $GRID_HOME/bin/crsctl stat res ora.LISTENER_SCAN3.lsnr -p|grep -i base [grid@n01 ~]$
Notice above that the Database listener has $ORACLE_BASE set and the Scan listener does not. Hence the log location.
This can be controlled for Database listeners by using the SETENV switch for SRVCTL but this does not work for Scan listeners.
[grid@n01 ~]$ $GRID_HOME/bin/srvctl setenv listener -l listener_scan1 -t "ORACLE_BASE=/u01/app/oracle" PRKO-3162 : The actions setenv, getenv, and unsetenv are not suppported for Single Client Access Name listener listener_scan1 PRCN-2066 : Failed to retrieve cluster listener for listener_scan1 because it has the type of Single Client Access Name Listener
There is another way of setting environment variables for cluster resources and that is via crsctl modify resource.
[grid@n01 ~]$ $GRID_HOME/bin/crsctl modify resource ora.LISTENER_SCAN3.lsnr -attr USR_ORA_ENV=ORACLE_BASE=/u01/app/oracle [grid@n01 ~]$ $GRID_HOME/bin/crsctl stat res ora.LISTENER_SCAN3.lsnr -p|grep -i base USR_ORA_ENV=ORACLE_BASE=/u01/app/oracle [grid@n01 ~]$ $GRID_HOME/bin/srvctl stop scan_listener -i 3 [grid@n01 ~]$ $GRID_HOME/bin/srvctl start scan_listener -i 3 [grid@n01 ~]$ lsnrctl status listener_scan3 | grep Log Listener Log File /u01/app/oracle/diag/tnslsnr/n01/listener_scan3/alert/log.xml
To my mind the whole thing would seem a little cleaner if there was an “SRVCTL SETENV SCAN_LISTENER” command.
After writing this post I thought I’d check around for other information to support this post and, lo and behold, there is a My Oracle Support article covering almost exactly what I’ve written above. The article also talks about using the LISTENER.ORA attribute ADR_BASE_LISTENER_SCANn to control this.
Diagnostic Destination For Listeners Is Under Grid_home/Log Instead Of Oracle_base/Diag [ID 1269109.1]