🔄 Oracle Data Guard
Data Guard Architecture
| Component |
Description |
Purpose |
| Primary Database |
Production DB (read-write) |
Active workload |
| Standby Database |
Replica synchronized |
Disaster recovery |
| Redo Transport |
Ships redo logs |
Data replication |
| Apply Services |
Applies redo |
Keep standby sync'd |
| Role Management |
Switchover/failover |
DR automation |
Standby Types
| Type |
Data Format |
Use Case |
| Physical Standby |
Block-for-block |
Exact replica, fast failover |
| Logical Standby |
SQL-based |
Open for queries |
| Snapshot Standby |
Writable copy |
Testing, development |
Enable Archive Log Mode
SELECT LOG_MODE FROM V$DATABASE;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1=
'LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES)';
⚙️ Configure Data Guard
Primary Database Setup
ALTER DATABASE FORCE LOGGING;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=
'SERVICE=standby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)';
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG=
'DG_CONFIG=(primary,standby)';
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc';
ALTER DATABASE ADD STANDBY LOGFILE
'/u01/oradata/standby_redo01.log' SIZE 200M;
Create Physical Standby
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
RMAN> BACKUP CURRENT CONTROLFILE FOR STANDBY;
RMAN> RESTORE CONTROLFILE FROM '/backup/control.ctl';
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT FROM SESSION;
💡 Tip: Use Data Guard Broker (DGMGRL) for easier management and automated failover.
🔧 Data Guard Operations
Switchover (Planned)
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY
WITH SESSION SHUTDOWN;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT;
Failover (Unplanned)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
ALTER DATABASE OPEN;
Active Data Guard
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT;
SELECT NAME, VALUE, UNIT, TIME_COMPUTED
FROM V$DATAGUARD_STATS
WHERE NAME IN ('apply lag', 'transport lag');
Snapshot Standby
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
ALTER DATABASE OPEN;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT;
📊 Monitor Data Guard
Monitoring Queries
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
SELECT DEST_ID, STATUS, DESTINATION, ERROR
FROM V$ARCHIVE_DEST
WHERE STATUS <> 'INACTIVE';
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#
FROM V$MANAGED_STANDBY;
SELECT NAME, VALUE, DATUM_TIME, TIME_COMPUTED
FROM V$DATAGUARD_STATS;
SELECT * FROM V$ARCHIVE_GAP;
Data Guard Broker
ALTER SYSTEM SET DG_BROKER_START=TRUE;
DGMGRL> CONNECT sys/password@primary
DGMGRL> CREATE CONFIGURATION dg_config AS
PRIMARY DATABASE IS primary
CONNECT IDENTIFIER IS primary;
DGMGRL> ADD DATABASE standby AS
CONNECT IDENTIFIER IS standby;
DGMGRL> ENABLE CONFIGURATION;
DGMGRL> SHOW CONFIGURATION;
DGMGRL> SWITCHOVER TO standby;
⚠️ Warning: Always test switchover monthly and failover quarterly in non-production.
🔗 Oracle RAC
RAC Architecture
| Component |
Description |
Purpose |
| Cluster Nodes |
Multiple servers |
Load balancing, HA |
| Shared Storage |
ASM or SAN |
Single DB, multiple instances |
| Cache Fusion |
Inter-instance comm |
Share data blocks |
| CRS |
Cluster Ready Services |
Node membership, failover |
| Interconnect |
High-speed network |
Cache fusion traffic |
RAC Administration
SELECT INST_ID, INSTANCE_NAME, HOST_NAME, STATUS
FROM GV$INSTANCE
ORDER BY INST_ID;
SELECT INST_ID, INSTANCE_NUMBER, THREAD#
FROM GV$INSTANCE;
SELECT NAME, VALUE
FROM GV$SYSSTAT
WHERE NAME LIKE '%gc%'
ORDER BY INST_ID;
SELECT NAME, NETWORK_NAME
FROM DBA_SERVICES;
RAC Service Management
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'app_service',
network_name => 'app_service.example.com'
);
DBMS_SERVICE.START_SERVICE('app_service');
END;
/
$ srvctl status database -d orcl
$ srvctl start instance -d orcl -i orcl1
$ srvctl stop instance -d orcl -i orcl2
$ srvctl relocate service -d orcl -s app_service -i orcl1 -t orcl2
🎯 Best Practices
Data Guard Best Practices
- Use dedicated network for redo transport
- Ensure standby has equal/greater storage
- Test switchover monthly, failover quarterly
- Alert on apply lag > 30 seconds
- Use Data Guard Broker for automation
- Active Data Guard requires license
- Use Far Sync for long-distance zero data loss
RAC Best Practices
- Use dedicated redundant 10GbE+ interconnect
- Use services for load balancing
- Use ASM for shared storage
- Partition workload by services
- Monitor GCS/GES waits
- Use rolling patches for zero downtime
- Test instance failover regularly
✓ Learning Checklist - Module 22
- Understand Data Guard architecture
- Configure physical standby from backup
- Perform switchover (planned)
- Perform failover (unplanned)
- Monitor redo apply lag
- Use Data Guard Broker (DGMGRL)
- Configure Active Data Guard
- Understand RAC architecture
- Query RAC instance status
- Create and manage RAC services