生产环境中,可能会有各种各样的原因导致数据库不能提供服务,例如数据库库的硬件故障,操作系统故障或软件bug,人为的失误(例如rm -rf /)等,在这种情况下,dataguard显得尤为重要,当主库不可用的时候,可以将备库failover成主库继续提供服务,failover和switchover不同的是,执行failover后,原有的dataguard配置将会失效且有可能会丢失部分数据,所以在生产环境中能用switchover解决的问题则应尽量采用switchover!switchover执行过程参考:http://ylw6006.blog.51cto.com/470441/849829

一:使用sql命令执行failover
1:查看当前的主库是dg1,物理备库为dg2,将主库关闭,模拟主库故障

   
   
   
   
  1. [oracle@dg2 ~]$ dgmgrl /  
  2. DGMGRL for Linux: Version 11.2.0.3.0 - 64bit Production  
  3. Copyright (c) 2000, 2009, Oracle. All rights reserved.  
  4. Welcome to DGMGRL, type "help" for information.  
  5. Connected.  
  6. DGMGRL> show configuration;  
  7.  
  8. Configuration - DG_BROKER_CONFIG  
  9.  
  10.   Protection Mode: MaxAvailability  
  11.   Databases:  
  12.     dg1 - Primary database  
  13.     dg2 - Physical standby database  
  14.  
  15. Fast-Start Failover: DISABLED  
  16.  
  17. Configuration Status:  
  18. SUCCESS  
  19.  
  20. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  21.  
  22. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  23. -------------------- ---------------- -------------------- ------------------  
  24. READ WRITE           PRIMARY          dg1                  NO  
  25.  
  26. SQL> shutdown abort  
  27. ORACLE instance shut down. 

2:在备库dg2上执行failover过程,failover执行的命令和switchover类似,只是在这个过程中,主库已经不可用

   
   
   
   
  1. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  2.  
  3. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  4. -------------------- ---------------- -------------------- ------------------  
  5. READ ONLY WITH APPLY PHYSICAL STANDBY dg2                  NO  
  6.  
  7. SQL> alter database recover managed standby database cancel;  
  8. Database altered.  
  9.  
  10. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  11.  
  12. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  13. -------------------- ---------------- -------------------- ------------------  
  14. READ ONLY            PHYSICAL STANDBY dg2                  NO  
  15.  
  16. 出现这个错误说明日志并未完全的应用  
  17. SQL> alter database commit to switchover to primary;  
  18. alter database commit to switchover to primary  
  19. *  
  20. ERROR at line 1:  
  21. ORA-16139: media recovery required  
  22.  
  23. SQL> alter database recover managed standby database using current logfile disconnect from session;  
  24. Database altered.  
  25.  
  26. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  27.  
  28. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  29. -------------------- ---------------- -------------------- ------------------  
  30. READ ONLY WITH APPLY PHYSICAL STANDBY dg2                  NO  
  31.  
  32. SQL> alter database recover managed standby database finish;  
  33. Database altered.  
  34.  
  35. SQL> alter database commit to switchover to primary;  
  36. Database altered.  
  37.  
  38. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  39.  
  40. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  41. -------------------- ---------------- -------------------- ------------------  
  42. MOUNTED              PRIMARY          dg2                  NO  
  43.  
  44. SQL> alter database open;  
  45. Database altered.  
  46.  
  47. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  48.  
  49. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  50. -------------------- ---------------- -------------------- ------------------  
  51. READ WRITE           PRIMARY          dg2                  NO 

二:使用datagurad broker进行failover
1:开启主库和备库的闪回功能,主要用于主库恢复后的reinstate操作,当前主库为dg2,备库为dg1

   
   
   
   
  1. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  2.  
  3. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  4. -------------------- ---------------- -------------------- ------------------  
  5. READ WRITE           PRIMARY          dg2                  YES  
  6.  
  7. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  8.  
  9. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  10. -------------------- ---------------- -------------------- ------------------  
  11. READ ONLY WITH APPLY PHYSICAL STANDBY dg1                  YES  
  12.  
  13. [oracle@dg1 ~]$ dgmgrl sys/123456@dg1  
  14. DGMGRL for Linux: Version 11.2.0.3.0 - 64bit Production  
  15.  
  16. Copyright (c) 2000, 2009, Oracle. All rights reserved.  
  17.  
  18. Welcome to DGMGRL, type "help" for information.  
  19. Connected.  
  20. DGMGRL> show configuration;  
  21.  
  22. Configuration - DG_BROKER_CONFIG  
  23.  
  24.   Protection Mode: MaxAvailability  
  25.   Databases:  
  26.     dg2 - Primary database  
  27.     dg1 - Physical standby database  
  28.  
  29. Fast-Start Failover: DISABLED  
  30.  
  31. Configuration Status:  
  32. SUCCESS 

2:关闭主库dg2,模拟主库故障

   
   
   
   
  1. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  2.  
  3. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  4. -------------------- ---------------- -------------------- ------------------  
  5. READ WRITE           PRIMARY          dg2                  YES  
  6.  
  7. SQL> shutdown abort  
  8. ORACLE instance shut down.  
  9.  
  10. DGMGRL> show configuration;  
  11.  
  12. Configuration - DG_BROKER_CONFIG  
  13.  
  14.   Protection Mode: MaxAvailability  
  15.   Databases:  
  16.     dg2 - Primary database  
  17.     dg1 - Physical standby database  
  18.  
  19. Fast-Start Failover: DISABLED  
  20.  
  21. Configuration Status:  
  22. ORA-01034: ORACLE not available  
  23. ORA-16625: cannot reach database "dg2"  
  24. DGM-17017: unable to determine configuration status 

3:执行failover

   
   
   
   
  1. DGMGRL> failover to dg1;  
  2. Performing failover NOW, please wait...  
  3. Failover succeeded, new primary is "dg1"  
  4. DGMGRL> show configuration;  
  5.  
  6. Configuration - DG_BROKER_CONFIG  
  7.  
  8.   Protection Mode: MaxAvailability  
  9.   Databases:  
  10.     dg1 - Primary database  
  11.       Warning: ORA-16629: database reports a different protection level from the protection mode  
  12.  
  13.     dg2 - Physical standby database (disabled)  
  14.       ORA-16661: the standby database needs to be reinstated  
  15.  
  16. Fast-Start Failover: DISABLED  
  17.  
  18. Configuration Status:  
  19. WARNING 

4:重新启动原主库dg2

   
   
   
   
  1. SQL> startup  
  2. ORACLE instance started.  
  3.  
  4. Total System Global Area  417546240 bytes  
  5. Fixed Size                  2228944 bytes  
  6. Variable Size             352324912 bytes  
  7. Database Buffers           54525952 bytes  
  8. Redo Buffers                8466432 bytes  
  9. Database mounted.  
  10. ORA-16649: possible failover to another database prevents this database from  
  11. being opened  
  12.  
  13. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  14.  
  15. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  16. -------------------- ---------------- -------------------- ------------------  
  17. MOUNTED              PRIMARY          dg2                  YES 

5:执行reinstate操作

   
   
   
   
  1. DGMGRL> reinstate database dg2;  
  2. Reinstating database "dg2", please wait...  
  3. Operation requires shutdown of instance "dg" on database "dg2"  
  4. Shutting down instance "dg"...  
  5. ORA-01109: database not open  
  6.  
  7. Database dismounted.  
  8. ORACLE instance shut down.  
  9. Operation requires startup of instance "dg" on database "dg2"  
  10. Starting instance "dg"...  
  11. Unable to connect to database  
  12. ORA-12514: TNS:listener does not currently know of service requested in connect descriptor  
  13.  
  14. Failed.  
  15. Warning: You are no longer connected to ORACLE.  
  16.  
  17. Please complete the following steps and reissue the REINSTATE command:  
  18.         start up and mount instance "dg" of database "dg2"  
  19.  
  20. SQL> conn /as sysdba  
  21. Connected to an idle instance.  
  22. SQL> startup  
  23. ORACLE instance started.  
  24.  
  25. Total System Global Area  417546240 bytes  
  26. Fixed Size                  2228944 bytes  
  27. Variable Size             352324912 bytes  
  28. Database Buffers           54525952 bytes  
  29. Redo Buffers                8466432 bytes  
  30. Database mounted.  
  31. Database opened.  
  32. SQL> select open_mode,database_role,db_unique_name,flashback_on from v$database;  
  33.  
  34. OPEN_MODE            DATABASE_ROLE    DB_UNIQUE_NAME       FLASHBACK_ON  
  35. -------------------- ---------------- -------------------- ------------------  
  36. READ ONLY            PHYSICAL STANDBY dg2                  YES  
  37.  
  38. DGMGRL> show configuration;  
  39.  
  40. Configuration - DG_BROKER_CONFIG  
  41.  
  42.   Protection Mode: MaxAvailability  
  43.   Databases:  
  44.     dg1 - Primary database  
  45.     dg2 - Physical standby database (disabled)  
  46.       ORA-16661: the standby database needs to be reinstated  
  47.  
  48. Fast-Start Failover: DISABLED  
  49.  
  50. Configuration Status:  
  51. SUCCESS  
  52.  
  53. DGMGRL> enable database dg2;  
  54. Error: ORA-16661: the standby database needs to be reinstated  
  55.  
  56. Failed.  
  57. DGMGRL> reinstate database dg2;  
  58. Reinstating database "dg2", please wait...  
  59. Reinstatement of database "dg2" succeeded  
  60.  
  61. DGMGRL> show configuration;  
  62.  
  63. Configuration - DG_BROKER_CONFIG  
  64.  
  65.   Protection Mode: MaxAvailability  
  66.   Databases:  
  67.     dg1 - Primary database  
  68.     dg2 - Physical standby database  
  69.  
  70. Fast-Start Failover: DISABLED  
  71.  
  72. Configuration Status:  
  73. SUCCESS 

总结
1:非到万不得已的情况,不使用failover,优先考虑switchover
2:若执行failover,则考虑使用sql命令完成
3:执行failover后,应及时备份数据,并重构dg环境