dba:oracle:docs:dataguard_mini-howto
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
dba:oracle:docs:dataguard_mini-howto [2023/01/31 08:22] – removed - external edit (Unknown date) 127.0.0.1 | dba:oracle:docs:dataguard_mini-howto [2023/01/31 08:22] (current) – ↷ Page moved from dba:oracle:dataguard_mini-howto to dba:oracle:docs:dataguard_mini-howto dodger | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== [DOC] Summary of Dataguard creation ====== | ||
+ | ===== creation ===== | ||
+ | * create the db (i mean, the master one) | ||
+ | * modify tnsnames.ora | ||
+ | <code sql> | ||
+ | CIBERDB = | ||
+ | (DESCRIPTION = | ||
+ | (ADDRESS_LIST = | ||
+ | (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)) | ||
+ | ) | ||
+ | (CONNECT_DATA = | ||
+ | (SERVICE_NAME = CIBERDB) | ||
+ | ) | ||
+ | ) | ||
+ | |||
+ | CIBERSTB = | ||
+ | (DESCRIPTION = | ||
+ | (ADDRESS_LIST = | ||
+ | (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521)) | ||
+ | ) | ||
+ | (CONNECT_DATA = | ||
+ | (SERVICE_NAME = CIBERSTB) | ||
+ | ) | ||
+ | ) | ||
+ | </ | ||
+ | * replace the orapw (as ORACLE) | ||
+ | <code sql> | ||
+ | / | ||
+ | mv -fv / | ||
+ | cp -pfv / | ||
+ | </ | ||
+ | * broadcast the orapw file (as root): | ||
+ | <code sql> | ||
+ | rsync -av / | ||
+ | </ | ||
+ | * enable archiving | ||
+ | <code sql> | ||
+ | shutdown immediate ; | ||
+ | startup mount; | ||
+ | alter database archivelog; | ||
+ | ALTER DATABASE FORCE LOGGING; | ||
+ | alter database open ; | ||
+ | </ | ||
+ | * create the stby redos: | ||
+ | <code SQL> | ||
+ | ALTER DATABASE ADD STANDBY LOGFILE (' | ||
+ | ALTER DATABASE ADD STANDBY LOGFILE (' | ||
+ | ALTER DATABASE ADD STANDBY LOGFILE (' | ||
+ | ALTER DATABASE ADD STANDBY LOGFILE (' | ||
+ | </ | ||
+ | * change multiple params for data guard: | ||
+ | <code SQL> | ||
+ | ALTER SYSTEM SET remote_login_passwordfile = SHARED scope=spfile; | ||
+ | ALTER SYSTEM SET LOG_ARCHIVE_CONFIG=' | ||
+ | ALTER SYSTEM SET log_archive_dest_1=' | ||
+ | ALTER SYSTEM SET log_archive_dest_2=' | ||
+ | ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=spfile | ||
+ | ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=spfile | ||
+ | alter system set FAL_SERVER=CIBERSTB Scope=BOTH; | ||
+ | alter system set FAL_CLIENT=CIBERDB SCOPE=BOTH; | ||
+ | ALTER SYSTEM | ||
+ | ALTER SYSTEM | ||
+ | </ | ||
+ | * rman it | ||
+ | <code SQL> | ||
+ | rman target / | ||
+ | run { | ||
+ | ALLOCATE CHANNEL ch1 DEVICE TYPE DISK MAXPIECESIZE = 16G; | ||
+ | crosscheck archivelog all; | ||
+ | delete force noprompt expired archivelog all; | ||
+ | backup full as backupset filesperset 64 | ||
+ | database format '/ | ||
+ | plus archivelog format '/ | ||
+ | sql " | ||
+ | sql "alter database backup controlfile to trace as ''/ | ||
+ | } | ||
+ | </ | ||
+ | * restart in mount the DB | ||
+ | <code SQL> | ||
+ | shutdown immediate ; | ||
+ | startup mount ; | ||
+ | </ | ||
+ | * add the stby to oratab in node2: | ||
+ | <code SQL> | ||
+ | CIBERSTB:/ | ||
+ | </ | ||
+ | * Transfer the backup to node2 | ||
+ | * modify the init.ora (take care with that): | ||
+ | <code SQL> | ||
+ | cd / | ||
+ | cat initCIBERDB.ora | egrep -v " | ||
+ | cat >> initCIBERSTB.ora <<EOF | ||
+ | *.db_create_file_dest=' | ||
+ | *.db_file_name_convert=' | ||
+ | *.db_unique_name=' | ||
+ | *.db_recovery_file_dest=' | ||
+ | *.fal_client=' | ||
+ | *.fal_server=' | ||
+ | *.log_archive_config=' | ||
+ | *.log_archive_dest_1=' | ||
+ | *.log_file_name_convert=' | ||
+ | *.log_archive_dest_2=' | ||
+ | EOF | ||
+ | </ | ||
+ | * Startup de stby: | ||
+ | <code sql> | ||
+ | startup nomount pfile=/ | ||
+ | </ | ||
+ | * Copy the spfile to the correct location | ||
+ | <code sql> | ||
+ | cp / | ||
+ | </ | ||
+ | * Create spfile | ||
+ | <code sql> | ||
+ | Create spfile from pfile; | ||
+ | </ | ||
+ | * Rman in the STBY: | ||
+ | <code sql> | ||
+ | rman auxiliary / target sys/ | ||
+ | DUPLICATE TARGET DATABASE FOR STANDBY; | ||
+ | </ | ||
+ | * Query de stby status: | ||
+ | <code sql> | ||
+ | Select DATABASE_ROLE FROM V$DATABASE ; | ||
+ | </ | ||
+ | * Start the redo receiver: | ||
+ | <code sql> | ||
+ | ALTER DATABASE RECOVER MANAGED STANDBY DATABASE disconnect from session; | ||
+ | </ | ||
+ | * Open the primary: | ||
+ | <code sql> | ||
+ | alter database open; | ||
+ | Alter system switch logfile; | ||
+ | </ | ||
+ | * Query the primary status (must be valid): | ||
+ | <code sql> | ||
+ | Select Status, Error from v$Archive_dest where dest_id=2; | ||
+ | </ | ||
+ | * Query the apply status on the stby: | ||
+ | <code sql> | ||
+ | SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY; | ||
+ | SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== switchover to standby ===== | ||
+ | * On the Primary: | ||
+ | <code sql> | ||
+ | Alter Database Commit to Switchover to Physical Standby with session Shutdown; | ||
+ | shutdown immediate ; | ||
+ | startup mount ; | ||
+ | </ | ||
+ | * Check the status of the db (the old primary): | ||
+ | <code sql> | ||
+ | Select Database_role from v$database; | ||
+ | </ | ||
+ | * And start the MRP process: | ||
+ | <code sql> | ||
+ | Alter Database Recover Managed Standby Database Disconnect; | ||
+ | </ | ||
+ | * On the STBY HOST (the new primary) stop the MRP: | ||
+ | <code sql> | ||
+ | Alter database Recover Managed Standby Database Cancel; | ||
+ | </ | ||
+ | * AND change the role: | ||
+ | <code sql> | ||
+ | Alter Database Commit to Switchover to PRIMARY with session Shutdown; | ||
+ | </ | ||
+ | * check it: | ||
+ | <code sql> | ||
+ | Select Database_role from v$Database; | ||
+ | </ | ||
+ | |||
+ | |||
+ | QUERY FOR CONTROL_FILES TO ASSURE THE CORRECT ONE'S ARE WORKING!!! | ||
+ | |||
+ | * Restart the new primary: | ||
+ | <code sql> | ||
+ | shutdown immediate ; | ||
+ | startup; | ||
+ | </ | ||
+ | * CHECK status | ||
+ | <code sql> | ||
+ | Select Database_role from v$Database; | ||
+ | Select Status, Error from v$Archive_dest where dest_id=2; | ||
+ | SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY; | ||
+ | SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | * It's possible that you need to alter the control files, in that case, you must query asmcmd for the actual ones. | ||
+ | <code sql> | ||
+ | ALTER SYSTEM SET CONTROL_FILES=' | ||
+ | </ | ||
+ | |||
+ | * Make the standby create by their own the datafiles: | ||
+ | <code sql> | ||
+ | ALTER SYSTEM SET standby_file_management=AUTO | ||
+ | </ | ||
+ | |||
+ | ===== Setting up DataGuard Broker ===== | ||
+ | * Query the status: | ||
+ | <code sql> | ||
+ | show parameter broker ; | ||
+ | </ | ||
+ | * Start it | ||
+ | <code sql> | ||
+ | alter system set dg_broker_start=true scope=both; | ||
+ | </ | ||
+ | * watch alert to see the startup process | ||
+ | * start the CLI | ||
+ | <code sql> | ||
+ | dgmgrl ' | ||
+ | </ | ||
+ | * create the configuration: | ||
+ | <code sql> | ||
+ | create configuration ' | ||
+ | </ | ||
+ | * Add the standby: | ||
+ | <code sql> | ||
+ | add database ' | ||
+ | </ | ||
+ | * Review the the config: | ||
+ | <code sql> | ||
+ | show configuration; | ||
+ | </ | ||
+ | * Enable the config: | ||
+ | <code sql> | ||
+ | enable configuration; | ||
+ | </ | ||
+ | * Perform a swithover: | ||
+ | <code sql> | ||
+ | switchover to ' | ||
+ | show database verbose ' | ||
+ | </ | ||
+ | |||
+ | ===== From Physical Standby to Snapshot ===== | ||
+ | In the Stby, of course: | ||
+ | <code sql> | ||
+ | Alter database Recover Managed Standby Database Cancel; | ||
+ | </ | ||
+ | Ensure that the database is mounted, but not open. | ||
+ | <code sql> | ||
+ | ALTER DATABASE CONVERT TO SNAPSHOT STANDBY; | ||
+ | </ | ||
+ | |||
+ | ===== From Snapshot to Physical Standby ===== | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== Status Querys ====== | ||
+ | |||
+ | ===== ROLE of the connected DB ===== | ||
+ | <code sql> | ||
+ | ===== Status of the REDO shipping to STBY ===== | ||
+ | Maybe there are more than 1 stby database, so '' | ||
+ | <code sql> | ||
+ | |||
+ | ===== Determine the most recently archived redo log file ===== | ||
+ | <code sql> | ||
+ | SELECT MAX(SEQUENCE# | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== List of archived_log ordered ===== | ||
+ | <code sql> | ||
+ | SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# ; | ||
+ | </ | ||
+ | ===== Determine the most recently archived redo log file at each redo transport destination ===== | ||
+ | <code sql> | ||
+ | COL DESTINATION FORMAT A30 ; | ||
+ | SELECT DESTINATION, | ||
+ | FROM V$ARCHIVE_DEST_STATUS - | ||
+ | WHERE STATUS <> ' | ||
+ | </ | ||
+ | ===== DataGuard STATS ===== | ||
+ | on the slave | ||
+ | <code sql> | ||
+ | col SOURCE_DB_UNIQUE_NAME format a15 | ||
+ | col unit format a30 | ||
+ | col TIME_COMPUTED format a30 | ||
+ | col DATUM_TIME format a30 | ||
+ | col VALUE FORMAT A18; | ||
+ | SELECT * FROM V$DATAGUARD_STATS ; | ||
+ | </ | ||
+ | ===== DataGuard LOG ===== | ||
+ | on any node | ||
+ | <code sql> | ||
+ | COL FACILITY FORMAT A40; | ||
+ | COL SEVERITY FORMAT A30; | ||
+ | COL MESSAGE FORMAT A120; | ||
+ | SELECT * FROM V$DATAGUARD_STATUS ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Standby Apply process status ===== | ||
+ | <code sql> | ||
+ | COL PID format A10; | ||
+ | COL CLIENT_PID FORMAT A10 ; | ||
+ | COL CLIENT_DBID | ||
+ | COL GROUP# FORMAT A12 ; | ||
+ | select * from V$MANAGED_STANDBY ; | ||
+ | </ | ||
+ | |||
+ | ===== Log History ===== | ||
+ | <code sql> | ||
+ | SELECT THREAD#, SEQUENCE#, first_time, FIRST_CHANGE#, | ||
+ | </ |