Applies to:
Oracle Server Enterprise Edition - Version: 9.2.0.1 to 11.1.0.6This problem can occur on any platform.
Oracle Server - Enterprise Edition - Version: 9.2 to 11.1
Symptoms
While trying to commit or rollback a pending transaction getting error ORA-2058...Subsequently when trying to purge the pending transactions using the
procedure "dbms_transaction.purge_lost_db_entry" gives the following errors..
SQL> EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('5.23.2386');
BEGIN DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('5.23.2386'); END;
*
ERROR at line 1:
ORA-30019: Illegal rollback Segment operation in Automatic Undo mode
ORA-06512: at "SYS.DBMS_TRANSACTION", line 65
SQL> execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('37.16.108');
BEGIN DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('37.16.108'); END;
*
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "SYS.DBMS_TRANSACTION", line 94
Cause
If the remote database no longer exists then the transaction will have to bepurged from the list of pending distributed transactions.
The transaction to be deleted is in the Prepared State.
Solution
If the command causes an ORA-2058 error to occur, it means that the remotedatabase cannot be accessed. In this case, check whether the database link to
the remote database exists and whether the remote database is shutdown.
If the remote database no longer exists then the transaction will have to be
purged from the list of pending distributed transactions.
Follow the instructions on how to purge a
distributed transaction from the database.
=================================
If the remote database cannot be accessed, a failed distributed transaction
cannot be committed or rolled back and so must be purged from the list of
pending transactions.
1. Identify the id of the transaction:
SQL> SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID FROM DBA_2PC_PENDING;
2. Purge the transaction:
SQL> EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('');
SQL> COMMIT;
3. Confirm that the transaction has been purged:
SQL> SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID FROM DBA_2PC_PENDING;
Step 2:
=====
If you get the following errors while purging transactions using "dbms_transaction.purge_lost_db_entry"
SQL> EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('5.23.2386');
BEGIN DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('5.23.2386'); END;
*
ERROR at line 1:
ORA-30019: Illegal rollback Segment operation in Automatic Undo mode
ORA-06512: at "SYS.DBMS_TRANSACTION", line 65
ORA-06512: at "SYS.DBMS_TRANSACTION", line 85
Fix:
===
This problem is logged as
Bug.2191458 (unpublished) UNABLE TO EXEC DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY WITH AUTO UNDO MANAGEMENT
and is worked by development.
Use the following Workaround:
You have to use local_tran_id.....
Issue commit before alter system set "_smu_debug_mode" = 4;
Follow the steps,
SQL> commit;
SQL> alter session set "_smu_debug_mode" = 4;
SQL> commit;
SQL> execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('local_tran_id');
SQL> commit;
Step 3:
=====
When executing the following procedure(dbms_transaction.purge_lost_db_entry)
to delete entries from
dba_2pc_pending one encounters the following error:
SQL> execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('37.16.108'); ==>For example..
BEGIN DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('37.16.108'); END;
*
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "SYS.DBMS_TRANSACTION", line 94
Fix:
===
The transaction to be deleted is in the prepared state and has to be either
force committed or force rollback
SQL> select LOCAL_TRAN_ID,STATE from dba_2pc_pending;
LOCAL_TRAN_ID STATE
---------------------- ----------------
37.16.108 prepared
SQL> rollback force '37.16.108'; ==>For example
Rollback complete.
SQL> select LOCAL_TRAN_ID,STATE from dba_2pc_pending;
LOCAL_TRAN_ID STATE
---------------------- ----------------
37.16.108 forced rollback
SQL> COMMIT;
SQL>alter system set "_smu_debug_mode" = 4;
Rollback complete.
SQL> exec dbms_transaction.purge_lost_db_entry('37.16.108'); ==>For example
SQL> COMMIT;
No comments:
Post a Comment