Data Guard - Cheatsheet
Data Guard - Cheatsheet
Terminology
Log Files
There are many options see the broker section for more information
Troubleshooting (Monitoring commands and log files)
configuration DGMGRL> show configuration;
DGMGRL> show database prod1;
DGMGRL> show database prod1dr;
# There are a number of specific information commands, here are the most used
database DGMGRL> show database prod1 statusreport;
DGMGRL> show database prod1 inconsistentProperties;
DGMGRL> show database prod1 inconsistentlogxptProps;
DGMGRL> show database prod1 logxptstatus;
DGMGRL> show database prod1 latestlog;
# change the instance name to reflect the one you have choosen
There are a number of commands that you can use to change the state of the database
turn off/on the redo DGMGRL> edit database prod1 set state=transport-off;
transport service for all Primary
standby databases DGMGRL> edit database prod1 set state=transport-on;
DGMGRL> edit database prod1dr set state=apply-off;
turn off/on the apply state Standby
DGMGRL> edit database prod1dr set state=apply-on;
DGMGRL> edit database prod1dr set state=apply-off;
put a database into a real-
Standby sql> alter database open read only;
time query mode DGMGRL> edit database prod1dr set state=apply-on;
http://www.datadisk.co.uk/html_docs/oracle_dg/cheatsheet.htm 1/6
11/29/2017 Data Guard - cheatsheet
change the protection Primary # Choose what level of protection you require
mode sql> alter database set standby to maximize performance;
sql> alter database set standby to maximize availability;
sql> alter database set standby to maximize protection;
Redo Processing
LGWR - log writer process flushes from the SGA to the ORL files
LNS - LogWriter Network Service reads redo being flushed from the redo buffers by the LGWR and performs a
network send of the redo to the standby
ARCH - archives the ORL files to archive logs, that also used to fulfill gap resolution requests, one ARCH
processes is dedicated to local redo log activity only and never communicates with a standby database
Real-Time Apply
Enable real-time sql> alter database recover managed standby database using current logfile disconnect;
apply
sql> select recovery_mode from v$archive_dest_status where dest_id = 2;
Determine if real-
time apply is RECOVERY_MODE
enabled --------------------------
MANAGED REAL-TIME APPLY
Tools and views to monitor redo
select process, client_process, thread#, sequence#, status from v$managed_standby;
## primary (example)
Note: this command can only run when the database is open
select to_char(start_time, 'dd-mon-rr hh24:mi:ss') start_time,
item, round(sofar/1024,2) "MB/Sec"
Recovery operations from v$recovery_progress
where (item='Active Apply Rate' or item='Average Apply Rate');
Logical Standby
schema that are not select owner from dba_logstdby_skip where statement_opt = 'INTERNAL SCHEMA' order by owner;
maintained by SQL Note: system and sys schema are not replicated so don't go creating tables in these schemas, the above command
apply should return about 17 schemas (Oracle 11g) that are replicated.
Check tables with
select distinct owner, table_name from dba_logstdby_unsupported;
unsupported data select owner, table_name from logstdby_unsupported_tables;
types
skip replication of ## Syntax
tables
dbms_logstdby.skip (
stmt in varchar2,
schema_name in varchar2 default null,
object_name in varchar2 default null,
proc_name in varchar2 default null,
use_like in boolean default true,
esc in char1 default null
);
## Examples
http://www.datadisk.co.uk/html_docs/oracle_dg/cheatsheet.htm 2/6
11/29/2017 Data Guard - cheatsheet
execute dbms_logstdby.skip(stmt => 'DML', schema_name => 'HR', object_name => 'EMPLOYEE');
execute dbms_logstdby.skip(stmt => 'SCHEMA_DDL', schema_name => 'HR', object_name => 'EMPLOYEE');
How much LCR cache select used_memory_size from v$logmnr_session where session_id = (select value from v$logstdby_stats where name =
is being used 'SESSION_ID');
Name Value
SQL Apply component -----------------------------------------------------------------------------------------------------
TRANSACTIONS APPLIED 3764
bottleneck TRANSACTIONS MINED 4985
The mined transactions should be about twice the applied transaction, if this decreases or staying at a low value
you need to start looking at the mining engine.
select count(1) as idle_preparers from v$logstdby_process where type = 'PREPARER' and STATUS_CODE = 16166;
Make sure all IDLE_PREPARER
preparers are busy ----------------------------
0
select used_memory_size from v$logstdby_session where session_id = (select value from v$logstdby_stats where name =
Make sure the peak 'LOGMINER SESSION ID');
size is well below the USED_MEMORY_SIZE
amount allocated ----------------------------
32522244
select (available_txn - pinned_txn) as pipleline_depth from v$logstdby_session where session_id (select value from
v$lostdby_stats where name = 'LOGMINER SESSION ID');
PIPELINE_DEPTH
verify that the ----------------------------
preparer does not 8
have enough work for
the applier processes select count(*) as applier_count from v$logstdby_process where type = 'APPLIER';
APPLIER_COUNT
----------------------------
20
Setting max_servers execute dbms_logstdby.apply_set('MAX_SERVERS', 36);
and preparers execute dbms_logstdby.apply_set('PREPARE_SERVERS', 3);
## Run this first
select name, value from v$logstdby_stats where name line '%PAGE%' or name like '%UPTIME' or name like '%IDLE%';
display the pageout ## Run the second time about 10 mins later
activity select name, value from v$logstdby_stats where name line '%PAGE%' or name like '%UPTIME' or name like '%IDLE%';
Now subtract one from the other and work out the percentage rate, if pageout has increase above 5% then increase
the MAX_SERVERS
unassigned large ## By default SQL apply should be one-sixth of the number of applier processes
transactions
select (available_txn - pinned_txn) as pipleline_depth from v$logstdby_session where session_id (select value from
v$lostdby_stats where name = 'LOGMINER SESSION ID');
PIPELINE_DEPTH
----------------------------
256
http://www.datadisk.co.uk/html_docs/oracle_dg/cheatsheet.htm 3/6
11/29/2017 Data Guard - cheatsheet
select count(1) as idle_applier from v$logstdby_process where type = 'APPLIER' and statuscode = 16166;
IDLE_APPLIER
---------------------------
12
select value from v$logstdby_stats where name = 'LARGE TXNS WAITING TO BE ASSIGNED';
VALUE
---------------------------
12
Monitoring
## you can use the dg_archivelog_monitor.sh script, which accepts three parameters, primary, physical
delays in redo transport ## and the archive log threshold (# of archive logs)
Note: if using a RAC environment make sure you check each instance
## check that MRP (applying_log) matches the RFS process, if the MRP line is missing then you need to
## start the apply process, you also may see the status of wait_for_gap so wait until the gap have been
check that redo has been applied ## resolved first
2
(physical)
sql> select client_process, process, sequence#, status from v$managed_standby;
## if you are using a logical standby then you need to check the following to confirm the redo has been
## applied
check that redo has been applied sql> select applied_scn, latest_scn, mining_scn from v$logstdby_progress;
3
(logical)
## if the mining scn is behind you may have a gap check this by using the following
http://www.datadisk.co.uk/html_docs/oracle_dg/cheatsheet.htm 4/6
11/29/2017 Data Guard - cheatsheet
sql> alter database commit to switchover to physical standby with session shutdown;
Note: at this point if you want to rollback this switchover see my troubleshooting section to get ot back to normal
check the switchover status 10 sql> select switchover_status from v$database;
complete the switchover (physical) 11 sql> alter database commit to switchover to primary with session shutdown;
open the new primary 12 sql> alter database open;
sql> shutdown immediate;
finish off the old primary 13 sql> startup mount;
sql> alter database recover managed standby database using current logfile disconnect;
Note: if using a RAC environment make sure you check each instance
## check that MRP (applying_log) matches the RFS process, if the MRP line is missing then you need to
## start the apply process, you also may see the status of wait_for_gap so wait until the gap have been
check that redo has been applied ## resolved first
2
(physical)
sql> select client_process, process, sequence#, status from v$managed_standby;
## if you are using a logical standby then you need to check the following to confirm the redo has been
## applied
check that redo has been applied sql> select applied_scn, latest_scn, mining_scn from v$logstdby_progress;
3
(logical)
## if the mining scn is behind you may have a gap check this by using the following
## confirm that the prepare has started to happen, you should see "preparing dictionary"
Prepare the logical standby 10 sql> select switchover_status from v$database;
## wait a while until the dictionary is built and sent and you should see "preparing switchover"
sql> select switchover_status from v$database;
## you should now see its in the state of "to logical standby"
Check primary database state 11
sql> select switchover_status from v$database;
## On the primary
sql> alter database prepare to switchover cancel;
the last chance to CANCEL the
12
switchover (no going back after this) ## on the logical
sql> alter database prepare to switchover cancel;
switchover the primary to a logical
13 sql> alter database commit to switchover to logical standby;
standby
## check that its ready to become the primary, you should see "to primary"
select name, value, time_computed from v$dataguard_stats where name like '%lag%';
Check redo applied 1
## You can also use the SCN number
http://www.datadisk.co.uk/html_docs/oracle_dg/cheatsheet.htm 5/6
11/29/2017 Data Guard - cheatsheet
FAILOVER_SCN
-----------------------------------------------
7658841
## Now flashback the old primary to this SCN and start in mount mode
startup mount;
bring back the old primary
1 flashback database to scn 7658841;
(physical standby) alter database convert to physical standby;
shutdown immediate;
startup mount;
## hopefully the old primary will start to resolve any gap issues at the next log switch, which means we can start the MRP
## process to get this standby going to catchup as fast as possible
alter database recover managed standby database using current logfile disconnect;
## eventually the missing redos will be sent to the standby and applied, bring us back to synchronization again.
## again we need to obtained the SCN
select merge_change# as flashback_scn, processed_change# as recovery_scn from dba_logstdby_history where stream_sequence# = (selec
max(stream_sequence#)-1 from dba_logstdby_history);
flashback_scn recovery_scn
---------------------------------------------------------
7658941 7659568
## Now flashback the old primary to this SCN and start in mount mode
startup mount;
flashback database to scn 7658841;
alter database convert to physical standby;
shutdown immediate;
startup mount;
## Now we need to hand feed the archive logs from the primary to the standby (old primary) into the MRP
## process, so lets get those logs (run on the primary)
bring back the old primary select file_name from dba_logstdby_log where first_changed# <= recovery_scn and next_change# > flashback_scn;
2
(logical standby) ## Now you will hopefully have a short list of the files you need, now you need to register them with
## the standby database (old primary)
## Now you can recover up to the SCN but not including the one you specify
recover managed standby database until change 7659568;
## Now the standby database becomes a logical standby as up to this point it has been a physical one.
alter database active standby database;
## Lastly you need tell your new logical standby to ask the primary for a new copy of the dictionary and
## all the redo in between. The SQL Apply will connect to the new primary using the database link and
## retrieve the LogMiner dictionary, once the dictionary has been built, SQL Apply will apply all the
## redo sent from the new primary and get itself synchronized
create public database link reinstatelogical connect to system identified by password using 'service_name_of_new_primary_database
http://www.datadisk.co.uk/html_docs/oracle_dg/cheatsheet.htm 6/6