[DataGuard] Creating a Physical Standby Database

Referencehttp://docs.oracle.com/cd/B19306_01/server.102/b14239/create_ps.htm 

Env:

OS:Windows Server 2003

Oracle: 11.2.0.3 

Primary Database: primary (db_unique_name)

Standby Database: standby (db_unique_name)

For convenience, the primary and standby database sit on the same machine. And using cold backup method to back up the primary database.

Primary DB Setup

1. Enable Archivelog mode

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            D:\oracle\ARCHIVED_LOG\primary\
Oldest online log sequence     37
Next log sequence to archive   39
Current log sequence           39
SQL>

2. Force Logging

SQL> alter database force logging;

3. Update the parameter files

SQL> create pfile='d:\oracle\oradata\primary\initPrimary.ora' from spfile;

File created.

 Open the file "initPrimary.ora", add the following entries in the file...

*.db_name='primary'
*.db_unique_name='primary'
*.log_archive_config='DG_CONFIG=(primary, standby)'
*.log_archive_dest_1='LOCATION=D:\oracle\ARCHIVED_LOG\primary\ VALID_FOR=(ALL_LOGFILES, ALL_ROLES) DB_UNIQUE_NAME=primary'
*.log_archive_dest_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=30
*.remote_login_passwordfile='EXCLUSIVE'

-- Specify the follwing parameters for primary/standby switchover

*.LOG_FILE_NAME_CONVERT='D:\oracle\oradata\standby\','D:\oracle\oradata\primary\'
*.DB_FILE_NAME_CONVERT='D:\oracle\oradata\standby\','D:\oracle\oradata\primary\'
*.STANDBY_FILE_MANAGEMENT='AUTO'
*.FAL_CLIENT='primary'
*.FAL_SERVER='standby'

Pay sprecial attention to the parameter "LOG_FILE_NAME_CONVERT" and "DB_FILE_NAME_CONVERT". These parameters are for "standby" db only, so put the primary database log(data) file ahead of standby database log(data) file. For example, in this case, the *primary* will be acted as standby db if switched over. Thus, you need to put "D:\oracle\oradata\standby\" before "D:\oracle\oradata\primary\". Besides, don't forget the "\" at the end of the file path. Otherwise, the Oracle will not recognise the log(db) file correctly.

Then we need to convert the pfile to spfile.

SQL> create spfile from pfile='d:\oracle\oradata\primary\initPrimary.ora';

Note: you may need to shutdown the instance before running the above command. 

4. Add the standby log group 

alter database add standby logfile ('D:\oracle\oradata\primary\standylog01.rdo') size 50M;
alter database add standby logfile ('D:\oracle\oradata\primary\standylog02.rdo') size 50M;
alter database add standby logfile ('D:\oracle\oradata\primary\standylog03.rdo') size 50M;
alter database add standby logfile ('D:\oracle\oradata\primary\standylog04.rdo') size 50M;

5. Full databse cold backup

Shutdown database and copy all the datafiles to the standby datafile folder -- "d:\oracle\oradata\standby\"

6. Backup the pfile for standby database usage

SQL> create pfile='d:\oracle\oradata\primary\initPrimary2.ora' from spfile;

7. Create standby control file for standby db use

SQL> STARTUP MOUNT;
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'd:\oracle\oradata\primary\standby.ctl';
SQL> ALTER DATABASE OPEN;

 Standby DB Setup


1. Create relevant folder for standby database.

For example:

   d:\oracle\oradata\standby    --  put all the primary backup data files in this folder

   d:\oracle\archived_log\standby

   D:\oracle\fast_recovery_area\standby 

  D:\oracle\admin\standby\adump

2. Modify the parameter file generated from primary database

*.audit_file_dest='D:\oracle\admin\standby\adump'
*.control_files='D:\oracle\oradata\standby\control01.ctl','D:\oracle\fast_recovery_area\standby\control02.ctl'
*.db_name='primary'
*.db_unique_name='standby'
*.diagnostic_dest='D:\oracle'
*.FAL_CLIENT='standby'
*.FAL_SERVER='primary'
*.log_archive_config='DG_CONFIG=(primary, standby)'
*.log_archive_dest_1='LOCATION=D:\oracle\ARCHIVED_LOG\standby\ VALID_FOR=(ALL_LOGFILES, ALL_ROLES) DB_UNIQUE_NAME=standby'
*.log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=30
*.LOG_FILE_NAME_CONVERT='D:\oracle\oradata\primary\','D:\oracle\oradata\standby\'
*.DB_FILE_NAME_CONVERT='D:\oracle\oradata\primary\','D:\oracle\oradata\standby\'
*.remote_login_passwordfile='EXCLUSIVE'
*.STANDBY_FILE_MANAGEMENT='AUTO'

Please note that the db_name is still "primary" (standby should have the same db_name as primary db), but the db_unique_name is "standby". Please also note the value set the parameter "LOG_ARCHIVE_DEST_1", "LOG_ARCHIVE_DEST_2", "LOG_FILE_NAME_CONVERT", "DB_FILE_NAME_CONVERT" (this time, put the *pimary* ahead of *standby*)

3. Update the tnsname.ora to add service names - primary and standby

PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dev.analytics.moodys.net)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PRIMARY)
    )
  )

STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dev.analytics.moodys.net)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = STANDBY)
    )
  )

 4. Create "standby" Oracle service and password file

oradim -new -sid standby

Don't use the parameter "intpwd" parameter to create the password file at the same time, that's...

oradim -new -sid standby -intpwd a

 Instead, use "orapwd" to create the passord file... 

orapwd file=D:\oracle\product\11.2.0\dbhome_2\database\PWDstandby.ORA entries=2 force=y ignorecase=y password=a

 Remember to set the "ingorecase" to "y". Otherwise, the following error may occur... 

MESSAGE
--------------------------------------------------------------------------------
PING[ARC1]: Heartbeat failed to connect to standby 'standby'. Error is 1031.
Error 1031 received logging on to the standby
PING[ARC1]: Heartbeat failed to connect to standby 'standby'. Error is 1031.
Error 1031 received logging on to the standby
PING[ARC1]: Heartbeat failed to connect to standby 'standby'. Error is 1031.
Error 1031 received logging on to the standby
PING[ARC1]: Heartbeat failed to connect to standby 'standby'. Error is 1031.
Error 1031 received logging on to the standby
PING[ARC1]: Heartbeat failed to connect to standby 'standby'. Error is 1031.
Error 1031 received logging on to the standby
PING[ARC1]: Heartbeat failed to connect to standby 'standby'. Error is 1031.

5. Restore the backup data files and standby control files 

Put the backup data files of primary database to the relevant directory -- d:\oracle\oradata\standby

Put the standby control file (standby.ctl) of the priamry database to the relevant directory -- d:\oracle\oradata\standby; d:\oracle\fast_recovery_area\standby  and rename the control files to control01.ctl and control02.ctl respectively.

6. Startup standby instance

C:\set oracle_sid=standby
C:\sqlplus sys/a as sysdba
SQL>create spfile from pfile='D:\oracle\oradata\standby\initStandby.ora';

7. Restore standby db and start redo apply

SQL> startup mount;
SQL> alter database recover managed standby database disconnect from session;

 Verify the Setup

1. Check standby db

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
standby

SQL> select sequence#, applied from v$archived_log order by sequence#;

 SEQUENCE# APPLIED
---------- ---------
        33 YES
        34 YES
        35 YES
        36 YES
        37 YES
        38 YES
        39 YES

7 rows selected.

SQL>

 2. Check the primary db

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
primary


SQL> select sequence#, thread#, fal, status, applied from v$archived_log where sequence# > 32 order by sequence#;

 SEQUENCE#    THREAD# FAL S APPLIED
---------- ---------- --- - ---------
        33          1 NO  A NO
        33          1 YES A YES
        34          1 NO  A NO
        34          1 YES A YES
        35          1 NO  A NO
        35          1 YES A YES
        36          1 NO  A NO
        36          1 YES A YES
        37          1 NO  A NO
        37          1 YES A YES
        38          1 NO  A YES
        38          1 NO  A NO
        39          1 NO  A YES
        39          1 NO  A NO

14 rows selected.

 

 3. Switch log file in primary

SQL> alter system switch logfile;

System altered.

 4. Check standby 

SQL> select sequence#, applied from v$archived_log order by sequence#;

 SEQUENCE# APPLIED
---------- ---------
        33 YES
        34 YES
        35 YES
        36 YES
        37 YES
        38 YES
        39 YES
        40 IN-MEMORY

8 rows selected.

SQL> select sequence#, applied from v$archived_log order by sequence#;

 SEQUENCE# APPLIED
---------- ---------
        33 YES
        34 YES
        35 YES
        36 YES
        37 YES
        38 YES
        39 YES
        40 YES

8 rows selected.

SQL>

 Please note there is one more record appeared -- sequence# 40 

5. Check the primary

SQL> select sequence#, thread#, fal, status, applied from v$archived_log where sequence# > 32 order by sequence#;

 SEQUENCE#    THREAD# FAL S APPLIED
---------- ---------- --- - ---------
        33          1 YES A YES
        33          1 NO  A NO
        34          1 NO  A NO
        34          1 YES A YES
        35          1 NO  A NO
        35          1 YES A YES
        36          1 NO  A NO
        36          1 YES A YES
        37          1 NO  A NO
        37          1 YES A YES
        38          1 NO  A YES
        38          1 NO  A NO
        39          1 NO  A YES
        39          1 NO  A NO
        40          1 NO  A YES
        40          1 NO  A NO

16 rows selected.

6. Simple Test

Create a new tablespace in primary...

SQL> create tablespace test_ts
  2  datafile 'D:\oracle\oradata\primary\test_ts01.dbf'
  3  size 1M;

Tablespace created.

Because the log sync is async mode, the tablespace test_ts won't be created in standby immediately. But we can switch logfile in primary to force the log apply in standby.

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
primary

SQL> alter system switch logfile;

System altered.

SQL>

 Check the alert file in standby, and will find the following messages...

Thu Apr 26 09:34:34 2012
RFS[5]: Selected log 4 for thread 1 sequence 54 dbid 1618933582 branch 781450898
Thu Apr 26 09:34:35 2012
Archived Log entry 21 added for thread 1 sequence 53 ID 0x607ee34e dest 1:
Thu Apr 26 09:34:37 2012
Media Recovery Log D:\ORACLE\ARCHIVED_LOG\STANDBY\1_53_781450898.ARC
Recovery created file D:\ORACLE\ORADATA\STANDBY\TEST_TS01.DBF
Successfully added datafile 5 to media recovery
Datafile #5: 'D:\ORACLE\ORADATA\STANDBY\TEST_TS01.DBF'
Media Recovery Waiting for thread 1 sequence 54 (in transit)

 The db file is generated in standby database.

 7. Monitor the log apply reference  -- http://docs.oracle.com/cd/B19306_01/server.102/b14239/manage_ps.htm#i1035175

 

原文地址:https://www.cnblogs.com/fangwenyu/p/2470117.html