Oracle Data Guard 12c Windows CDB1 primary & CDB2 physical standby
----CDB1 primary
$CDB1>
SQL>SELECT force_logging FROM v$database;
SQL>alter database force logging;
SQL>SELECT force_logging FROM v$database;
SQL>select group#, thread#, bytes from v$log;
---- recommended one more than redo log
SQL>
	alter database add standby logfile thread 1 ('C:\app\oracle\oradata\cdb1\standby_log_1.log') size 100M;
	alter database add standby logfile thread 1 ('C:\app\oracle\oradata\cdb1\standby_log_2.log') size 100M;
	alter database add standby logfile thread 1 ('C:\app\oracle\oradata\cdb1\standby_log_3.log') size 100M;
	alter database add standby logfile thread 1 ('C:\app\oracle\oradata\cdb1\standby_log_4.log') size 100M;
SQL>select group#, thread#, bytes  from v$standby_log;
SQL>alter user sysdg identified by oracle123 account unlock;
SQL>grant sysdg to c##jasonw identified by oracle123 container=all;
SQL>!clear

--SQL>alter system set log_archive_dest_1='Location=USE_DB_RECOVERY_FILE_DEST valid_for(ALL_LOGFILES, ALL_ROLES) db_unique_name=CDB1' scope=both;
--SQL>alter system set log_archive_dest_1='Location=C:\app\oracle\recovery_area valid_for(ALL_LOGFILES, ALL_ROLES) db_unique_name=CDB1' scope=both;
--SQL>alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST';

alter system set log_archive_config='DG_CONFIG=(CDB1,CDB2)' scope=both;
--alter system set log_archive_dest=' ' scope=both; --cannot use with DB_RECOVERY_FILE_DEST
alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=CDB1' scope=both;
alter system set log_archive_dest_2='SERVICE=CDB2 NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDB2' scope=both;
--alter system set log_archive_dest_3='SERVICE=CDB3 NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDB3' scope=both;

SQL>alter system set log_archive_dest_state_1='enable' scope=both;
SQL>alter system set log_archive_max_processes=4 scope=both;
SQL>alter system set log_archive_config='dg_config=(CDB1, CDB2)' scope=both;
SQL>alter system set standby_file_management='auto' scope=both;
or
SQL>alter system set standby_file_management=auto scope=both;
SQL>show pdbs;
SQL>quit
SQL>alter system set fal_server='CDB2' scope=both;
SQL>alter system set fal_client=CDB1 scope=both;
SQL>alter system set archive_lag_target=1800 scope=both;
----here below CDB2
$CDB2>mkdir -p C:\app\oracle\admin\cdb1\adump
$CDB2>mkdir -p C:\app\oracle\admin\cdb1\
$CDB2>mkdir -p C:\app\oracle\oradata\CDB2\pdb1
$CDB2>mkdir -p C:\app\oracle\oradata\CDB2\pdbseed
....
$CDB2>mkdir -p C:\app\oracle\fast_recovery_area\CDB2
$CDB2>vi C:\app\oracle\product\12.1.0\dbhome_1\database\initCDB2.ora
DB_NAME='CDB2'
DB_DOMAIN=''
:wq!
------------even better CDB2 pfile-------------------------------
###########################################
# Database Identification
###########################################
db_domain=""
db_name="CDB2"
fal_client='CDB2'
fal_server='CDB1'
log_archive_config='DG_CONFIG=(CDB1,CDB2)'
log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=CDB2'
log_archive_dest_2='SERVICE=CDB1 NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDB1'
log_archive_dest_3=' '
log_archive_max_processes=4
standby_file_management=auto
archive_lag_target=1800
-------------------------------------------------
$CDB2>vi /etc/oratab
CDB2:oracle_home ....:y
grid_home .....
$CDB2> . oraenv
CDB2
$CDB2>sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup nomount pfile=C:\app\oracle\product\12.1.0\dbhome_1\database\initCDB2.ora;
SQL>quit
$CDB2>
SET ORACLE_SID=CDB2
echo %ORACLE_SID%

$CDB2>rman target sys@CDB1 auxiliary sys@CDB2
target password
auxiliary password
???? allocate channel
???? allocate auxiliary channel
----password have to be the same for active duplicate
RMAN>
run {
duplicate target database for standby from active database
	spfile
	PARAMETER_VALUE_CONVERT 'C:\app\oracle\oradata\cdb1\CONTROLFILE', 'C:\app\oracle\oradata\CDB2\CONTROLFILE', 'C:\app\oracle\recovery_area\cdb1\CONTROLFILE', 'C:\app\oracle\fast_recovery_area\CDB2\CONTROLFILE'
        set db_unique_name='CDB2'
        SET DB_FILE_NAME_CONVERT 'CDB1', 'CDB2'
        SET LOG_FILE_NAME_CONVERT 'CDB1', 'CDB2'
	set fal_server='CDB1'
	nofilenamecheck;
}

sql 'alter database recover managed standby database disconnect;
RMAN>
----spfile init parameters are duplicated over and need to change
$CDB1>sqlplus / as sysdba
SQL>alter system set log_archive_dest_2='SERVICE=CDB2 REOPEN=15 ASYNC valid_for=(ONLINE_LOGFILES, PRIMARY_ROLE) db_unique_name=CDB2' scope=both;
SQL>alter system set log_archive_dest_2='SERVICE=CDB2 NOAFFIRM ASYNC NET_TIMEOUT=60 DELAY=180 VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=CDB2' scope=both;
SQL>!clear
$CDB2>
alter system set log_archive_config='DG_CONFIG=(CDB1,CDB2)' scope=both;
alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=CDB2' scope=both;
alter system set log_archive_dest_2='SERVICE=CDB1 NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDB1' scope=both;
alter system set log_archive_max_processes=4 scope=both;
alter system set standby_file_management='auto' scope=both;
alter system set archive_lag_target=1800 scope=both;
---- by RMAN duplicate ----alter database mount standby database;
alter database recover managed standby database disconnect from session;
$CDB2>
RMAN>quit
RMAN>!clear
CDB1>
select max(sequence#) from v$archived_log where applied='YES';
CDB2>
select max(sequence#) from v$archived_log where applied='YES';
CDB1>
SQL>ALTER SYSTEM SWITCH LOGFILE; ----asynchronorous, fast but ARCH process could fail, at risk
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT; ----synchronous, slow, waits for ACK, safer
CDB1>
select max(sequence#) from v$archived_log where applied='YES';
CDB2>
select max(sequence#) from v$archived_log where applied='YES';
----check both CDB1 & CDB2 ----
select db_unique_name,database_role,open_mode from v$database;
select name from v$datafile;
select group#,type,member from v$logfile;
SELECT THREAD#,SEQUENCE#,PROCESS,CLIENT_PROCESS,STATUS,BLOCKS FROM V$MANAGED_STANDBY;

---- stop redo apply ----
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
---- start real-time redo apply ----
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

---- post DG config ----
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
alter system switch logfile;
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
---- on standby ----
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
---- if to start ---- ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
SELECT THREAD#,SEQUENCE#,PROCESS,CLIENT_PROCESS,STATUS,BLOCK#,BLOCKS FROM V$MANAGED_STANDBY;
SELECT * FROM V$STANDBY_EVENT_HISTOGRAM WHERE NAME = 'apply lag' AND COUNT > 0;
---- on standby ----
SELECT name, value, datum_time, time_computed FROM V$DATAGUARD_STATS WHERE name like 'apply lag';
	select db_name  || ',' || 
	hostname || ',' || 
	al.thrd  || ',' || 
	almax  || ',' || 
	lhmax  || ',' ||
	applied_time || ',' || 
	to_char(almax - lhmax)  || ',' || 
	log_age_minutes || ',' ||
       dg_stat_applylag_sec || ',' ||
       dg_stat_transportlag_sec
	from
	(select name db_name from v$database),
	(select upper(substr(host_name,1,(decode(instr(host_name,'.'),0,length(host_name),
 	(instr(host_name,'.')-1))))) hostname
 	from v$instance),
	(select thread# thrd, max(sequence#) almax
 	from v$archived_log
 	where resetlogs_change#=(select resetlogs_change# from v$database)
 	group by thread#) al,
	(select thread# thrd, max(sequence#) lhmax, max(first_time) applied_time
 	from v$log_history
 	where first_time=(select max(first_time) from v$log_history)
 	group by thread#) lh,
	(select thread# thrd, round(to_number(sysdate - max(first_time))*24*60) log_age_minutes from v$log_history group by thread#) la,
       (select to_number(substr(value,instr(value,':',1,2)+1,length(value))) + 60 * to_number(substr(value,instr(value,':',1,1)+1,2)) dg_stat_applylag_sec from v$dataguard_stats where name ='apply lag'),
       (select to_number(substr(value,instr(value,':',1,2)+1,length(value))) + 60 * to_number(substr(value,instr(value,':',1,1)+1,2)) dg_stat_transportlag_sec from v$dataguard_stats where name ='transport lag')
	where al.thrd = lh.thrd
	and la.thrd(+)=lh.thrd;

	
	2nd OLL 11g reference:
	http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r1/prod/ha/dataguard/physstby/physstdby.htm
