These SQL commands are compatible Oracle 18c, 12c, 11g and 10g.
1) Determine if archive logs of your DG envirinment are successfully being transferred to the standby
by performing a log switch on the primary and running the
select dest_id,status,error from v$archive_dest
If all remote destinations have a status of VALID then proceed to step 2.
Else proceed to Troubleshooting Log Transport Services.
2) How many archives need to be transfered from Primary?
Connected on primary:
select thread#, min(sequence#), min(min_date), count(*) from (
select thread#, sequence#, count(*), max(first_time) min_date
where first_time > sysdate – 2
group by thread#, sequence#
having count(*) <2
order by 1,2
group by thread#;
3) Determine if the standby is a Physical standby or a Logical Standby. To
determine the standby type run the following query on the standby:
select database_role from v$database;
If the standby is a physical standby then proceed to Troubleshooting Redo
Apply. Else proceed to Troubleshooting Logical Apply.
Troubleshooting Log transport services
1) Verify that the primary database is in archive log mode and has automatic
select log_mode from v$database;
2) Verify that the sufficient space exist in the local archive destination as
well as all destinations marked as mandatory. The following query can be
used to determine all local and mandatory destinations that need to be
select dest_id,destination from v$archive_dest
and (binding=’MANDATORY’ or target=’PRIMARY’);
3) Determine if the last log switch to any remote destinations resulted in an
error. Immediately following a log switch run the following query:
select dest_id,status,error from v$archive_dest
Address any errors that are returned in the error column. Perform a log
switch and re-query to determine if the issue has been resolved.
4) Determine if any error conditions have been reached by querying the
v$dataguard_status view (view only available in 9.2.0 and above):
select message, to_char(timestamp,’HH:MI:SS’) timestamp
where severity in (‘Error’,’Fatal’)
order by timestamp
5) Gather information about how the remote destinations are performing the
from v$archive_dest where target=’STANDBY’
6) Run the following query to determine the current sequence number, the last
sequence archived, and the last sequence applied to a standby:
max(sequence#) “Current Sequence”,
max(log_sequence) “Last Archived”,
max(applied_seq#) “Last Sequence Applied”
from v$archived_log al, v$archive_dest ad, v$archive_dest_status ads
group by ads.dest_id
If you are remotely archiving using the LGWR process then the archived
sequence should be one higher than the current sequence. If remotely
archiving using the ARCH process then the archived sequence should be equal
to the current sequence. The applied sequence information is updated at
log switch time.
Troubleshooting Redo Apply services
1. Verify that the last sequence# received and the last sequence# applied to
standby database by running the following query:
select max(al.sequence#) “Last Seq Recieved”,
max(lh.sequence#) “Last Seq Applied”
from v$archived_log al, v$log_history lh
If the two numbers are the same then the standby has applied all redo sent
by the primary. If the numbers differ by more than 1 then proceed to step
2. Verify that the standby is in the mounted state:
select open_mode from v$database;
3. Determine if there is an archive gap on your physical standby database by
querying the V$ARCHIVE_GAP view as shown in the following query:
select * from v$archive_gap;
The V$ARCHIVE_GAP fixed view on a physical standby database only returns
the next gap that is currently blocking redo apply from continuing. After
resolving the identified gap and starting redo apply, query the
V$ARCHIVE_GAP fixed view again on the physical standby database to
determine the next gap sequence, if there is one. Repeat this process
until there are no more gaps.
If v$archive_gap does’nt exists:
with prod as (select max(sequence#) as seq from v_$archived_log where RESETLOGS_TIME = (select RESETLOGS_TIME from v_$database)), stby as (select max(sequence#) as seq,dest_id dest_id from v_$archived_log where first_change# > (select resetlogs_change# from v_$database) and applied = ‘YES’ and dest_id in (1,2) group by dest_id) select prod.seq-stby.seq,stby.dest_id from prod, stby
4. Verify that managed recovery is running:
select process,status from v$managed_standby;
When managed recovery is running you will see an MRP process. If you do not see an MRP process then start managed recovery by issuing the following
recover managed standby database disconnect;
Some possible statuses for the MRP are listed below:
ERROR – This means that the process has failed. See the alert log or v$dataguard_status for further information.
WAIT_FOR_LOG – Process is waiting for the archived redo log to be completed. Switch an archive log on the primary and query v$managed_standby to see if the status changes to APPLYING_LOG.
WAIT_FOR_GAP – Process is waiting for the archive gap to be resolved. Review the alert log to see if FAL_SERVER has been called to resolve the gap.
APPLYING_LOG – Process is applying the archived redo log to the standby database.à
Troubleshooting SQL Apply services
1. Verify that log apply services on the standby are currently running.
To verify that logical apply is currently available to apply changes perform the following query:
SQL> SELECT PID, TYPE, STATUS, HIGH_SCN
2> FROM V$LOGSTDBY;
When querying the V$LOGSTDBY view, pay special attention to the HIGH_SCN column. This is an activity indicator. As long as it is changing each time you query the V$LOGSTDBY view, progress is being made. The STATUS column
gives a text description of the current activity.
If the query against V$LOGSTDBY returns no rows then logical apply is not running. Start logical apply by issuing the following statement:
SQL> alter database start logical standby apply;
If the query against V$LOGSTDBY continues to return no rows then proceed to step 2.
2. To determine if there is an archive gap in your dataguard configuration; query the DBA_LOGSTDBY_LOG view on the logical standby database.
SQL> SELECT SUBSTR(FILE_NAME,1,25) FILE_NAME, SUBSTR(SEQUENCE#,1,4) “SEQ#”,
2> FIRST_CHANGE#, NEXT_CHANGE#, TO_CHAR(TIMESTAMP, ‘HH:MI:SS’) TIMESTAMP,
3> DICT_BEGIN BEG, DICT_END END, SUBSTR(THREAD#,1,4) “THR#”
4> FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;
Copy the missing logs to the logical standby system and register them using the ALTER DATABASE REGISTER LOGICAL LOGFILE statement on your logical standby database. For example:
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE ‘/u01/oradata/arch/1_57.arc’;
After you register these logs on the logical standby database, you can restart log apply services. The DBA_LOGSTDBY_LOG view on a logical standby database only returns the next gap that is currently blocking SQL apply operations from continuing. After resolving the identified gap and starting log apply services, query the DBA_LOGSTDBY_LOG view again on the logical standby database to determine the next gap sequence, if there is one. Repeat this process until there are no more gaps.
6. Determine is logical apply is receiving errors while performing apply operations.
Log apply services cannot apply unsupported DML statements, DDL statements and Oracle supplied packages to a logical standby database in SQL apply mode. When an unsupported statement or package is encountered, SQL apply
operations stop. To determine if SQL apply has stopped due to errors you should query the DBA_LOGSTDBY_EVENTS view. When querying the view, select the columns in order by EVENT_TIME. This ordering ensures that a shutdown
failure appears last in the view. For example:
SQL> SELECT XIDUSN, XIDSLT, XIDSQN, STATUS, STATUS_CODE
2> FROM DBA_LOGSTDBY_EVENTS
3> WHERE EVENT_TIME =
4> (SELECT MAX(EVENT_TIME)
5> FROM DBA_LOGSTDBY_EVENTS);
If an error requiring database management occurred (such as adding a tablespace, datafile, or running out of space in a tablespace), then you can fix the problem manually and resume SQL apply.
If an error occurred because a SQL statement was entered incorrectly,conflicted with an existing object, or violated a constraint then enter the correct SQL statement and use the DBMS_LOGSTDBY.SKIP_TRANSACTION procedure
to ensure that the incorrect statement is ignored the next time SQL apply operations are run.
7. Query DBA_LOGSTDBY_PROGRESS to verify that log apply services is progressing.
The DBA_LOGSTDBY_PROGRESS view describes the progress of SQL apply operations on the logical standby databases. For example:
SQL> SELECT APPLIED_SCN, APPLIED_TIME, READ_SCN, READ_TIME,
2> NEWEST_SCN, NEWEST_TIME
3> FROM DBA_LOGSTDBY_PROGRESS;
The APPLIED_SCN indicates that committed transactions at or below that SCN have been applied. The NEWEST_SCN is the maximum SCN to which data could be applied if no more logs were received. This is usually the MAX(NEXT_CHANGE#)-1
from DBA_LOGSTDBY_LOG when there are no gaps in the list. When the value of NEWEST_SCN and APPLIED_SCN are the equal then all available changes have been applied. If you APPLIED_SCN is below NEWEST_SCN and is increasing then
SQL apply is currently processing changes.
8. Verify that the table that is not receiving rows is not listed in the DBA_LOGSTDBY_UNSUPPORTED.
The DBA_LOGSTDBY_USUPPORTED view lists all of the tables that contain datatypes not supported by logical standby databases in the current release. These tables are not maintained (will not have DML applied) by the logical
standby database. Query this view on the primary database to ensure that those tables necessary for critical applications are not in this list. If the primary database includes unsupported tables that are critical, consider using a physical standby database.
Author: Oracle Corporation.