Troubleshooting Oracle EBS R12.1 txkCfgUtlfileDir.pl: APPS Lockouts, Missing AppsUtil JRE & UTL_FILE_DIR Synchronization

Alhamdulillah.

Introduction

While working on an Oracle E-Business Suite R12.1 environment running on Oracle Database 19c, I encountered a failure while configuring the database-side UTL_FILE_DIR replacement using txkCfgUtlfileDir.pl.

The script repeatedly reported:

ERRORMSG: Invalid APPS database user credentials.
ERRORCODE = 1 ERRORCODE_END

At first glance, this looked like a straightforward APPS password problem.

It wasn’t.

The investigation eventually uncovered two separate contributing factors:

  • Issue 1: The APPS account was being locked by repeated authentication attempts from an external application.
  • Issue 2: The TXK utility expected a JRE component that was missing from the AppsUtil directory structure.

These were independent issues discovered during different phases of the troubleshooting investigation. After resolving the APPS lockout and verifying the JRE availability, the UTL_FILE_DIR synchronization proceeded to completion: directory objects → setUtlFileDir → syncUtlFileDir → FND_CONC_CLONE.SETUP_CLEAN → Database AutoConfig.

This post documents the investigation and the commands used.

1. Environment

The database environment was:

Oracle E-Business Suite R12.1
Oracle Database 19c
Database CDB : SRCDB
PDB          : TESTDB
Listener     : 1522
Service      : ebs_service

The ORACLE_HOME was:

ORACLE_HOME=$ORACLE_BASE/TESTDB/db/tech_st/19.3.0.0

The EBS database context file was:

CONTEXT_FILE=$ORACLE_HOME/appsutil/TESTDB_dbctx.xml

The environment was loaded with:

cd $ORACLE_HOME
. ./TESTDB_dbctx.env

Validation:

echo "ORACLE_SID=$ORACLE_SID"
echo "ORACLE_HOME=$ORACLE_HOME"
echo "TNS_ADMIN=$TNS_ADMIN"
echo "CONTEXT_FILE=$CONTEXT_FILE"

Expected values:

ORACLE_SID=TESTDB
ORACLE_HOME=$ORACLE_BASE/TESTDB/db/tech_st/19.3.0.0
TNS_ADMIN=$ORACLE_HOME/network/admin/TESTDB_dbctx
CONTEXT_FILE=$ORACLE_HOME/appsutil/TESTDB_dbctx.xml

2. Initial txkCfgUtlfileDir.pl Failure

The initial command was:

perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl \
-contextfile=$CONTEXT_FILE \
-oraclehome=$ORACLE_HOME \
-outdir=$ORACLE_HOME/appsutil/log \
-mode=getUtlFileDir

The script failed with:

FUNCTION: main::validateAppsSchemaCredentials
ERRORMSG: Invalid APPS database user credentials.
ERRORCODE = 1 ERRORCODE_END

The context file itself was found successfully:

Context file:
$ORACLE_HOME/appsutil/TESTDB_dbctx.xml exists.

So the failure was occurring during APPS credential validation.

3. Validate the PDB

Because this was a multitenant database, I first verified the PDB state.

SHOW PDBS;

Output:

CON_ID CON_NAME    OPEN MODE   RESTRICTED
------ ----------- ----------- ----------
2      PDB$SEED    READ ONLY   NO
3      TESTDB      READ WRITE  NO

Then:

ALTER SESSION SET CONTAINER=TESTDB;

The PDB was open read/write, so the next step was to validate the APPS account.

4. APPS Account Investigation

Initially, the APPS account showed as open after an unlock:

ALTER USER APPS ACCOUNT UNLOCK;

Verification:

SELECT username,
       account_status,
       lock_date
FROM dba_users
WHERE username = 'APPS';

At one point:

APPS    OPEN

However, the TXK utility continued to report invalid APPS credentials.

The most useful clue came from the TXK-generated diagnostic log:

cat $ORACLE_HOME/appsutil/log/TXK_UTIL_DIR_*/validate_apps_password.log

The log showed:

Connected to an idle instance.
ERROR:
ORA-28000: The account is locked.

This was much more specific than the generic TXK error. The failure was occurring at the database authentication layer, not at the password validation level.

5. Understanding the TXK Workflow

Rather than treating the generic TXK error at face value, I inspected txkCfgUtlfileDir.pl to understand how the utility validates the APPS credentials.

The script constructs the database connection using the APPS credentials from the EBS configuration and performs the validation through SQL*Plus. The detailed validate_apps_password.log showed ORA-28000, confirming that the failure was occurring at the database authentication layer.

6. Verify Context Configuration

The context file contained:

grep -n -iE 's_apps_user|s_dbSid|s_tools_twotask|s_dbService' \
$CONTEXT_FILE

Relevant values:

s_dbSid       = TESTDB
s_dbService   = ebs_service
s_apps_user   = apps

The database SID, service and listener port were also checked in the context configuration:

grep -n -iE 's_dbSid|s_dbService|s_dbport' \
$CONTEXT_FILE

Result:

s_dbSid       = TESTDB
s_dbService   = ebs_service
s_dbport      = 1522

These values were consistent with the environment.

7. Verify TNS Connectivity

The EBS TNS entry was properly configured for the PDB service.

export TNS_ADMIN=$ORACLE_HOME/network/admin/TESTDB_dbctx

Then:

tnsping TESTDB

Result:

Used TNSNAMES adapter to resolve the alias
Attempting to contact ...
OK (0 msec)

Therefore: TNS resolution and listener connectivity were not the problem.

8. Important Discovery: APPS Account Was Being Locked

At another point during testing, the account showed:

USERNAME        ACCOUNT_STATUS
--------------- -------------------------
APPS            LOCKED(TIMED)

The account was unlocked:

ALTER USER APPS ACCOUNT UNLOCK;

Then a direct connection succeeded:

sqlplus apps@TESTDB

SHOW USER;
USER is "APPS"

This confirmed that the APPS credentials being used for the direct SQL*Plus connection were valid at that point. However, subsequent attempts to run the TXK utility showed the account locked again:

ORA-28000: The account is locked.

This pattern indicated that something was repeatedly attempting authentication with invalid credentials, causing the account to lock after a number of failed attempts. The generic TXK error message “Invalid APPS database user credentials” did not hint at this root cause.

9. SplashBI Was Contributing to the Lockout

During the investigation, SplashBI sessions were identified as contributing to repeated APPS authentication attempts, and stale credentials were suspected.

Those sessions were stopped/killed before continuing with the TXK procedure.

This was a critical troubleshooting lesson:

Do not repeatedly unlock APPS and rerun the TXK utility while another application is continuously attempting to authenticate with stale APPS credentials.

Doing so simply creates another lockout cycle. After the interfering sessions were stopped, APPS authentication could be validated successfully, and the TXK procedure proceeded.

10. A Second Prerequisite Issue: Missing AppsUtil JRE

This was a separate issue discovered during the later stages of the TXK workflow. An earlier execution of syncUtlFileDir had shown:

FUNCTION: main::getJavaCmd

ERRORMSG:
Invalid JDK TOP:
$ORACLE_HOME/appsutil/jre/bin/java

I checked:

ls -ld $ORACLE_HOME/appsutil/jre

and found:

No such file or directory

However, the AppsUtil clone area contained a valid JRE:

ls -ld $ORACLE_HOME/appsutil/clone/jre

and:

ls -l $ORACLE_HOME/appsutil/clone/jre/bin/java

The Java executable was present. Validation:

$ORACLE_HOME/appsutil/clone/jre/bin/java -version

java version "1.8.0_451"
Java(TM) SE Runtime Environment

11. Backup Before Correcting AppsUtil

Before making the AppsUtil change, a backup was taken:

cd $ORACLE_HOME/appsutil

tar -czf $ORACLE_BASE/TESTDB/appsutil_pre_jre_fix_$(date +%Y%m%d_%H%M%S).tar.gz \
    TESTDB_dbctx.xml \
    txkSetCfgCDB.env \
    clone/jre

The backup was verified:

ls -lh $ORACLE_BASE/TESTDB/appsutil_pre_jre_fix_*.tar.gz

-rw-r--r-- 1 oracle dba 46M Aug 18 11:32 appsutil_pre_jre_fix_20260818_113218.tar.gz

This provided a rollback point before modifying the directory structure.

12. Restore the Expected AppsUtil JRE

The TXK source explicitly showed that getJavaCmd expected:

$ORACLE_HOME/appsutil/jre/bin/java

The existing valid JRE under clone/jre was copied to the expected location:

cp -pR $ORACLE_HOME/appsutil/clone/jre \
       $ORACLE_HOME/appsutil/jre

Validation:

ls -ld $ORACLE_HOME/appsutil/jre
ls -l $ORACLE_HOME/appsutil/jre/bin/java

$ORACLE_HOME/appsutil/jre/bin/java -version
java version "1.8.0_451"

This restored the Java path expected by the TXK utility.

13. Existing UTL_FILE_DIR Configuration

An earlier execution had already generated:

$ORACLE_HOME/dbs/TESTDB_utlfiledir.txt

The original getUtlFileDir execution had failed during APPS credential validation when the account was locked. After resolving the APPS lockout and stopping the interfering authentication attempts, the TXK workflow was able to proceed. The existing configuration file from the previous successful run was available as a reference for the required filesystem paths.

The paths included:

$ORACLE_BASE/TESTDB/temp
$APP_MOUNT/TESTDB/inst/apps/TESTDB_dbctx/appltmp
$APP_MOUNT/TESTDB/apps/apps_st/comn/temp
$ORACLE_BASE/TESTDB/db/tech_st/19.3.0.0/admin/po_terms
$ORACLE_BASE/TESTDB/db/tech_st/temp/TESTDB

14. Create the Directory Objects

The TXK utility was then run in createDirObject mode for each required OS path.

perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl \
-contextfile=$CONTEXT_FILE \
-oraclehome=$ORACLE_HOME \
-outdir=$ORACLE_HOME/appsutil/log \
-mode=createDirObject

The utility prompted for:

Enter the APPS Password:
Enter the SYSTEM Password:
Enter the OS path for which directory object needs to be created:

Each of the required paths completed with:

Successfully Completed the script
ERRORCODE = 0 ERRORCODE_END

15. Run setUtlFileDir

The next step was:

perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl \
-contextfile=$CONTEXT_FILE \
-oraclehome=$ORACLE_HOME \
-outdir=$ORACLE_HOME/appsutil/log \
-mode=setUtlFileDir

The script returned:

WARNING: Incorrect value s_applptmp detected on Apps Tier nodes.

However:

Successfully Completed the script
ERRORCODE = 0 ERRORCODE_END

Therefore the operation itself succeeded, while the s_applptmp issue was recorded as a warning for further review.

16. Synchronize UTL_FILE_DIR

The next documented step was:

perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl \
-contextfile=$CONTEXT_FILE \
-oraclehome=$ORACLE_HOME \
-outdir=$ORACLE_HOME/appsutil/log \
-mode=syncUtlFileDir \
-skipautoconfig=yes

This completed successfully:

Successfully Completed the script
ERRORCODE = 0 ERRORCODE_END

At this point the TXK UTL_FILE_DIR synchronization portion was complete.

17. Clean EBS Node Configuration

The next database-side EBS step was:

EXEC FND_CONC_CLONE.SETUP_CLEAN;

COMMIT;

Output:

PL/SQL procedure successfully completed.

Commit complete.

Immediately afterward, querying FND_NODES returned:

no rows selected

This was expected at this point because SETUP_CLEAN removes the existing node registrations so that AutoConfig can rebuild them.

18. Run Database AutoConfig

Database AutoConfig was then executed from the database context directory:

cd $ORACLE_HOME/appsutil
sh adautocfg.sh

The script prompted:

Enter the APPS user password:

The AutoConfig log was located at:

$ORACLE_HOME/appsutil/log/TESTDB_dbctx/[timestamp]/adconfig.log

The important output was:

Context Value Management will now update the Context file

Updating Context file...COMPLETED

Attempting upload of Context file and templates to database...COMPLETED

Updating rdbms version in Context file to db19
Updating rdbms type in Context file to 64 bits

Configuring templates from ORACLE_HOME ...

AutoConfig completed successfully.

This confirmed that the database AutoConfig completed successfully.

19. Validate EBS Node Registration

After AutoConfig completed successfully, the final validation was to confirm that the EBS node registrations had been recreated.

SET LINES 200
SET PAGES 50

COLUMN node_name FORMAT A15
COLUMN host_name FORMAT A30
COLUMN status FORMAT A10
COLUMN cp FORMAT A5
COLUMN forms FORMAT A5
COLUMN web FORMAT A5
COLUMN admin FORMAT A5
COLUMN db FORMAT A5
COLUMN webhost FORMAT A30
COLUMN last_update FORMAT A20

ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';

SELECT node_name,
       host || '.' || domain host_name,
       DECODE(status,'Y','active','inactive') status,
       DECODE(support_cp,'Y','yes','no') cp,
       DECODE(support_forms,'Y','yes','no') forms,
       DECODE(support_web,'Y','yes','no') web,
       DECODE(support_admin,'Y','yes','no') admin,
       DECODE(support_db,'Y','yes','no') db,
       webhost,
       last_update_date
FROM apps.fnd_nodes
WHERE node_name != 'AUTHENTICATION'
ORDER BY 7,1;

Output:

NODE_NAME       HOST_NAME                      STATUS     CP    FORMS WEB   ADMIN DB    WEBHOST                   LAST_UPDATE_DATE
--------------- ------------------------------ ---------- ----- ----- ----- ----- ----- ------------------------- --------------------
EBSNODE         [masked-hostname]              inactive   no    no    no    no    yes                           18-AUG-2026 12:50:45

The node registration was successfully rebuilt with the database tier configuration active (DB = yes) and other tiers set to inactive pending app-tier AutoConfig execution.

Root Cause: Two Independent Issues

The investigation identified two distinct, independent issues that required separate solutions. This is important to understand because confusing the two would have masked the actual root cause in each case.

Issue 1 — APPS Account Lockout (Database Authentication Layer)

The TXK utility reported:

Invalid APPS database user credentials.

The detailed validation log showed:

ORA-28000: The account is locked.

The APPS account was repeatedly becoming LOCKED(TIMED) due to repeated authentication attempts. SplashBI sessions were identified as contributing to those attempts. This was resolved by stopping the interfering sessions and unlocking the APPS account.

Issue 2 — Missing AppsUtil JRE (Environment/Configuration Layer)

During the later TXK workflow, syncUtlFileDir encountered:

Invalid JDK TOP:
$ORACLE_HOME/appsutil/jre/bin/java

The expected JRE path did not exist, while a valid JRE was available under:

$ORACLE_HOME/appsutil/clone/jre

This was resolved by copying the JRE to the expected AppsUtil location after taking a backup. This issue was completely independent of the APPS account lockout and would have persisted even if APPS had been unlocked from the start.

Key lesson: Do not conflate unrelated failures during troubleshooting. Each issue required its own diagnosis and its own fix. Resolving one would not have solved the other.

Troubleshooting Sequence

Phase 1: APPS/TXK Troubleshooting

  1. Validate CDB/PDB state
  2. Validate EBS context configuration
  3. Validate TNS connectivity
  4. Check APPS account status
  5. Inspect validate_apps_password.log
  6. Identify repeated APPS authentication attempts
  7. Stop interfering SplashBI sessions
  8. Unlock APPS
  9. Validate direct APPS login

Phase 2: TXK/UTL_FILE_DIR Configuration

  1. Verify AppsUtil JRE
  2. Take AppsUtil backup
  3. Restore expected appsutil/jre if required
  4. Create directory objects
  5. setUtlFileDir
  6. syncUtlFileDir -skipautoconfig=yes
  7. FND_CONC_CLONE.SETUP_CLEAN
  8. COMMIT
  9. Run Database AutoConfig
  10. Validate FND_NODES
  11. Perform final verification

Troubleshooting Lessons

1. Don’t trust the top-level TXK error blindly

This:

Invalid APPS database user credentials

does not necessarily mean the APPS password is wrong.

Always inspect:

validate_apps_password.log

In this case it exposed:

ORA-28000: The account is locked.

2. Check for external applications causing APPS lockouts

If APPS repeatedly becomes:

LOCKED(TIMED)

don’t continuously unlock it and retry.

Look for applications such as:

  • SplashBI
  • integrations
  • monitoring tools
  • application servers
  • scheduled jobs

that may still have stale APPS credentials.

3. In a CDB/PDB environment, verify the complete connection path

Validate:

  • CDB
  • PDB
  • SERVICE_NAME
  • TNS alias
  • PORT
  • APPS account

For example:

tnsping TESTDB
sqlplus apps@TESTDB

4. Inspect the TXK source when the error is unclear

The getJavaCmd function made the missing JRE requirement explicit in the source code. This was much more useful than simply treating the Invalid JDK TOP error as a generic Java problem.

5. Take a backup before modifying AppsUtil

The backup provided a simple rollback point:

tar -czf $ORACLE_BASE/TESTDB/appsutil_pre_jre_fix_$(date +%Y%m%d_%H%M%S).tar.gz \
    TESTDB_dbctx.xml \
    txkSetCfgCDB.env \
    clone/jre

Final Validation

With AutoConfig completed successfully, the final validations confirmed that the database-side configuration was healthy and that the EBS node registration had been rebuilt:

  • FND_NODES query returned the EBSNODE with DB support active
  • APPS login successful
  • AutoConfig completed with no errors
  • txkCfgUtlfileDir.pl returned ERRORCODE = 0 for all modes
  • UTL_FILE_DIR directory objects successfully created

The database-tier configuration was now ready for app-tier AutoConfig to follow, which would complete the clone or refresh procedure.

Closing

This issue initially looked like a simple APPS authentication problem. The actual troubleshooting required following the failure through several layers: APPS account state → PDB/service connectivity → authentication log inspection → identification of external authentication interference → TXK environment validation → prerequisite verification → directory object creation → EBS node cleanup → AutoConfig.

The key was to validate each layer independently and avoid assuming causality between separate findings. The APPS lockout issue and the missing JRE issue were distinct problems requiring distinct solutions.

ما شاء الله


Discover more from Syed Anwar Ahmed – Oracle DBA Blog

Subscribe to get the latest posts sent to your email.

Comments

Leave a comment

Discover more from Syed Anwar Ahmed – Oracle DBA Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading