150 lines
4.4 KiB
Markdown
150 lines
4.4 KiB
Markdown
|
|
# Dataguard configuration
|
||
|
|
|
||
|
|
DGMGRL> show configuration
|
||
|
|
|
||
|
|
Configuration - asty
|
||
|
|
|
||
|
|
Protection Mode: MaxPerformance
|
||
|
|
Members:
|
||
|
|
astyprd - Primary database
|
||
|
|
astydrp - Physical standby database
|
||
|
|
|
||
|
|
|
||
|
|
DGMGRL> show database 'astydrp'
|
||
|
|
|
||
|
|
Database - astydrp
|
||
|
|
|
||
|
|
Role: PHYSICAL STANDBY
|
||
|
|
Intended State: APPLY-ON
|
||
|
|
Transport Lag: 0 seconds (computed 1 second ago)
|
||
|
|
Apply Lag: 0 seconds (computed 1 second ago)
|
||
|
|
Average Apply Rate: 803.00 KByte/s
|
||
|
|
Real Time Query: OFF
|
||
|
|
Instance(s):
|
||
|
|
ASTYDRP
|
||
|
|
|
||
|
|
# Simulate a gap
|
||
|
|
|
||
|
|
Stop the standby database.
|
||
|
|
|
||
|
|
On primary, switch 3-4 times the archivelog on primary and delete all archived logs:
|
||
|
|
|
||
|
|
SQL> alter system archive log current;
|
||
|
|
RMAN> delete noprompt force archivelog all;
|
||
|
|
|
||
|
|
To complicate the situation, add 2 new datafile and create a new tablespace on primary.
|
||
|
|
|
||
|
|
SQL> alter tablespace SYSTEM add datafile size 10M autoextend OFF;
|
||
|
|
SQL> alter tablespace SYSAUX add datafile size 10M autoextend OFF;
|
||
|
|
SQL> create tablespace NAL_HUTTA datafile size 10M autoextend ON next 10M;
|
||
|
|
|
||
|
|
Repeat switch/delete archivelog operation on primary:
|
||
|
|
|
||
|
|
SQL> alter system archive log current;
|
||
|
|
RMAN> delete noprompt force archivelog all;
|
||
|
|
|
||
|
|
Start the standby database in **MOUNT** mode, let it trying to resolve the gap and check the status of the syncronisation.
|
||
|
|
On primary:
|
||
|
|
|
||
|
|
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
|
||
|
|
set lines 200
|
||
|
|
|
||
|
|
select THREAD#, max(SEQUENCE#), max(FIRST_TIME),max(NEXT_TIME),max(COMPLETION_TIME)
|
||
|
|
from gv$archived_log group by THREAD#;
|
||
|
|
|
||
|
|
On standby:
|
||
|
|
|
||
|
|
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
|
||
|
|
set lines 200
|
||
|
|
|
||
|
|
select THREAD#, max(SEQUENCE#), max(FIRST_TIME),max(NEXT_TIME),max(COMPLETION_TIME)
|
||
|
|
from gv$archived_log
|
||
|
|
where APPLIED='YES' group by THREAD#;
|
||
|
|
|
||
|
|
|
||
|
|
# Syncronize the standby
|
||
|
|
|
||
|
|
Cancel **MRP** on standby:
|
||
|
|
|
||
|
|
DGMGRL> edit database 'astydrp' set STATE='LOG-APPLY-OFF';
|
||
|
|
|
||
|
|
Try to recover the standby and note down the required `SCN`:
|
||
|
|
|
||
|
|
SQL> recover standby database;
|
||
|
|
|
||
|
|
Normaly it should be the same as:
|
||
|
|
|
||
|
|
SQL> select 1+CURRENT_SCN from v$database;
|
||
|
|
|
||
|
|
On primary, identify all datafiles created after this `SCN`; in my example `SCN=5681090`
|
||
|
|
|
||
|
|
SQL> select FILE#,NAME from v$datafile where CREATION_CHANGE# >= 5681090;
|
||
|
|
|
||
|
|
Backup datafiles and generate a new standby controlfile:
|
||
|
|
|
||
|
|
run{
|
||
|
|
set nocfau;
|
||
|
|
allocate channel ch01 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/temp/%d_%U_%s_%t.bck';
|
||
|
|
allocate channel ch02 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/temp/%d_%U_%s_%t.bck';
|
||
|
|
allocate channel ch03 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/temp/%d_%U_%s_%t.bck';
|
||
|
|
allocate channel ch04 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/temp/%d_%U_%s_%t.bck';
|
||
|
|
backup as compressed backupset datafile 17,18,19;
|
||
|
|
release channel ch01;
|
||
|
|
release channel ch02;
|
||
|
|
release channel ch03;
|
||
|
|
release channel ch04;
|
||
|
|
allocate channel ch01 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/temp/%d_%U_%s_%t.ctl';
|
||
|
|
backup current controlfile;
|
||
|
|
release channel ch01;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
Restart the standby in mode **NOMOUNT** and restore the standby controfile:
|
||
|
|
|
||
|
|
RMAN> restore standby controlfile from '/mnt/yavin4/tmp/_oracle_/orabackup/temp/ASTY_0l1678fs_21_1_1_21_1113825788.ctl';
|
||
|
|
|
||
|
|
Alternatively, you can restore the standby controfile from active database:
|
||
|
|
|
||
|
|
RMAN> restore standby controlfile from service ASTYPRD_DGMGRL;
|
||
|
|
|
||
|
|
Mount the standby database:
|
||
|
|
|
||
|
|
RMAN> alter database mount;
|
||
|
|
|
||
|
|
Restore and new datafiles:
|
||
|
|
|
||
|
|
RMAN> restore datafile 17,18,19;
|
||
|
|
|
||
|
|
Catalog recovery area and old standby datafiles:
|
||
|
|
|
||
|
|
RMAN> catalog start with '/data/ASTYDRP' noprompt;
|
||
|
|
RMAN> catalog start with '/fra/ASTYDRP' noprompt;
|
||
|
|
|
||
|
|
At this moment, because of fresh restored controlfile, Oracle see the datafiles as datafile copy:
|
||
|
|
|
||
|
|
RMAN> list datafilecopy all;
|
||
|
|
|
||
|
|
Switch database to copy:
|
||
|
|
|
||
|
|
RMAN> switch database to copy;
|
||
|
|
|
||
|
|
|
||
|
|
To recover standby using *from SCN* backupset, we can proceed from active database or using physical backupset:
|
||
|
|
|
||
|
|
rman auxiliary /
|
||
|
|
run {
|
||
|
|
allocate channel pri1 device type DISK;
|
||
|
|
allocate channel pri2 device type DISK;
|
||
|
|
allocate channel pri3 device type DISK;
|
||
|
|
allocate channel pri4 device type DISK;
|
||
|
|
recover database from service ASTYPRD_DGMGRL using compressed backupset section size 8G;
|
||
|
|
}
|
||
|
|
|
||
|
|
Clear standby redolog:
|
||
|
|
|
||
|
|
SQL> select 'ALTER DATABASE CLEAR LOGFILE GROUP '||GROUP#||';' from v$standby_log;
|
||
|
|
|
||
|
|
Enable **MRP**:
|
||
|
|
|
||
|
|
DGMGRL> edit database 'astydrp' set STATE='ONLINE';
|