目标:实现dataguard redo传输cascade,即dg1的redo日志先传输到dg2,然后再从dg2传输到dg3,从而减少dg1主库的网络带宽压力!通常使用于dg1和dg2在同一局域网内,dg2和dg3通过广域网相连的场合!

一:环境介绍
主库
IP地址:192.168.1.61/24
操作系统版本:rhel5.4 64bit
数据库版本:11.2.0.3 64bit
数据库sid名:dg
数据库名:dg
数据库db_unique_name:dg1


备库1  物理备库
IP地址:192.168.1.62/24
操作系统版本:rhel5.4 64bit
数据库版本:11.2.0.3 64bit
数据库sid名:dg
数据库名:dg
数据库db_unique_name:dg2


备库2  物理备库
IP地址:192.168.1.62/24
操作系统版本:rhel5.4 64bit
数据库版本:11.2.0.3 64bit
数据库sid名:dg
数据库名:dg
数据库db_unique_name:dg3

二:统一修改三台数据库服务器的listener.ora和tnsnames.ora文件如下,listener.ora文件里面的GLOBAL_DBNAME和HOST参数做相应的修改

[oracle@dg1 ~]$ cat $TNS_ADMIN/listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = dg1.yang.com)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db1)
      (SID_NAME = dg)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = dg1.yang.com)(PORT = 1521))
      )
    )
  )


[oracle@dg1 ~]$ grep -v '^#' $TNS_ADMIN/tnsnames.ora
dg1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.61)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dg1.yang.com)
    )
  )

 

dg2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.62)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dg2.yang.com)
    )
  )

dg3 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.63)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dg3.yang.com)
    )
  )

三:dg1和dg2数据库服务器构建active dataguard
3.1修改主库初始化参数,添加standby日志组

  1. [oracle@dg1 ~]$ sqlplus /nolog  
  2. SQL*Plus: Release 11.2.0.3.0 Production on Sat Apr 7 14:11:18 2012  
  3. Copyright (c) 1982, 2011, Oracle.  All rights reserved.  
  4.  
  5. SQL> conn /as sysdba  
  6. Connected.  
  7.  
  8. SQL> !mkdir /u01/app/oracle/archivelog  
  9.  
  10. SQL> alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog'    
  11. valid_for=(all_logfiles,primary_role) db_unique_name=dg1;  
  12. System altered.  
  13.  
  14. SQL> archive log list;  
  15. Database log mode              Archive Mode  
  16. Automatic archival             Enabled  
  17. Archive destination            /u01/app/oracle/archivelog  
  18. Oldest online log sequence     3  
  19. Next log sequence to archive   5  
  20. Current log sequence           5  
  21.  
  22. SQL> select force_logging,db_unique_name from v$database;  
  23.  
  24. FOR DB_UNIQUE_NAME  
  25. --- ------------------------------  
  26. NO  dg  
  27.  
  28. SQL> alter database force logging;  
  29. Database altered.  
  30.  
  31. SQL> alter system set db_unique_name='dg1' scope=spfile;  
  32. System altered.  
  33.  
  34. SQL> select force_logging,db_unique_name from v$database;  
  35.  
  36. FOR DB_UNIQUE_NAME  
  37. --- ------------------------------  
  38. YES dg  
  39.  
  40. SQL>alter system set log_archive_config='DG_CONFIG=(dg1,dg2,dg3)';  
  41. System altered.  
  42.  
  43. SQL>alter system set log_archive_dest_2='SERVICE=dg2 valid_for=(online_logfile,primary_role) db_unique_name=dg2' scope=spfile;  
  44. System altered.  
  45.  
  46. SQL>alter system set log_archive_dest_3='SERVICE=dg3  valid_for=(standby_logfiles,standby_role) db_unique_name=dg3' scope=spfile;  
  47. System altered.  
  48.  
  49.  
  50. SQL> show parameter remote_login;  
  51.  
  52. NAME                                 TYPE        VALUE  
  53. ------------------------------------ ----------- ------------------------------  
  54. remote_login_passwordfile            string      EXCLUSIVE  
  55.  
  56. SQL> show parameter log_archive_format;  
  57.  
  58. NAME                                 TYPE        VALUE  
  59. ------------------------------------ ----------- ------------------------------  
  60. log_archive_format                   string      %t_%s_%r.dbf  
  61.  
  62. SQL> alter database add standby logfile group 4  '/u01/app/oracle/oradata/dg/standby01.log' size 50M;  
  63. Database altered.  
  64.  
  65. SQL> alter database add standby logfile group 5  '/u01/app/oracle/oradata/dg/standby02.log' size 50M;  
  66. Database altered.  
  67.  
  68. SQL> alter database add standby logfile group 6  '/u01/app/oracle/oradata/dg/standby03.log' size 50M;  
  69. Database altered.  
  70.  
  71. SQL> alter database add standby logfile group 7  '/u01/app/oracle/oradata/dg/standby04.log' size 50M;  
  72. Database altered.  
  73.  
  74. SQL> select member,groupfrom v$logfile order by 2;  
  75.  
  76. MEMBER                                       GROUP#  
  77. ---------------------------------------- ----------  
  78. /u01/app/oracle/oradata/dg/redo01.log             1  
  79. /u01/app/oracle/oradata/dg/redo02.log             2  
  80. /u01/app/oracle/oradata/dg/redo03.log             3  
  81. /u01/app/oracle/oradata/dg/standby01.log          4  
  82. /u01/app/oracle/oradata/dg/standby02.log          5  
  83. /u01/app/oracle/oradata/dg/standby03.log          6  
  84. /u01/app/oracle/oradata/dg/standby04.log          7  
  85. rows selected. 

一:环境介绍3. 3.2 由spfile生成pfile,重启主库,使先前修改的参数生效!修改参数文件,scp至dg2

  1. SQL> create pfile='/home/oracle/initdg.ora' from spfile;  
  2. File created.  
  3.  
  4. SQL> shutdown immediate  
  5. Database closed.  
  6. Database dismounted.  
  7. ORACLE instance shut down.  
  8.  
  9. SQL> startup  
  10. ORACLE instance started.  
  11.  
  12. Total System Global Area  417546240 bytes  
  13. Fixed Size                  2228944 bytes  
  14. Variable Size             281021744 bytes  
  15. Database Buffers          125829120 bytes  
  16. Redo Buffers                8466432 bytes  
  17. Database mounted.  
  18. Database opened.  
  19.  
  20. SQL> show parameter name;  
  21.  
  22. NAME                                 TYPE        VALUE  
  23. ------------------------------------ ----------- ------------------------------  
  24. db_file_name_convert                 string  
  25. db_name                              string      dg  
  26. db_unique_name                       string      dg1  
  27. global_names                         boolean     FALSE 
  28. instance_name                        string      dg  
  29. lock_name_space                      string  
  30. log_file_name_convert                string  
  31. processor_group_name                 string  
  32. service_names                        string      dg1.yang.com  
  33.  
  34. [oracle@dg1 ~]$ cat initdg.ora   
  35. dg.__db_cache_size=125829120  
  36. dg.__java_pool_size=4194304  
  37. dg.__large_pool_size=4194304  
  38. dg.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment  
  39. dg.__pga_aggregate_target=167772160  
  40. dg.__sga_target=251658240  
  41. dg.__shared_io_pool_size=0  
  42. dg.__shared_pool_size=104857600  
  43. dg.__streams_pool_size=0  
  44. *.audit_file_dest='/u01/app/oracle/admin/dg/adump' 
  45. *.audit_trail='db' 
  46. *.compatible='11.2.0.0.0' 
  47. *.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl' 
  48. *.db_block_size=8192  
  49. *.db_domain='yang.com' 
  50. *.db_name='dg' 
  51. *.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area' 
  52. *.db_recovery_file_dest_size=4322230272  
  53. *.db_unique_name='dg2' 
  54. *.diagnostic_dest='/u01/app/oracle' 
  55. *.dispatchers='(PROTOCOL=TCP) (SERVICE=dgXDB)' 
  56. *.log_archive_config='DG_CONFIG=(dg1,dg2,dg3)' 
  57. *.log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog valid_for=(all_logfiles,primary_role) db_unique_name=dg2' 
  58. *.log_archive_dest_2='SERVICE=dg1  valid_for=(online_logfiles,primary_role) db_unique_name=dg1' 
  59. *.log_archive_dest_3='SERVICE=dg3  valid_for=(standby_logfiles,standby_role) db_unique_name=dg3' 
  60. *.log_archive_format='%t_%s_%r.dbf' 
  61. *.memory_target=419430400  
  62. *.open_cursors=300  
  63. *.processes=150  
  64. *.remote_login_passwordfile='EXCLUSIVE' 
  65. *.undo_tablespace='UNDOTBS1  
  66.  
  67. [oracle@dg1 ~]$ scp initdg.ora 192.168.1.62:/home/oracle/ 

3.3 在dg2上创建密码文件,由pfile生成spfile文件,启动数据库实例到nomount状态,通过rman进行duplicate操作,在11g中,duplicate数据库可以from active database,意味着不需要先在主库上进行rman备份,然后再将备份文件复制到备库上,在10g版本上需要这样操作,操作完成后将备库1置于active dataguard状态,即实时应用日志并只读的状态,adg也是11g dataguard非常大的一个飞跃(dg2只安装数据库软件,未建库)

  1. [oracle@dg2 ~]$ orapwd file=$ORACLE_HOME/dbs/orapwdg password=123456 entries=5  
  2. [oracle@dg2 ~]$ sqlplus /nolog  
  3. SQL*Plus: Release 11.2.0.3.0 Production on Sat Apr 7 15:40:33 2012  
  4. Copyright (c) 1982, 2011, Oracle.  All rights reserved.  
  5.  
  6. SQL> conn /as sysdba  
  7. Connected to an idle instance.  
  8. SQL> create spfile from pfile='/home/oracle/initdg.ora';  
  9. File created.  
  10.  
  11. SQL> startup nomount  
  12. ORACLE instance started.  
  13.  
  14. Total System Global Area  417546240 bytes  
  15. Fixed Size                  2228944 bytes  
  16. Variable Size             281021744 bytes  
  17. Database Buffers          125829120 bytes  
  18. Redo Buffers                8466432 bytes  
  19.  
  20. [oracle@dg2 ~]$ rman target  sys/123456@dg1 auxiliary sys/123456@dg2  
  21. Recovery Manager: Release 11.2.0.3.0 - Production on Sat Apr 7 16:22:57 2012  
  22. Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.  
  23. connected to target database: DG (DBID=1693312161)  
  24. connected to auxiliary database: DG (not mounted)  
  25.  
  26. RMAN> list backup of database summary; //这个时候主库没有任何的物理备份  
  27. using target database control file instead of recovery catalog  
  28. specification does not match any backup in the repository  
  29.  
  30. RMAN> duplicate target database for standby nofilenamecheck from active database;  
  31.  
  32. ————————输出省略——————  
  33.  
  34. [oracle@dg2 ~]$ sqlplus /nolog  
  35. SQL*Plus: Release 11.2.0.3.0 Production on Sat Apr 7 16:30:11 2012  
  36. Copyright (c) 1982, 2011, Oracle.  All rights reserved.  
  37.  
  38. SQL> conn /as sysdba   
  39. Connected.  
  40. SQL> select database_role,open_mode,name from v$database;  
  41.  
  42. DATABASE_ROLE    OPEN_MODE            NAME 
  43. ---------------- -------------------- ---------  
  44. PHYSICAL STANDBY MOUNTED              DG  
  45.  
  46. SQL> archive log list;  
  47. Database log mode              Archive Mode  
  48. Automatic archival             Enabled  
  49. Archive destination            /u01/app/oracle/archivelog  
  50. Oldest online log sequence     8  
  51. Next log sequence to archive   0  
  52. Current log sequence           10  
  53.  
  54. SQL> alter database open read only;  
  55. Database altered.  
  56.  
  57. SQL> alter database recover managed standby database using current logfile disconnect from session;  
  58. Database altered.  
  59.  
  60. SQL> select database_role,open_mode,name from v$database;  
  61.  
  62. DATABASE_ROLE    OPEN_MODE            NAME 
  63. ---------------- -------------------- ---------  
  64. PHYSICAL STANDBY READ ONLY WITH APPLY DG 

3.4测试主库上切换日志

  1. SQL> alter system switch logfile;  
  2. System altered.  
  3.  
  4. SQL> select message from v$dataguard_status;  
  5. MESSAGE  
  6. --------------------------------------------------------------------------------  
  7. LNS: Completed archiving log 3 thread 1 sequence 9  
  8. ARC0: Beginning to archive thread 1 sequence 9 (1049579-1050098)  
  9. ARC0: Completed archiving thread 1 sequence 9 (1049579-1050098)  
  10. LNS: Standby redo logfile selected for thread 1 sequence 10 for destination LOG_  
  11. ARCHIVE_DEST_2  
  12.  
  13. LNS: Beginning to archive log 1 thread 1 sequence 10  
  14. LNS: Completed archiving log 1 thread 1 sequence 10  
  15. ARC2: Beginning to archive thread 1 sequence 10 (1050098-1050271)  
  16. ARC2: Completed archiving thread 1 sequence 10 (1050098-1050271)  
  17. LNS: Beginning to archive log 2 thread 1 sequence 11  
  18.  
  19. 备库上查看日志应用情况  
  20. SQL> archive log list;  
  21. Database log mode              Archive Mode  
  22. Automatic archival             Enabled  
  23. Archive destination            /u01/app/oracle/archivelog  
  24. Oldest online log sequence     9  
  25. Next log sequence to archive   0  
  26. Current log sequence           11 

3.5 实际操作应用情况,发现需要主库上切换日志后,数据才会同步,也就是standby日志组未使用

  1. SQL> create table t1 as select * from dba_objects;  
  2. Table created.  
  3.  
  4. SQL> alter system switch logfile;   
  5. System altered.  
  6.  
  7. SQL> conn sys/123456@dg2 as sysdba  
  8. Connected.  
  9. SQL> select count(*) from t1;  
  10.  
  11.   COUNT(*)  
  12. ----------  
  13.      74510 

四:配置redo传输的cascade
4.1 将修改过的初始化文件传输到dg3上(dg3服务器上同样只安装数据库软件,不建库)

[oracle@dg2 ~]$ cat initdg.ora
dg.__db_cache_size=125829120
dg.__java_pool_size=4194304
dg.__large_pool_size=4194304
dg.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
dg.__pga_aggregate_target=167772160
dg.__sga_target=251658240
dg.__shared_io_pool_size=0
dg.__shared_pool_size=104857600
dg.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/dg/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/dg/control01.ctl','/u01/app/oracle/fast_recovery_area/dg/control02.ctl'
*.db_block_size=8192
*.db_domain='yang.com'
*.db_name='dg'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4322230272
*.db_unique_name='dg3'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dgXDB)'
*.log_archive_config='DG_CONFIG=(dg1,dg2,dg3)'
*.log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog valid_for=(all_logfiles,primary_role) db_unique_name=dg3'
*.standby_archive_dest=/u01/app/oracle/standbylog
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=419430400
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

4.2 通过pfile生成spfile,将数据库启动到nomount状态,然后进行duplicate

  1. [oracle@dg3 ~]$ sqlplus /nolog  
  2. SQL*Plus: Release 11.2.0.3.0 Production on Sat Apr 14 18:01:59 2012  
  3. Copyright (c) 1982, 2011, Oracle.  All rights reserved.  
  4.  
  5. SQL> conn /as sysdba  
  6. Connected to an idle instance.  
  7. SQL> create spfile from pfile='/home/oracle/initdg.ora';  
  8. File created.  
  9.  
  10. SQL> startup nomount  
  11. ORACLE instance started.  
  12.  
  13. Total System Global Area  417546240 bytes  
  14. Fixed Size                  2228944 bytes  
  15. Variable Size             281021744 bytes  
  16. Database Buffers          125829120 bytes  
  17. Redo Buffers                8466432 bytes  
  18.  
  19. [oracle@dg3 ~]$ rman target  sys/123456@dg1 auxiliary sys/123456@dg3  
  20. Recovery Manager: Release 11.2.0.3.0 - Production on Sat Apr 14 18:02:59 2012  
  21. Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.  
  22.  
  23. connected to target database: DG (DBID=1693928392)  
  24. connected to auxiliary database: DG (not mounted)  
  25.  
  26. RMAN> duplicate target database for standby nofilenamecheck from active database;  
  27.  
  28. ————————输出省略—————— 

 4.3 将备库dg3置于只读且应用日志模式下

  1. [oracle@dg3 ~]$ sqlplus /nolog  
  2. SQL*Plus: Release 11.2.0.3.0 Production on Sat Apr 14 18:49:12 2012  
  3. Copyright (c) 1982, 2011, Oracle.  All rights reserved.  
  4.  
  5. SQL> conn /as sysdba  
  6. Connected.  
  7. SQL> alter database open read only;  
  8. Database altered.  
  9.  
  10. SQL> alter database recover managed standby database using current logfile disconnect from session;  
  11. Database altered.  
  12.  
  13. SQL> select open_mode,database_role,name from v$database;  
  14.  
  15. OPEN_MODE            DATABASE_ROLE    NAME 
  16. -------------------- ---------------- ---------  
  17. READ ONLY WITH APPLY PHYSICAL STANDBY DG 

五:测试

  1. SQL> conn /as sysdba  
  2. Connected.  
  3. SQL> select open_mode,database_role,name from v$database;  
  4.  
  5. OPEN_MODE            DATABASE_ROLE    NAME 
  6. -------------------- ---------------- ---------  
  7. READ WRITE           PRIMARY          DG  
  8.  
  9. SQL> truncate table t1;  
  10. Table truncated.  
  11.  
  12. SQL> conn sys/123456@dg2 as sysdba  
  13. Connected.  
  14. SQL> select count(*) from t1;  
  15.  
  16.   COUNT(*)  
  17. ----------  
  18.      74510  
  19.  
  20. SQL> conn sys/123456@dg3 as sysdba  
  21. Connected.  
  22. SQL> select count(*) from t1;  
  23.  
  24.   COUNT(*)  
  25. ----------  
  26.      74510  
  27.  
  28. SQL> conn /as sysdba  
  29. Connected.  
  30. SQL> alter system switch logfile; //主库上未切换日志前,数据不能同步  
  31. System altered.  
  32.  
  33. SQL> conn sys/123456@dg2 as sysdba  
  34. Connected.  
  35. SQL> select count(*) from t1;  
  36.  
  37.   COUNT(*)  
  38. ----------  
  39.          0  
  40.  
  41. SQL> conn sys/123456@dg3 as sysdba  //在dg3上可以看到明显的延迟情况  
  42. Connected.
  43. SQL> select count(*) from t1;  
  44.  
  45.   COUNT(*)  
  46. ----------  
  47.      74510  
  48.  
  49. SQL> select count(*) from t1;  
  50.  
  51.   COUNT(*)  
  52. ----------  
  53.          0  
  54.  
  55. SQL> select message from v$dataguard_status; //查看备库dg3的dataguard状态  
  56. MESSAGE  
  57. --------------------------------------------------------------------------------  
  58. Media Recovery Log /u01/app/oracle/standbylog/1_13_780597393.dbf  
  59. Media Recovery Waiting for thread 1 sequence 14  
  60. FAL[client]: Error fetching gap sequenceno FAL server specified  
  61. RFS[1]: Assigned to RFS process 2701  
  62. Media Recovery Log /u01/app/oracle/archivelog/1_14_780597393.dbf  
  63. Media Recovery Waiting for thread 1 sequence 15  
  64. FAL[client]: Error fetching gap sequenceno FAL server specified  
  65. 18 rows selected.  
  66.  
  67. SQL> alter system set fal_server='dg2';  
  68. System altered.  
  69.  
  70. SQL> alter system set fal_client='dg3';  
  71. System altered. 

总结:
1:在测试上,可以将主库的log_archive_dest_state_3参数设置为defer,然后切换日志,观察dg2,dg3的日志传输情况
2:在本文档中没有设置standby_file_management参数,因为不涉及新建数据文件的操作
3:在dg1和dg2上均未设置fal_server和fal_client参数,因为此处不考虑dg的角色切换问题,纯粹测试redo日志的cascade传输
4:本文档未能成功实现adg,猜想和几个归档日志路径配置的参数相关,后续将继续测试!