Be Warned: cmclean.sql Is Dangerous!

Tags:
Oracle,
Technical Track
I’m sure one of the most popular scripts for Apps DBAs on My Oracle Support is
cmclean.sql from MOS Article ID 134007.1 “Concurrent Processing - CMCLEAN.SQL - Non Destructive Script to Clean Concurrent Manager Tables”. DBAs usually use the script to clean up stale data from concurrent processing tables (FND_CONCURRENT_%) after incidents like a crash of the database or concurrent processing node. This script sets correct completion phase and status codes for terminated concurrent requests and sets correct control codes for terminated concurrent manager processes. Despite the assuring “Non Destructive” claim in the title of the MOS Article there is a possibility to lose concurrent request schedules when
cmclean.sql is executed.
First of all it’s important to understand how scheduled concurrent requests are executed and resubmitted. A simplified process of the execution is:
P.S. The description of the behavior of ICM in this blog post is a result of investigation performed on R12.1.3. I believe it behaves the same way in R12.1 and probably even in R12.0 and 11i, but I didn’t check. MOS Article ID 134007.1 which contains the cmclean.sql script is valid for Applications versions 10.7 to 12.1.3 – be careful when using it independently from the version of your e-Business Suite installation.
- Concurrent manager process (e.g. FNDLIBR in case of Standard Manager) queries the FND_CONCURRENT_REQUESTS table for pending requests.
- When a pending request is found, the manager process updates the PHASE_CODE=R (Running) and STATUS_CODE=R (Running).
- The next step is to start the executable of the concurrent program. If it’s a PL/SQL procedure – FNDLIBR connects to the DB and executes the PL/SQL code, if it’s a java program – FNDLIBR starts up a java process to execute the java class, etc.
- FNDLIBR catches the exit codes from the executable of the concurrent program and updates the statuses in FND_CONCURRENT_REQUESTS accordingly - PHASE_CODE=C (Completed) and STATUS_CODE = C (Normal), G (Warning) or E (Error).
- FNDLIBR checks if the concurrent request has a schedule and needs to be resubmitted. If yes – it resubmits a new concurrent request with the same parameters.
"Concurrent Manager Recovery" wizard is even worse! (Added on Jul 21, 2013)
After posting this article I started thinking about whether the "Concurrent Manager Recovery" Wizard available from Oracle Applications Manager in e-Business Suite was any better then cmclean.sql or not. As I didn't have much experience with it I decided to give it a try. This is what I did:- I scheduled 2 concurrent programs ("CP Java Regression Test" and "CP PLSQL Regression Test") to restart in 1 minute after the previous execution completes. These are simple test concurrent programs which sleep for some time and then complete.
- I made sure both programs were running and terminated all concurrent manager process and DB sessions for these concurrent programs.
- The termination of the processes and sessions left the rows in FND_CONCURRENT_REQUESTS with PHASE_CODE=R and STATUS_CODE=R
- I executed the "Concurrent Manager Recovery" wizard which fixed the status codes of the concurrent manager processes, but didn't touch the statuses of the concurrent requests - I thought this was a good thing (I expected the ICM to clean up the statuses and resubmit the requests at its startup phase)
- I started up the concurrent managers, but ICM didn't clean up the 2 stale records in FND_CONCURRENT_REQUESTS table. The 2 requests appeared as they would be running, while in fact they didn't have any OS processes or DB sessions.
So what should we do to clean up the concurrent processing tables after crashes or cloning? (Added on Jul 21, 2013)
It appears to me that no reliable way exists to clean up the tables properly. The cmclean.sql can remove some schedules without warning. The "Concurrent Manager Recovery" wizard may leave some requests in the running state even if they were terminated. I'm going to open a SR for Oracle to request a proper solution, but meanwhile I'd suggest to use the cmclean.sql. However, make sure to check its outputs carefully and reschedule any requests which got cleaned up (as described above).P.S. The description of the behavior of ICM in this blog post is a result of investigation performed on R12.1.3. I believe it behaves the same way in R12.1 and probably even in R12.0 and 11i, but I didn’t check. MOS Article ID 134007.1 which contains the cmclean.sql script is valid for Applications versions 10.7 to 12.1.3 – be careful when using it independently from the version of your e-Business Suite installation.