You are on page 1of 31

Arkansas Banner Users Group (ABUG) 2006

Crashes Happen - Downtime Won't with Data Guard
Stephen Rea
Monday, April 24, 2006 11:30 AM

Session Rules of Etiquette
   

No smokin' No drinkin' No cussin' No tobaccer spittin' No tomater throwin'

Data Guard - Oracle's Answer to Disaster Recovery

  

See how to quickly implement a Data Guard physical standby database in a day. Learn how to switch over to your standby database in minutes. Possibly offload your batch reporting workload to your standby database. Replace your forebodings about crashes with "Don't worry ... be happy!"

Oracle Data Guard Concepts and Administration Release 2 (9.2)

Data Guard Flow (Oracle 9i)

Data Guard Flow (Oracle 10g)

Data Guard Protection Modes

Maximum Performance
– Updates committed to primary and sent to standby without waiting to see if they were applied to standby – Pros: Little or no effect on performance of primary – Cons: Slight chance of lost transactions (on failover)

Maximum Availability (we will implement this one)
– Attempts to apply updates to standby before committed to primary – Lowers protection to Maximum Performance temporarily if updates can't be applied to standby – Pros: Primary continues unaffected if connection to standby is lost or the updates are delayed – Cons: Slight performance hit on primary; lost

Data Guard Protection Modes

Maximum Protection
– Assures updates are applied to standby before committed to primary – Pros: No chance of lost transactions – Cons: Primary will freeze if connection to standby is lost or the updates are delayed

Notes: We will be implementing a physical standby database locally on the same server here. Logical standby databases are not covered. Implementing the standby on a remote server will be similar - just use a different IP address, and the standby instance

Primary Database Requirements for Data Guard

FORCE LOGGING must be enabled: SQL> select force_logging from v$database; SQL> alter database force logging; ARCHIVELOG mode and automatic archiving must be enabled: SQL> archive log list MAXLOGFILES >= (2 * Current Redo Log Groups) + 1: SQL> select records_used "Current Groups", records_total "Max Groups" from v$controlfile_record_section where type = 'REDO LOG';

listener.ora Additions

Define the standby database SID on the standby site:
(SID_DESC= (SID_NAME=PROD2) (ORACLE_HOME=/pgms/oracle/product/v9204) )
(in $ORACLE_HOME/network/admin/listener.ora)

tnsnames.ora Additions

Define the standby database connect string on the primary site:
myserver_prod2 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (Host = 123.45.67.89) -- whatever host IP has PROD2 (Port = 1521) ) ) (CONNECT_DATA = (SID = PROD2) ) ) (define myserver_prod and myserver_prod2 on both primary and standby sites for quick switchovers)

sqlnet.ora and /etc/oratab Additions

Enable dead connection detection on the primary and standby sites:
sqlnet.expire_time=2
(in $ORACLE_HOME/network/admin/sqlnet.ora)

Add the standby database's entry to /etc/oratab on the standby site:
PROD2:/pgms/oracle/product/v9204:N

Standby Database Parameter File

Create the initPROD2.ora parameter file to be used for the standby database (done from primary database): – If your primary is using an spfile: $ sqlplus "/ as sysdba" SQL> create pfile='$ORACLE_HOME/dbs/initPROD2.ora' from spfile; – Else, if your primary is using a pfile: $ cp -p $ORACLE_HOME/dbs/initPROD.ora $ORACLE_HOME/dbs/initPROD2.ora Note: We will be modifying both the primary and

Standby Database Parameters (changes in copy of primary's values)
Change pathnames, such as control_files, background_dump_dest, core_dump_dest, user_dump_dest, and audit_file_dest, and add: # log_archive_dest = /orcl/oradata/PROD2/archivelogs log_archive_dest_1 = 'LOCATION=/orcl/oradata/PROD2/archivelogs MANDATORY' # for switchover log_archive_dest_state_1 = ENABLE # for switchover log_archive_dest_2 = 'SERVICE=myserver_prod LGWR SYNC' # for switchover log_archive_dest_state_2 = ENABLE # for switchover standby_archive_dest = /orcl/oradata/PROD2/archivelogs standby_file_management = AUTO # or MANUAL for raw devices remote_archive_enable = TRUE # TRUE or RECEIVE, change RECEIVE to SEND on switchover instance_name = PROD2 lock_name_space = PROD2 # use when primary and standby on same system; same as instance_name fal_server = myserver_prod # "fal" is Fetch Archive Log, for log gap resolution fal_client = myserver_prod2

Primary Database Parameters (changes in primary's values)
#log_archive_dest = /orcl/oradata/PROD/archivelogs log_archive_dest_1 = 'LOCATION=/orcl/oradata/PROD/archivelogs MANDATORY' log_archive_dest_state_1 = ENABLE log_archive_dest_2 = 'SERVICE=myserver_prod2 LGWR SYNC' log_archive_dest_state_2 = ENABLE standby_archive_dest = /orcl/oradata/PROD/archivelogs # for switchover standby_file_management = AUTO # for switchover; or MANUAL for raw devices remote_archive_enable = TRUE # TRUE or SEND, change SEND to RECEIVE on switchover instance_name = PROD lock_name_space = PROD # use when primary and standby on same system; same as instance_name fal_server = myserver_prod2 # for switchover fal_client = myserver_prod # for switchover db_file_name_convert = ('/PROD2/','/PROD/') # for switchover log_file_name_convert = ('/PROD2/','/PROD/') # for switchover

Standby Database Datafiles, etc.

Create the standby control file from the primary database:
SQL> alter database create standby controlfile as '/orcl/oradata/PROD2/ctrl_PROD_01.ctl';

Shut down the primary database and copy or FTP its datafiles, redo log files, and the just-created standby parameter file and standby control file, to the standby site.

Standby Database Datafiles, etc.

Copy the standby control file on the standby site to the other file names listed in the control_files init.ora parameter. Create the standby's password file, if needed, on the standby site:
$ orapwd file=$ORACLE_HOME/dbs/orapwPROD2 password=<sys password> entries=5

Reload the listener on the primary and standby

Standby Database Startup

Start the standby database in nomount mode, create the spfile if wanted, mount the standby database, and change to managed recovery:
$ . oraenv PROD2 $ sqlplus "/ as sysdba" SQL> create spfile from pfile; SQL> startup nomount SQL> alter database mount standby database; SQL> alter database recover managed standby database disconnect from session;

Primary Database Startup

If your primary is using an spfile, set the primary database parameters in the spfile as listed earlier. Sample "alter system" commands are shown below:
SQL> startup nomount SQL> alter system reset log_archive_dest scope=spfile sid='*'; SQL> alter system set log_archive_dest_1 = 'LOCATION=/orcl/oradata/PROD/archivelogs MANDATORY' scope=spfile; … etc … SQL> shutdown

Primary Database Startup

Start up the primary database with the new parameters:
SQL> startup

Start archiving to the standby database by issuing a log switch:
SQL> alter system switch logfile;

Congratulations! You now have a working standby database for your primary database. But wait … There's more …

Add Standby Redo Log Groups to Standby Database

Create standby redo log groups on standby database (start with next group number; create one more group than current number of groups) after switching out of managed recovery mode: SQL> sqlplus "/ as sysdba" SQL> alter database recover managed standby database cancel; SQL> alter database open read only; SQL> select max(group#) maxgroup from v$logfile; SQL> select max(bytes) / 1024 "size (K)" from v$log; SQL> alter database add standby logfile group 4 ('/orcl/oradata/PROD2/stby_log_PROD_4A.rdo', '/orcl/oradata/PROD2/stby_log_PROD_4B.rdo') size 4096K; … etc … SQL> column member format a55

Add Tempfile To Standby

Add a tempfile to the standby database for switchover or read-only access, then, switch back to managed recovery:
SQL> alter tablespace temp add tempfile '/data/oradata/PROD2/temp_PROD_01.dbf' size 400064K reuse; SQL> alter database recover managed standby database disconnect from session; SQL> select * from v$tempfile; SQL> exit

Add Standby Redo Log Groups to Primary Database

Create standby logfile groups on the primary database for switchovers (start with next group number; create one more group than current number of groups):
$ sqlplus "/ as sysdba" SQL> select max(group#) maxgroup from v$logfile; SQL> select max(bytes) / 1024 "size (K)" from v$log; SQL> alter database add standby logfile group 4 ('/orcl/oradata/PROD/stby_log_PROD_4A.rdo', '/orcl/oradata/PROD/stby_log_PROD_4B.rdo') size 4096K; … etc … SQL> column member format a55 SQL> select vs.group#,vs.bytes,vl.member from v$standby_log vs,

Switch To Maximum Availability Protection Mode

Switch to the desired "maximum availability" protection mode on the primary database (from the default "maximum performance"):
select value from v$parameter where name = 'log_archive_dest_2'; -- must show LGWR SYNC SQL> shutdown normal SQL> startup mount SQL> alter database set standby database to maximize availability; SQL> alter database open;
SQL>

Test Updates Propagating to Standby

Try some edits on the primary and check to see that the changes made it to the standby:
– On the primary: SQL> update spriden set spriden_first_name = 'James' where spriden_pidm = 1234 and spriden_change_ind is null; SQL> commit; SQL> alter system switch logfile; – On the standby (wait a few seconds first): SQL> alter database recover managed standby database cancel; SQL> alter database open read only; SQL> select * from spriden where spriden_pidm = 1234 and spriden_change_ind is null; SQL> alter database recover managed standby database disconnect from session;

Running Reports with a Standby

Set standby to Read Only to run reports:
SQL> alter database recover managed standby database cancel; SQL> alter database open read only; SQL> @myreport.sql SQL> alter database recover managed standby database disconnect from session;

Shutdown and Startup for Standby Database

To shut down a standby database: – If in read-only access, switch back to managed recovery (after terminating any other active sessions): SQL> alter database recover managed standby database disconnect from session; – Cancel managed recovery and shutdown: SQL> alter database recover managed standby database cancel; SQL> shutdown immediate To start up a standby database: SQL> startup nomount

Switchover - Swapping Primary and Standby
 

End all activities on the primary and standby database. On the primary (switchover status should show "TO STANDBY"): SQL> select database_role,switchover_status from v$database; SQL> alter database commit to switchover to physical standby; SQL> shutdown immediate SQL> startup nomount SQL> alter database mount standby database; On the standby (switchover status should show "SWITCHOVER PENDING"): SQL> select database_role,switchover_status from v$database; SQL> alter database commit to switchover to primary; SQL> shutdown normal SQL> startup On the primary: SQL> alter database recover managed standby database disconnect from session; On the standby: SQL> alter system archive log current; Change tnsnames.ora entry on all servers to swap the connect

Failover - Standby Becomes Primary
  

End all activities on the standby database. May need to resolve redo log gaps (not shown here). On the standby: SQL> alter database recover managed standby database finish; SQL> alter database commit to switchover to primary; SQL> shutdown immediate SQL> startup Change tnsnames.ora entry on all servers to point the primary connect string to the standby database.

Summary

   

Data Guard provides an automated standby database which can essentially eliminate downtime of your production data. Setup is easy and fairly straightforward. Maintenance is minimal. Switchovers and failovers can be done within a few minutes. Reporting can be offloaded to the standby to ease the workload on the

Whew! Glad That’s Over! Any Questions?

Presenter Information

  

Stephen Rea, Oracle Database Administrator Univ of AR Cooperative Extension Service 2301 S. University Avenue P.O. Box 391 Little Rock, AR 72203 501-671-2207 srea@uaex.edu http://www.uaex.edu/srea/dataguard.h