oracle11g dataguard完全手冊--switchover

sun642514265發表於2014-01-21
注:本文轉載 天生我豺 http://www.cnblogs.com/tippoint/archive/2013/04/23/3037902.html

四、switchover主備切換

         DG的主要用途是HA高可用性,既然已經搭建好了主備環境,那現實環境中可能存在以下幾種情況。

  由於某種原因我們需要切換主備身份,即主備切換(Switchover)

  主庫故障,需要啟用備庫為主庫,即故障轉移(Failover)

  客戶端實現自動的故障轉移-客戶端故障轉移(Client Failover)

  下面就這幾種情況以及使用閃回資料庫重建庫,活動資料衛士(Active Data Guard),進行討論。

   1.檢視庫所在的保護模式和身份

   sql>select protection_mode,protection_level from v$database; --預設是最大效能模式(maximum performance)

   sql>select database_role from v$database; --主庫是primary備庫是physical standby

          SQL > alter database set standby database to maximize protection;    --最大保護

          SQL > alter database set standby database to maximize availability;  --最高可用性

          SQL > alter database set standby database to maximize performance;   --最高效能

   這裡簡要說明下這幾種保護模式的區別:

   最大保護:這種模式能夠確保絕無資料丟失。要實現這一步當然是有代價的,它要求所有的事務在提交前其 redo 不僅

              被寫入到本地的 online redo log,還要同時提交到 standby 資料庫的 standbyredo log,並確認 redo 資料至少在一

              個 standby 資料庫可用(如果有多個的話),然後才會在 primary 資料庫上提交。如果出現了什麼故障導致 standby

               資料庫不可用的話,primary 資料庫會被 shutdown。

   最高效能:這種模式提供在不影響 primary 資料庫效能前提下最高階別的資料保護策略。事務可以隨時提交,當前

               primary 資料庫的 redo 資料也需要至少寫入一個 standby 資料庫,不過這種寫入可以是不同步的。

               如果網路條件理想的話, 這種模式能夠提供類似最高可用性的資料保護而僅對 primary 資料庫有輕微的效能影響。

   最高可用性:這種模式提供在不影響 primary 資料庫可用前提下最高階別的資料保護策略。 其實現方式與最大保護模式類

               似,也是要求所有事務在提交前必須保障 redo 資料至少在一個 standby 資料庫可用,不過與之不同的是,如果

               出現故障匯入無法同時寫入 standby 資料庫 redo log,primary 資料庫並不會 shutdown,而是自動轉為最高效能

               模式,等 standby 資料庫恢復正常之後,它又會再自動轉換成最高可用性模式。

 2.故障轉移配置

   現在你已經配好了一個物理備庫,你可能想試試主備切換(switchover),甚至故障轉移(failover),但你先得確定客戶端會跟著切換和轉移。

   我們需要配置資料庫和客戶端來支援這些功能。要確定你的客戶端能連線到正確的資料庫,你要在資料庫裡配置一個支援故障轉移的服務,

   並配置客戶端的 TNS,讓它知道如何在一個 Data Guard 叢集裡找到主庫。

   (1)主庫建立自動轉移服務:

      此服務在資料庫出現故障時會傳送通知給客戶端,允許查詢語句在故障轉移發生後繼續執行。

      我使用命名 SID_RW 顯示這時一個可讀寫的資料庫(主庫)。

    begin

     DBMS_SERVICE.CREATE_SERVICE (

  service_name => 'orcl_RW',

  network_name => 'orcl_RW',

  aq_ha_notifications => TRUE,

  failover_method => 'BASIC',

  failover_type => 'SELECT',

  failover_retries => 30,

  failover_delay => 5);

    end; /

    (2)建立儲存過程確保只在主庫執行

      我們建立一個儲存過程來實現此目的,如果當前資料庫是主庫它就啟動此服務,如果是備庫就停止。

       create or replace procedure cmc_taf_service_proc

       is

      v_role VARCHAR(30);

  begin

      select DATABASE_ROLE into v_role from V$DATABASE;

      if v_role = 'PRIMARY' then

   DBMS_SERVICE.START_SERVICE('orcl_RW');

      else

   DBMS_SERVICE.STOP_SERVICE('orcl_RW');

      end if;

  end;

  /

     (3)建立觸發器(2個)來確保服務可以執行

        建立兩個觸發器,讓資料庫在啟動和角色轉換時執行此儲存過程。注意有的文件說是建立一個,那可能會導致你

        在重啟你的資料庫時,它不會重啟故障轉移服務

         create or replace TRIGGER cmc_taf_service_trg_startup

  after startup on database

  begin

      cmc_taf_service_proc;

  end;

  /

  create or replace TRIGGER cmc_taf_manage_trg_rolechange

  after db_role_change on database

  begin

      cmc_taf_service_proc;

  end;

  /

            (4)啟動服務

       我們執行一次儲存過程,確定服務正在執行,並歸檔當前日誌,讓以上更改同步到備庫。

       SQL> exec cmc_taf_service_proc;

              SQL> alter system archive log current;

              檢視服務資訊

       SQL> show parameter service_names

      (5)客戶端配置TNS

        服務名存在還不夠,你必須配置客戶端的 TNS 名去連線它。客戶端的 TNS 名應該類似如下:

        orcl_RW =

    (DESCRIPTION =

      (ADDRESS_LIST=

   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.215.101)(PORT = 1521))

   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.215.102)(PORT = 1521))

      )

      (CONNECT_DATA = (SERVICE_NAME = orcl_RW)

   (FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=30)(DELAY=5))

      )

    )

       當你的客戶端使用新 TNS 名後,它們能在主備切換和故障轉移操作後找到主庫。如果客戶端在執行一個查詢,

       並且沒有 DML 是在一個交易中,那在發生切換操作後,只要主備轉換和故障轉移在超過最大重試次數前完成,

       這個查詢會繼續工作,只是會有延遲。你應該多做幾次切換實驗,以確定 RETRIES 和 DELAY 引數如何設定合適。

       如果有一個正在進行中的交易,當客戶端連線到新的主庫後,

       查詢將報錯(`ORA-25403: transaction must roll back),並回滾。

  
  3.主備切換switchover

    (1)主庫確認沒有日誌缺口

       SQL> select STATUS, GAP_STATUS from V$ARCHIVE_DEST_STATUS where DEST_ID = 2;

       應該返回 VALID 和 NO GAP。

    (2)查詢v$tempfile檢視確認備庫的臨時檔案和主庫一樣。

    (3)確認所有重做日誌都已在備庫應用,查詢備庫

       SQL> select NAME, VALUE, DATUM_TIME from V$DATAGUARD_STATS;

       不應該返回 transport lag 或 apply lag, finish time 應該為0.

              關於V$DATAGUARD_STATS是這樣描述的:

       該動態效能檢視顯示出在主庫上產生了多少重做日誌資料,但是還沒有被備庫所應用。

       所以,通過查詢該檢視可以基本確定如果萬一主庫出現崩潰的話,備庫上將丟失多少重做日誌資料。

       我們可以在一套Dataguard環境下的任一備庫的例項上從該檢視裡獲取相關資訊,

       然而,在主庫的例項上查詢該檢視返回的資訊都將是空。也就是說,只可以從備庫的例項上查詢V$DATAGUARD_STATS,

       從主庫例項上是看不到任何有用資訊的。

              NAME:

  apply lag,該值表示在通過在備庫上應用主庫傳遞過來的重做日誌與主庫同步所延遲的時間。 

  transport lag,該值表示在單位時間內主庫上產生的重做日誌還沒有傳輸到備庫上,或者主庫上產生的重做日誌還沒有被備庫所應用。 

  apply finish time,該值表示在備庫上完成應用重做日誌所需要的時間。

  estimated startup time,該值表示啟動和開啟物理備庫所需要的時間,該欄位不是適用於邏輯備庫。 

  standby has been open,該值表示物理備庫自從上次啟動以來,是否以OPEN READ ONLY方式開啟過?

  該引數值如果是Y,現在需要做FAILOVER,那麼就需要先將該物理備庫shutdown然後以OPEN READ WRITE方式開啟。

  11g的dataguard可以一邊OPEN READ ONLY,一邊執行redo apply,也就是11g 的ACTIVE Dataguard。 

       VALUE:給出各個引數的值。如第1個查詢中的,apply finish time值為+00 00:00:00.1,說明該物理備庫需要0.1秒的時間來完成應用剩餘的重做日誌資料。

              UNIT:各個引數的時間單元。

              TIME_COMPUTED:物理備庫上估算各個引數的本地時間。

              DATUM_TIME:在物理備庫上獲取後設資料來估算  APPLY LAG 和 TRANSPORT LAG 這兩個引數值的本地時間。如果從多次查詢中看到該時間值對應的APPLY LAG 和 TRANSPORT LAG 這兩個引數值保持不變的話,那麼就說明該物理備庫已經停止從主庫接收到重做資料!該欄位是11g中新出現的。

 



    (4)確認主庫可以進行角色切換,查詢主庫

       SQL> select SWITCHOVER_STATUS from V$DATABASE;

       如果返回 TO STANDBY 或 SESSIONS ACTIVE,那麼主庫就可以進行切換

    (5)切換

      <1>切換主庫為備庫命令為:

       如果執行為TO STANDB執行

                SQL> alter database commit to switchover to physical standby ;

                SQL> shutdown immediate;

                SQL> startup mount;

       如果為SESSIONS ACTIVE執行

         SQL> alter database commit to switchover to physical standby with session shutdown;

         SQL> shutdown immediate;

         SQL> startup mount;


    <2>查詢備庫是否可以切換為主庫,查詢備庫:

                SQL> select SWITCHOVER_STATUS from V$DATABASE;

  如果返回 TO PRIMARY 或 SESSIONS ACTIVE,就可以切換。如果返回 SWITCHOVER LATENT 或 SWITCHOVER PENDING,就要去檢查告警日誌,

  看有什麼問題,一般是需要應用一些日誌。如果是需要應用日誌的話,在備庫執行如下命令:

                SQL> recover standby database using backup controlfile;

  完成應用後,會變成 TO PRIMARY 或 SESSIONS ACTIVE狀態。

                或者alter database recover managed standby database disconnect from session;

                    alter database recover managed standby database cancel;

              切換備庫為主庫了:

         SQL> select SWITCHOVER_STATUS from V$DATABASE;

      如果是TO_PRIMARY 執行下面的

         sql> alter database commit to switchover to primary;

        SQL> alter database open;

       如果是SESSIONS ACTIVE,執行下面的:

         SQL> alter database commit to switchover to primary with session shutdown;

          SQL> alter database open;

       備庫(現在的備庫即101)上啟用日誌應用:

         SQL> alter database recover managed standby database using current logfile disconnect from session;



  此時在現在的備庫101上執行:

   sql>select SWITCHOVER_STATUS,DATABASE_ROLE from V$DATABASE;  --not allowed PHYSICAL STANDBY 

   ora-16014錯誤,刪除standby logfile然後alter database clear logfile清理資料庫

   從現在102主庫上alter system switch logfile手工觸發去傳輸standby logfile

   注意的是:如果現在把101在切換回主庫,102成從庫。按照正常操作,先切換現在的主庫102成從庫,當操作完成的時候,101的 SWITCHOVER_STATUS就成

   to_primary也就是說可以切換成主庫了。

  現在的主庫102上執行:

   sql> select SWITCHOVER_STATUS,DATABASE_ROLE from V$DATABASE; --RESOLVABLE GAP PRIMARY

   檢查alert日誌發現ora-00312錯誤,刪除錯誤的log日誌,後狀態為TO STANDBY,PRIMARY

   sql>startup mount;

                 sql>alter database clear logfile '*****.LOG';

                 sql>alter database open



      (6)問題

           如果主備庫的sequence#不同,而且主庫切換switch logfile也不能傳送到備庫,可用下面的辦法

          手工同步歸檔日誌檔案到備庫,然後在備庫執行

            sql>alter database register logfile '/opt/oracle/oradata/orcl/archive1/'

   會報錯,不需要管,會提示可以註冊的已經註冊進去了

            sql>select sequence#,first_change#,next_change#,applied,activation# from v$archived_log;

    檢查主備庫sequence#,然後主庫切換logfile可以看到已經可以同步了



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28698327/viewspace-1073575/,如需轉載,請註明出處,否則將追究法律責任。

相關文章