./adstrtal.sh -nodbchk
./adstpall.sh -nodbchk
I am a software engineer and working as an Oracle Apps DBA. I have started this blog to share my knowledge with others . Here you can find stuff related to Oracle DBA,Oracle Applications DBA,
SQL> SELECT username FROM v$session;
SQL> SELECT a.sid
, a.serial#
, b.sql_text
FROM v$session a
, v$sqlarea b
WHERE a.sql_address=b.address AND a.username = '<username>';
Oracle Data Guard is one of the most critical High Availability (HA) and Disaster Recovery (DR) solutions used in Oracle environments. For DBAs, continuously monitoring redo generation, transport, and apply is essential to ensure data consistency between Primary and Standby databases.
This blog provides a complete, practical checklist with ready-to-use SQL commands, explanations, and troubleshooting steps to help Oracle DBAs efficiently manage Data Guard environments. This guide is especially useful for Oracle Apps DBA, Core DBA, and RAC administrators.
This query helps identify the latest redo log sequence applied on the standby database.
SELECT THREAD#, MAX(SEQUENCE#) AS LAST_APPLIED_LOG
FROM V$LOG_HISTORY
GROUP BY THREAD#;
Why this matters:
Confirms whether redo apply is progressing
Helps identify apply lag
Use this query to check archived logs that are received but not yet applied on standby.
SELECT THREAD#, SEQUENCE#, APPLIED
FROM V$ARCHIVED_LOG
WHERE APPLIED = 'NO';
--If many logs show APPLIED = NO, investigate transport or MRP issues.
Triggering a log switch is useful to test redo shipping and apply.
ALTER SYSTEM ARCHIVE LOG CURRENT;
ALTER SYSTEM SWITCH LOGFILE;
Tip: Always perform this on the Primary database.
This query confirms whether the redo apply process (MRP) is running properly.
SELECT PROCESS, STATUS, SEQUENCE#
FROM V$MANAGED_STANDBY;
Look for:
MRP0 process
STATUS should be APPLYING_LOG or WAIT_FOR_LOG
Displays applied status for all archived logs.
SELECT SEQUENCE#, APPLIED
FROM V$ARCHIVED_LOG
ORDER BY SEQUENCE#;
Useful for auditing redo apply behavior over time.
Use the following commands to start managed recovery.
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
This error occurs when a recovery process is already active.
-- Step 1: Cancel existing recovery
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
-- Step 2: Restart recovery
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT;
This resolves most redo apply conflicts.
To gracefully stop managed recovery:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Useful during maintenance or troubleshooting.
Check overall database role and protection mode.
SELECT NAME,
DB_UNIQUE_NAME,
OPEN_MODE,
DATABASE_ROLE,
PROTECTION_MODE
FROM V$DATABASE;
Ensures the database is operating in the expected role.
SELECT MAX(SEQUENCE#)
FROM V$ARCHIVED_LOG
WHERE APPLIED = 'YES';
SELECT THREAD#, MAX(SEQUENCE#)
FROM V$ARCHIVED_LOG
WHERE APPLIED = 'YES'
GROUP BY THREAD#;
Helpful in RAC environments where multiple threads exist.
Displays the latest redo log generated on the primary database.
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';
SELECT val.thread#,
MAX(val.sequence#) AS last_primary_seq_generated,
MAX(val.first_time) KEEP (DENSE_RANK LAST ORDER BY val.sequence#)
AS last_generated_timestamp
FROM v$archived_log val,
v$database vdb
WHERE val.resetlogs_change# = vdb.resetlogs_change#
GROUP BY val.thread#
ORDER BY val.thread#;
Shows the latest redo log received by the standby database.
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';
SELECT val.thread#,
MAX(val.sequence#) AS last_received_sequence,
MAX(val.first_time) KEEP (DENSE_RANK LAST ORDER BY val.sequence#)
AS last_received_timestamp
FROM v$archived_log val,
v$database vdb
WHERE val.resetlogs_change# = vdb.resetlogs_change#
GROUP BY val.thread#
ORDER BY val.thread#;
Displays the most recent redo log applied on standby.
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';
SELECT val.thread#,
MAX(val.sequence#) AS last_standby_seq_applied,
MAX(val.first_time) KEEP (DENSE_RANK LAST ORDER BY val.sequence#)
AS last_applied_timestamp
FROM v$archived_log val,
v$database vdb
WHERE val.resetlogs_change# = vdb.resetlogs_change#
AND val.applied IN ('YES','IN-MEMORY')
GROUP BY val.thread#
ORDER BY val.thread#;
Used to verify database synchronization at SCN level.
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';
SELECT TO_CHAR(CURRENT_SCN, 'FM999999999999999') AS current_scn,
SCN_TO_TIMESTAMP(CURRENT_SCN) AS current_scn_timestamp
FROM V$DATABASE;
Before performing a switchover, verify readiness.
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
Expected values:
TO STANDBY
TO PRIMARY
Quick queries for daily monitoring:
SELECT SEQUENCE#, APPLIED
FROM V$ARCHIVED_LOG;
SELECT MAX(SEQUENCE#)
FROM V$ARCHIVED_LOG
WHERE APPLIED = 'YES';
🔔 Follow for more Oracle DBA tips, EBS administration guides, and real-world troubleshooting scenarios.