之前整理过一篇利用数据库冷备份创建physical standby的文章,数据库的冷备需要停机,在生产环境中实用性不大,本将中将介绍如何利用rman热备来创建dataguard物理备库,这样主库只需要重启一次即可,大大提高了主库的高可用性!
环境介绍:
primary: rhel5.4 32位 192.168.227.20/24,db_unique_name: primary
standby: rhel5.4 32位 192.168.227.30/24,db_unique_name: standby
oracle版本: 10.2.0.1 32位企业版

一:standby服务器
1:主库上开启Forced Logging

   
   
   
   
  1. SQL> alter database force logging;  
  2. Database altered.  

2:在备库上创建密码文件,这里直接从主库复制到备库

   
   
   
   
  1. [oracle@orcl ~]$ scp $ORACLE_HOME/dbs/orapworcl 192.168.227.30:/u01/app/oracle/product/10.2.0/db_1/dbs  
  2. [email protected]'s password:   
  3. orapworcl                                          100% 1536     1.5KB/s   00:00  

3:主库上配置Standby Redo Log

   
   
   
   
  1. SQL> select member from v$logfile;  
  2.  
  3. MEMBER  
  4. ---------------------------------------  
  5. /u01/app/oracle/oradata/orcl/redo03.log  
  6. /u01/app/oracle/oradata/orcl/redo02.log  
  7. /u01/app/oracle/oradata/orcl/redo01.log  
  8.  
  9. SQL> !du -sh /u01/app/oracle/oradata/orcl/redo01.log  
  10. 51M     /u01/app/oracle/oradata/orcl/redo01.log  
  11.  
  12. SQL> alter database add standby logfile group 4   
  13.   2  '/u01/app/oracle/oradata/orcl/standby/standby04.log' size 50M;  
  14. Database altered.  
  15.  
  16. SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;  
  17.  
  18.     GROUP#    THREAD#  SEQUENCE# ARC STATUS  
  19. ---------- ---------- ---------- --- ----------  
  20.          4          0          0 YES UNASSIGNED  
  21.          5          0          0 YES UNASSIGNED  
  22.          6          0          0 YES UNASSIGNED 

4.修改主库的初始化参数

   
   
   
   
  1. SQL> show parameter db_name;  
  2.  
  3. NAME                                 TYPE        VALUE  
  4. ------------------------------------ ----------- ------------------------------  
  5. db_name                              string      orcl  
  6. SQL> show parameter db_unique_name;  
  7.  
  8. NAME                                 TYPE        VALUE  
  9. ------------------------------------ ----------- ------------------------------  
  10. db_unique_name                       string      primary  
  11.  
  12. SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)';  
  13. System altered.        
  14.  
  15. SQL> alter system set log_archive_dest_1='LOCATION=/u01/arch/orcl valid_for=(all_logfiles,all_roles) db_unique_name=primary' scope=spfile;  
  16. System altered.  
  17.  
  18. SQL> alter system set log_archive_dest_2='service=standby lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=standby' scope=spfile;  
  19. System altered.  
  20.  
  21. SQL> alter system set log_archive_dest_state_1=enable;  
  22. System altered.  
  23.  
  24. SQL> alter system set log_archive_dest_state_2=enable;  
  25. System altered.  
  26.  
  27. SQL> alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;  
  28. System altered.  
  29.  
  30. SQL> show parameter remote_login;  
  31.  
  32. NAME                                 TYPE        VALUE  
  33. ------------------------------------ ----------- ---------  
  34. remote_login_passwordfile            string      EXCLUSIVE  
  35.  
  36. SQL> alter system set log_archive_max_processes=30;  
  37. System altered.  
  38.  
  39. SQL> alter system set fal_server=standby;  
  40. System altered.  
  41.  
  42. SQL> alter system set fal_client=primary;  
  43. System altered.  
  44.  
  45. SQL> alter system set standby_file_management=auto;  
  46. System altered.  
  47. SQL> !mkdir -p /u01/arch/orcl  
  48. SQL> shutdown immediate;  
  49. SQL> startup 

5:配置主库的tnsnames.ora文件,备库需要同样的操作

   
   
   
   
  1. [oracle@orcl ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora  
  2. # tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora  
  3. # Generated by Oracle configuration tools.  
  4.  
  5. primary =  
  6.   (DESCRIPTION =  
  7.     (ADDRESS_LIST =  
  8.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.227.20)(PORT = 1521))  
  9.     )  
  10.     (CONNECT_DATA =  
  11.       (SERVICE_NAME = primary.herostart.com)  
  12.     )  
  13.   )  
  14.  
  15. standby =  
  16.   (DESCRIPTION =  
  17.     (ADDRESS_LIST =  
  18.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.227.30)(PORT = 1521))  
  19.     )  
  20.     (CONNECT_DATA =  
  21.       (SERVICE_NAME = standby.herostart.com)  
  22.     )  
  23.   ) 

6:在主库上准备备库需要的pfile和数据库备份文件,控制文件等

   
   
   
   
  1. [oracle@orcl ~]$ mkdir -p /u01/backup/  
  2. SQL> create pfile='/u01/backup/initorcl.ora' from spfile;  
  3. File created.  
  4.  
  5. [oracle@orcl ~]$ rman target /   
  6. RMAN> backup tag 'dg_20110909' format '/u01/backup/dg_%U' incremental level 0 database plus archivelog;   
  7.  
  8. RMAN> backup format '/u01/backup/controlfile_%U' current controlfile for standby;

二:standby服务器

1:设置oracle_sid,配置tnsnames.ora

   
   
   
   
  1. [oracle@orcl ~]$ export ORACLE_SID=orcl 
  2. [oracle@orcl ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora  
  3. primary =  
  4.   (DESCRIPTION =  
  5.     (ADDRESS_LIST =  
  6.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.227.20)(PORT = 1521))  
  7.     )  
  8.     (CONNECT_DATA =  
  9.       (SERVICE_NAME = primary.herostart.com)  
  10.     )  
  11.   )  
  12.  
  13. standby =  
  14.   (DESCRIPTION =  
  15.     (ADDRESS_LIST =  
  16.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.227.30)(PORT = 1521))  
  17.     )  
  18.     (CONNECT_DATA =  
  19.       (SERVICE_NAME = standby.herostart.com)  
  20.     )  
  21.   ) 

2:在备库上复制主库备份出来的备份文件,并准备相关的目录 

   
   
   
   
  1. [oracle@orcl ~]$ mkdir -p /u01/backup/  
  2. [oracle@orcl ~]$ scp -rp 192.168.227.20:/u01/backup/* /u01/backup/  
  3. [oracle@orcl ~]$ cp /u01/backup/initorcl.ora $ORACLE_HOME/dbs  
  4. [oracle@orcl ~]$ grep 'fal_' $ORACLE_HOME/dbs/initorcl.ora  
  5. *.fal_client='STANDBY' 
  6. *.fal_server='PRIMARY' 
  7. [oracle@orcl ~]$ grep 'log_archive_dest_'  $ORACLE_HOME/dbs/initorcl.ora 
    *.log_archive_dest_1='LOCATION=/u01/arch/orcl 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
  8. [oracle@orcl ~]$ mkdir -p /u01/arch/orcl  
  9. [oracle@orcl ~]$ mkdir -p /u01/app/oracle/admin/orcl/{adump,bdump,cdump,dpdump,udump,pfile}   
  10. [oracle@orcl ~]$ mkdir -p /u01/app/oracle/oradata/orcl    
  11. [oracle@orcl ~]$ mkdir -p /u01/app/oracle/flash_recover_area/ORCL  

3:将备库启动到mount状态

   
   
   
   
  1. [oracle@orcl ~]$ sqlplus /nolog  
  2. SQL> conn /as sysdba  
  3. Connected to an idle instance.  
  4. SQL> startup nomount  
  5. ORACLE instance started.  

4:使用rman对备库进行恢复

   
   
   
   
  1. [oracle@orcl ~]$ rman target sys/123456@primary auxiliary /  
  2. Recovery Manager: Release 10.2.0.1.0 - Production on Thu Sep 15 16:08:34 2011  
  3. Copyright (c) 1982, 2005, Oracle.  All rights reserved.  
  4. connected to target database: ORCL (DBID=1287906064)  
  5. connected to auxiliary database: ORCL (not mounted)  
  6.  
  7. RMAN> duplicate target database for standby nofilenamecheck; 

5: 将备库置于应用redolog模式

   
   
   
   
  1. [oracle@orcl ~]$ sqlplus /nolog  
  2. SQL> conn /as sysdba  
  3. Connected.  
  4. SQL> archive log list;  
  5. Database log mode              Archive Mode  
  6. Automatic archival             Enabled  
  7. Archive destination            /u01/arch/orcl  
  8. Oldest online log sequence     47  
  9. Next log sequence to archive   49  
  10. Current log sequence           49  
  11.  
  12. SQL> alter database recover managed standby database disconnect from session;  
  13. Database altered.  
  14.  
  15. SQL> select SEQUENCE#,FIRST_TIME,NEXT_TIME,APPLIED from v$archived_log;  
  16.  
  17.  SEQUENCE# FIRST_TIME          NEXT_TIME           APP  
  18. ---------- ------------------- ------------------- ---  
  19.         47 2011-09-09:10:56:31 2011-09-09:10:57:51 YES 
  20.  
  21. SQL> select member from v$logfile;
  22. MEMBER
    --------------------------------------------------------------------------------
    /u01/app/oracle/flash_recovery_area/STANDBY/onlinelog/o1_mf_3_773dso2v_.log
    /u01/app/oracle/flash_recovery_area/STANDBY/onlinelog/o1_mf_2_773dsmpk_.log
    /u01/app/oracle/flash_recovery_area/STANDBY/onlinelog/o1_mf_1_773dsl9v_.log

可以在主库上进行日志切换,加快备库应用日志的速度!

   
   
   
   
  1. [oracle@orcl ~]$ sqlplus /nolog  
  2. SQL> conn /as sysdba  
  3. Connected.  
  4. SQL> archive log list;  
  5. Database log mode              Archive Mode  
  6. Automatic archival             Enabled  
  7. Archive destination            /u01/arch/orcl  
  8. Oldest online log sequence     47  
  9. Next log sequence to archive   49  
  10. Current log sequence           49  
  11. SQL> alter system switch logfile;  
  12. System altered.       
  13.  
  14. SQL> alter system switch logfile;  
  15. System altered.  
  16.  
  17. SQL> archive log list;  
  18. Database log mode              Archive Mode  
  19. Automatic archival             Enabled  
  20. Archive destination            /u01/arch/orcl  
  21. Oldest online log sequence     48  
  22. Next log sequence to archive   50  
  23. Current log sequence           50  
  24.  
  25. 备库上再次查询:  
  26. SQL> select SEQUENCE#,FIRST_TIME,NEXT_TIME,APPLIED from v$archived_log;  
  27.  
  28.  SEQUENCE# FIRST_TIME          NEXT_TIME           APP  
  29. ---------- ------------------- ------------------- ---  
  30.         47 2011-09-09:10:56:31 2011-09-09:10:57:51 YES  
  31.         49 2011-09-09:10:57:54 2011-09-09:11:21:25 YES  
  32.         48 2011-09-09:10:57:51 2011-09-09:10:57:54 YES  
  33.           
  34.  
  35. SQL> select name,database_role from v$database;  
  36. NAME      DATABASE_ROLE  
  37. --------- ----------------  
  38. ORCL      PHYSICAL STANDBY   

三:测试

1.在主库上创建表空间,建表

   
   
   
   
  1. SQL> select name,database_role from v$database;  
  2.  
  3. NAME      DATABASE_ROLE  
  4. --------- ----------------  
  5. ORCL      PRIMARY  
  6.  
  7. SQL> create tablespace dg_test datafile   
  8.   2  '/u01/app/oracle/oradata/orcl/dg_test01.dbf'  
  9.   3  size 10M autoextend off;  
  10. Tablespace created.  
  11.  
  12. SQL> create table dg01 as select * from dba_source;  
  13. Table created  
  14.  
  15. SQL> alter system switch logfile;  
  16. System altered. 

2.备库应用日志后以只读方式打开查看数据

   
   
   
   
  1. SQL> alter database recover managed standby database cancel;  
  2. Database altered  
  3.  
  4. SQL> alter database open read only;  
  5. Database altered.  
  6.  
  7. SQL> select type from dg01 where rownum <= 3;  
  8.  
  9. TYPE  
  10. ------------  
  11. PACKAGE  
  12. PACKAGE  
  13. PACKAGE  
  14.  
  15. SQL> select count(*) from dg01;  
  16.  
  17.   COUNT(*)  
  18. ----------  
  19.     292428 

3:从新将备库置于应用日志模式

   
   
   
   
  1. [oracle@orcl ~]$ sqlplus /nolog  
  2. SQL> conn /as sysdba  
  3. Connected.  
  4. SQL> shutdown immediate;  
  5. SQL> startup nomount;  
  6. SQL> alter database mount standby database;  
  7. Database altered.  
  8. SQL> alter database recover managed standby database disconnect from session;  
  9. Database altered. 

备注:本文参考oracle10g 手册,相关的参数含义可以在手册上查找!

利用rman构建physical standby指南_第1张图片