Data Guard學習之物理standby建立步驟

yeahokay發表於2008-05-06
不管物理standby還是邏輯standby,其初始建立都是要依賴primary資料庫,因為這個準備工作中最重要的一部分,就是對primary資料庫的配置。[@more@]一、準備工作

  不管物理standby還是邏輯standby,其初始建立都是要依賴primary資料庫,因為這個準備工作中最重要的一部分,就是對primary資料庫的配置。


  1、開啟Forced Logging模式

  將primary資料庫置為FORCE LOGGING模式。透過下列語句:

  SQL> alter force logging;

  提示:關於FORCE LOGGING

  想必大家知道有一些DDL語句可以透過指定NOLOGGING子句的方式避免寫redo log(目的是提高速度,某些時候確實有效),指定為FORCE LOGGING模式後,資料庫將會記錄除臨時表或臨時回滾段外所有的操作而忽略類似NOLOGGING之類的指定引數。如果在執行force logging時有nologging之類的語句在執行,則force logging會等待直到這類語句全部執行。FORCE LOGGING是做為固定引數儲存在控制檔案中,因此其不受重啟之類操作的影響(只執行一次即可),如果想取消,可以透過alter database no force logging語句關閉強制記錄。

  2、建立密碼檔案(如果不存在的話)

  需要注意的是,同一個Data Guard配置中所有資料庫必須都擁有獨立的密碼檔案,並且必須保證同一個Data Guard配置中所有資料庫伺服器的SYS使用者擁有相同密碼以保證redo資料的順利傳輸,因為redo傳輸服務透過認證的網路會話來傳輸redo資料,而會話使用包含在密碼檔案中的SYS使用者密碼來認證。

  3、配置Standby Redo Log

  對於最大保護和最高可用性模式,Standby資料庫必須配置standby redo log,並且推薦所有資料庫都使用LGWR ASYNC模式傳輸,當然你現在可能還不知道LGWR ASYNC是什麼問題,沒關係,你很快就會知道了。

  Oracle建議你在建立standby時就考慮standby redolog配置的問題。standby redologs與online redologs非常類似,應該說兩者只是服務物件不同,其它引數屬性甚至操作的命令格式幾乎都一樣,你在設計standby redologs的時候完全可以借鑑建立online redologs的思路,比如多個檔案組啦,每組多個檔案冗餘之類的。除些之外呢,oracle提供了一些標準的建議如下:

   確保standby redo log的檔案大小與primary資料庫online redo log檔案大小相同。

  這個很好理解的吧,就是為了接收和應用方便嘛。

   建立適當的日誌組

  一般而言,standby redo日誌檔案組數要比primary資料庫的online redo日誌檔案組數至少多一個。推薦standby redo日誌組數量基於primary資料庫的執行緒數(這裡的執行緒數可以理解為結構中的rac節點數)。

  有一個推薦的公式可以做參考:(每執行緒的日誌組數+1)*最大執行緒數

  例如primary資料庫有兩個執行緒,每個執行緒分配兩組日誌,則standby日誌組數建議為6組,使用這個公式可以降低primary資料庫例項LGWR程式鎖住的可能性。

  提示:邏輯standby資料庫有可能需要視工作量增加更多的standby redo log檔案(或增加歸檔程式),因為邏輯standby需要同時寫online redo log檔案。

  Standby redo log的操作方式與online redo log幾乎一模一樣,只不過在建立或刪除時需要多指定一個standby關鍵字,例如新增:

 SQL> alter database add standby logfile group 4 ('e:ora10goradatajsspdgSTANDBYRD01.LOG') size 20M;

  刪除也同樣簡單:

  SQL> alter database drop standby logfile group 4;

  另外,從可靠性方面考慮,建議在primary資料庫也建立standby redologs,這樣一旦發生切換,不會影響primary做為standby的正常執行。

  驗證standby redo log檔案組是否成功建立

  例如:

  SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;

  4、設定初始化引數

  對於primary資料庫,需要定義幾個primary角色的初始化引數控制redo傳輸服務,還有幾個附加的standby角色的引數需要新增以控制接收redo資料庫並應用(switchover/failover後primary/standby角色可能互換,所以建議對於兩類角色相關的初始化引數都進行配置)。

下列引數為primary角色相關的初始化引數:
DB_NAME
注意保持同一個Data Guard中所有資料庫DB_NAME相同。
例如:DB_NAME=jssweb
DB_UNIQUE_NAME
為每一個資料庫指定一個唯一的名稱,該引數一經指定不會再發生變化,除非你主動修改它。
例如:DB_UNIQUE_NAME=jssweb
LOG_ARCHIVE_CONFIG
該引數透過DG_CONFIG屬性羅列同一個Data Guard中所有DB_UNIQUE_NAME(含primary db及standby db),以逗號分隔
例如:LOG_ARCHIVE_CONFIG='DB_CONFIG=(jssweb,jsspdg)'
CONTROL_FILES
沒啥說的,控制檔案所在路徑。
LOG_ARCHIVE_DEST_n
歸檔檔案的生成路徑。該引數非常重要,並且屬性和子引數也特別多(這裡不一一列舉,後面用到時單獨講解如果你黑好奇,建議直接查詢oracle官方文件。Data guard白皮書第14章專門介紹了該引數各屬性及子引數的功能和設定)。例如:
LOG_ARCHIVE_DEST_1=
'LOCATION=E:ora10goradatajssweb VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=jssweb'
LOG_ARCHIVE_DEST_STATE_n
指定引數值為ENABLE,允許redo傳輸服務傳輸redo資料到指定的路徑。該引數共擁有4個屬性值,功能各不相同。
REMOTE_LOGIN_PASSWORDFILE
推薦設定引數值為EXCLUSIVE或者SHARED,注意保證相同Data Guard配置中所有db伺服器sys密碼相同。
LOG_ARCHIVE_FORMAT
指定歸檔檔案格式。
LOG_ARCHIVE_MAX_PRODUCESSES
指定歸檔程式的數量(1-30),預設值通常是4。
以下引數為standby角色相關的引數,建議在Primary資料庫的初始化引數中也進行設定,這樣在role transition後(Primary轉為Standby)也能正常執行:
FAL_SERVER
指定一個資料庫SID,通常該庫為primary角色。
例如:FAL_SERVER=jssweb
FAL_CLIENT
指定一個資料庫SID,通常該庫為standby角色。
例如:FAL_CLIENT=jsspdg
提示:FAL是Fetch Archived Log的縮寫
DB_FILE_NAME_CONVERT
在做duplicate複製和傳輸表空間的時候這類引數講過很多遍,該引數及上述內容中同名引數功能,格式等完全相同。
LOG_FILE_NAME_CONVERT
同上
STANDBY_FILE_MANAGEMENT
如果primary資料庫資料檔案發生修改(如新建,重新命名等)則按照本引數的設定在standby中做相應修改。設為AUTO表示自動管理。設為MANUAL表示需要手工管理。
例如:STANDBY_FILE_MANAGEMENT=AUTO

  注意:上面列舉的這些引數僅只是對於primary/standby兩角色可能會相關的引數,還有一些基礎性引數比如*_dest,*_size等資料庫相關的引數在具體配置時也需要根據實際情況做出適當修改。

5、確保資料庫處於歸檔模式

  SQL> archive log list;

  資料庫日誌模式 存檔模式

  自動存檔 啟用

  .......

  如果當前primary資料庫並未處於歸檔模式,可透過下列命令將資料庫置為歸檔模式:

  SQL> STARTUP MOUNT;

  SQL> ALTER DATABASE ARCHIVELOG;

  SQL> ALTER DATABASE OPEN;

  二、手把手的建立物理standby

  1、建立(手工複製資料檔案或透過RMAN) ---primary庫操作

  2、建立控制檔案 --primary庫操作

  透過下列語句為standby資料庫建立控制檔案

  SQL> alter database create standby controlfile as 'd:backupjsspdg01.ctl';

  注意喲,控制檔案通常需要有多份,你要麼手工將上述檔案複製幾份,要麼用命令多建立幾個出來。另外,建立完控制檔案之後到standby資料庫建立完成這段時間內,要保證primary資料庫不再有結構性的變化(比如增加表空間等等),不然primary和standby同步時會有問題。

  3、建立初始化引數檔案

   建立客戶端初始化引數檔案

  例如:

  SQL> create pfile='d:backupinitjsspdg.ora' from spfile;

   修改初始化引數檔案中的引數

  根據實際情況修改吧,注意primary和standby不同角色的屬性配置,注意檔案路徑。

  4、複製檔案到standby伺服器

  至少三部分:資料檔案,控制檔案,修改過的初始化引數檔案,注意路徑。

5、配置standby資料庫

  如果你看過三思之前"一步一步學rman"系列,看過"duplicate複製資料庫",或看過"傳輸表空間複製資料"系列,那麼對於建立一個新的資料庫應該非常熟悉了,下面再簡單描述一下步驟:

  1).建立新的OracleService(windows環境下需要)。

  2).建立密碼檔案,注意保持密碼與primary資料庫一致。

  3).配置監聽並啟動

  4).修改primary和standby的tnsnames.ora,各自增加對應的Net Service Name。

  5).建立伺服器端的初始化檔案

  6、啟動standby

  注意喲,我們們前面說過的,物理standby極少情況下可以以read-write模式開啟,某些情況下可以以read-only模式開啟,所以預設情況下,載入到mount狀態即可。

  SQL> STARTUP MOUNT;

  啟動redo應用

  SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

  啟動實時應用

  SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

  提示:disconnect from session子句並非必須,該子句用於指定啟動完應用後自動退出到命令運算子前,如果不指定的話,當前session就會一直停留處理redo應用,如果想做其它操作,就只能新建一個連線。

  7、停止standby

  正常情況下,我們停止也應該是先停止redo應用,可以透過下列語句:

  SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CALCEL;

  然後再停止standby資料庫

  SQL> SHUTDOWN IMMEDIATE;

  當然你非要直接shutdown也沒問題,dg本來就是用於容災的,別說你生停standby,就是直接拔電源也不怕。

物理standby建立示例

  為了最大的降低硬體需求,此處建立的data guard處於同一臺機器,但其建立過程與多機並無區別。做為演示用的示例足夠了,我們分兩階段配置,分別是配置primary資料庫和配置standby資料庫,如下:

  一、Primary資料庫配置及相關操作

  1、確認主庫處於歸檔模式

  SQL> archive log list;

  資料庫日誌模式 存檔模式

  自動存檔 啟用

  存檔終點 E:ora10goradatajssweb

  最早的聯機日誌序列 148

  下一個存檔日誌序列 150

  當前日誌序列 150

  SQL>

  2、將primary資料庫置為FORCE LOGGING模式。透過下列語句:

  SQL> alter database force logging;

  資料庫已更改。

  3、建立standby資料庫控制檔案

  SQL> alter database create standby controlfile as 'd:backupjsspdg01.ctl';

  資料庫已更改。

  4、建立primary資料庫客戶端初始化引數檔案

  注:主要此處修改項較多,為了方便,我們首先建立並修改pfile,然後再透過pfile重建spfile,你當然也可以透過alter system set命令直接修改spfile內容。

  SQL> create pfile from spfile;

  檔案已建立。

  將該初始化引數檔案複製一份,做為standby資料庫的客戶端初始化引數檔案

 SQL> host copy e:ora10gproduct10.2.0db_1databaseinitjssweb.ora d:backupinitjsspdg.ora

  已複製 1 個檔案。

  SQL>

  修改客戶端初始化引數檔案,增加下列內容

  DB_UNIQUE_NAME=jssweb
  LOG_ARCHIVE_CONFIG='DG_CONFIG=(jssweb,jsspdg)'
  LOG_ARCHIVE_DEST_1='LOCATION=E:ora10goradatajssweb VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=jssweb'
  LOG_ARCHIVE_DEST_2='SERVICE=jsspdg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=jsspdg'
  LOG_ARCHIVE_DEST_STATE_1=ENABLE
  LOG_ARCHIVE_DEST_STATE_2=ENABLE
  REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
  #--------配置standby角色的引數用於角色轉換
  FAL_SERVER=jsspdg
  FAL_CLIENT=jssweb
  DB_FILE_NAME_CONVERT='oradatajsspdg','oradatajssweb'
  LOG_FILE_NAME_CONVERT='oradatajsspdg','oradatajssweb'
  STANDBY_FILE_MANAGEMENT=AUTO

  透過pfile重建spfile

  SQL> shutdown immediate
  ...
  SQL> create spfile from pfile='initjssweb.ora';

  檔案已建立。

  5、複製資料檔案到standby伺服器(方式多樣,不詳述)

  注意需要複製所有資料檔案,備份的控制檔案及客戶端初始化引數檔案

  6、配置listener及net service names(方式多樣,不詳述)。

  完之後重啟listener:

  E:ora10g>lsnrctl stop

  E:ora10g>lsnrctl start

  透過tnsping測試tnsnames是否正確有效:

  E:ora10g>tnsping jssweb
  ...
  Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = jss)(PORT = 1521)) (CONNECT_
  DATA = (SERVER = DEDICATED) (SERVICE_NAME = jssweb)))
  OK (30 毫秒)
  E:ora10g>tnsping jsspdg
  ...
  Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = jss)(PORT = 1521)) (CONNECT_
  DATA = (SERVER = DEDICATED) (SERVICE_NAME = jsspdg)))
  OK (10 毫秒)

  二、Standby資料庫配置及相關操作

  1、透過ORADIM建立新的OracleService

  2、建立密碼檔案,注意保護sys密碼與primary資料庫一致。

  E:ora10g>orapwd file=e:ora10gproduct10.2.0db_1databasePWDjsspdg

  .ora password=verysafe entries=30

  3、建立目錄

  E:ora10gproduct10.2.0adminjsspdg>mkdir adump

  4、複製檔案,不做過多描述

  5、修改初始化引數檔案

  增加下列引數

  db_unique_name=jsspdg
  LOG_ARCHIVE_CONFIG='DG_CONFIG=(jssweb,jsspdg)'
  DB_FILE_NAME_CONVERT='oradatajssweb','oradatajsspdg'
  LOG_FILE_NAME_CONVERT='oradatajssweb','oradatajsspdg'
  LOG_ARCHIVE_FORMAT=log%t_%s_%r.arc
  LOG_ARCHIVE_DEST_1='LOCATION=E:ora10goradatajsspdg VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=jsspdg'
  LOG_ARCHIVE_DEST_STATE_1=ENABLE
  #---下列引數用於角色切換
  LOG_ARCHIVE_DEST_2='SERVICE=jssweb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) B_UNIQUE_NAME=jssweb'
  LOG_ARCHIVE_DEST_STATE_2=ENABLE
  REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
  FAL_SERVER=jssweb
  FAL_CLIENT=jsspdg
  STANDBY_FILE_MANAGEMENT=AUTO

注意同時修改*_dest的路徑。

  透過該pfile建立spfile

  SQL> create spfile from pfile='D:backupinitjsspdg.ora';

  檔案已建立。

  6、啟動standby到mount

  SQL> startup mount;

  ORACLE 例程已經啟動。

  Total System Global Area 167772160 bytes

  Fixed Size 1289484 bytes

  Variable Size 62915316 bytes

  Database Buffers 96468992 bytes

  Redo Buffers 7098368 bytes

  資料庫裝載完畢。

  7、啟動redo應用

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

  資料庫已更改。

  8、檢視同步情況

  首先連線到primary資料庫

  SQL> show parameter instance_name;
  NAME TYPE VALUE
  ------------------------------------ ----------- ------------------------------
  instance_name string jssweb
  SQL> alter system switch logfile;

  系統已更改。

  SQL> select max(sequence#) from v$archived_log;
  MAX(SEQUENCE#)
  --------------
  51

  連線到standby資料庫

  SQL> show parameter instance_name;
  NAME TYPE VALUE
  ------------------------------------ ----------- ------------------------------
  instance_name string jsspdg
  SQL> select max(sequence#) from v$archived_log;
  MAX(SEQUENCE#)
  --------------
  51

  9、暫停應用

  透過下列語句暫停redo應用。

  SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

  資料庫已更改。

  注意,此時只是暫時redo應用,並不是停止Standby資料庫,standby仍會保持接收只不過不會再應用接收到的歸檔,直到你再次啟動redo應用為止。

  哈哈,成功了!現在你是不是想知道怎麼把standby變成primary呢?接著往下看~~~~~~~~~

  物理standby角色轉換

  第1節的時候我們就提到了角色切換,我們也聽說了其操作簡單但用途廣泛,同時我們也猜測其屬於primary與standby之間的互動,那麼在primary和standby資料庫(之一)上都需要有操作,並且切換又分了:switchover和failover,前者是無損切換,不會丟失資料,而後者則有可能會丟失資料,並且切換後原primary資料庫也不再是該data guard配置的一部分了.針對不同standby(邏輯或物理)的處理方式也不盡相同。en,內容也挺多地。我們還是先大概瞭解下概念,然後再透過實戰去印證。

  角色轉換前的準備工作

  •    檢查各資料庫的初始化引數,主要確認對不同角色相關的初始化引數都進行了正確的配置。
  •    確保可能成為primary資料庫的standby伺服器已經處於archivelog模式。
  •    確保standby資料庫的臨時檔案存在並匹配primary資料庫的臨時檔案
  •    確保standby資料庫的RAC例項只有一個處於open狀態。(對於rac結構的standby資料庫,在角色轉換時只能有一個例項startup。其它rac例項必須統統shutdown,待角色轉換結束後再startup)

  Switchover:

  無損轉換,通常是使用者手動觸發或者有計劃的讓其自動觸發,比如硬體升級啦,軟體升級啦之類的。通常它給你帶來的工作量非常小並且都是可預計的。其執行分兩個階段,第一步,primary資料庫轉換為standby角色,第二步,standby資料庫(之一)轉換為primary角色,primary和standby只是簡單的角色互換,這也印證了我們前面關於角色轉換是primary/standby互動的猜測。

Failover:

  不可預知原因導致primary資料庫故障並且短期內不能就需要failover。如果是這種切換那你就要小心點了,有可能只是虛驚一場,甚至連你可能損失的腦細胞的數量都能預估,但如果運氣不好又沒有完備的備份恢復策略而且primary資料並非處於最大資料保護或最高可用性模式地話,黑黑,哭是沒用地,表太傷心了,來,讓三思GG安慰安慰你,這種情況下呢丟失資料有可能是難免的,並且如果其故障未能修復,那它甚至連快速修復成為standby的機會也都失去了吶,咦,你腦門怎麼好像在往外冒水,難道是強效淨膚液,你的臉也忽然好白皙喲~~~~

  在執行failover之前,儘可能將原primary資料庫的可用redo都複製到standby資料庫。

  注意,如果要轉換角色的standby處於maximum protection模式,需要你首先將其切換為maximum performance模式(什麼什麼,你不知道怎麼轉換模式?oooo,對對,我們還沒有操作過,這塊並不複雜,接下來會透過專門章節討論),這裡先提供透露一下,轉換standby資料庫到MAXIMIZE PERFORMANCE執行下列即可:

  SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;

  等standby切換為新的primary之後,你可以再隨意更改資料庫的保護模式。

  你是不是有疑問關於為什麼待切換角色的standby不能處於maximum protection模式呢?這個其實很好理解,我們在第一節三種保護模式的時候就介紹過其各自的特點,腦袋瓜好使的同學應該還有印象,maximum protection模式需要確保絕無資料丟失,因此其對於提交事務對應的redo資料一致性要求非常高,另外,如果處於maximum protection模式的primary資料庫仍然與standby資料庫有資料傳輸,此時alter database語句更改standby資料庫保護模式會失敗,這也是由maximum protection模式特性決定的。

  下面分別演示switchover和failover的過程

  一、物理standby的Switchover

  注意操作步驟的先後,很關鍵的喲。

  1、檢查是否支援switchover操作 --primary資料庫操作

  登陸primary資料庫,查詢v$database檢視的switchover_status列。

  E:ora10g>set oracle_sid=jssweb

  E:ora10g>sqlplus "/ as sysdba"

  SQL*Plus: Release 10.2.0.3.0 - Production on 星期四 12月 13 09:41:29 2007

  Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

  已連線。

  SQL> select switchover_status from v$database;

  SWITCHOVER_STATUS

  --------------------

  TO STANDBY

  如果該列值為"TO STANDBY"則表示primary資料庫支援轉換為standby角色,否則的話你就需要重新檢查一下Data Guard配置,比如看看LOG_ARCHIVE_DEST_n之類引數值是否正確有效等等。

2、啟動switchover --primary資料庫操作
  首先將primary轉換為standby的角色,透過下列語句:
  SQL> alter database commit to switchover to physical standby;
  資料庫已更改。
  語句執行完畢後,primary資料庫將會轉換為standby資料庫,並自動備份控制檔案到trace。
  3、重啟動到mount --原primary資料庫操作
  SQL> shutdown immediate
  ORA-01507: 未裝載資料庫
  ORACLE 例程已經關閉。
  SQL> startup mount
  ORACLE 例程已經啟動。
  Total System Global Area 167772160 bytes
  Fixed Size 1289484 bytes
  Variable Size 104858356 bytes
  Database Buffers 54525952 bytes
  Redo Buffers 7098368 bytes
  資料庫裝載完畢。
  4、檢查是否支援switchover操作 --待轉換standby資料庫操作
  待原primary切換為standby角色之後,檢查待轉換的standby資料庫switchover_status列,看看是否支援角色轉換。
  E:ora10g>set oracle_sid=jsspdg
  E:ora10g>sqlplus " / as sysdba"
  SQL*Plus: Release 10.2.0.3.0 - Production on 星期四 12月 13 10:08:15 2007
  Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
已連線。
  SQL> select switchover_status from v$database;
  SWITCHOVER_STATUS
  --------------------
  TO PRIMARY
  SQL>
  此時待轉換standby資料庫switchover_status列值應該是"TO_PRIMARY",如否則檢查其初始化引數檔案中的設定,提示一下,比著原primary資料庫的初始化引數改改。
  5、轉換角色到primary --待轉換standby資料庫操作
  透過下列語句轉換standby到primary角色:
  SQL> alter database commit to switchover to primary;
  資料庫已更改。
  注意:待轉換的物理standby可以處於mount模式或open read only模式,但不能處於open read write模式。
  6、完成轉換,開啟新的primary資料庫
  SQL> alter database open;
  資料庫已更改。
  注:如果資料庫處於open read-only模式的話,需要先shutdown然後直接startup即可。
  7、驗證一下
  新的primary資料庫
  SQL> show parameter db_unique
  NAME TYPE VALUE
  ------------------------------------ ----------- ------------------------------
  db_unique_name string jsspdg
  SQL> select max(sequence#) from v$archived_log;
  MAX(SEQUENCE#)
  --------------
  67
  SQL> alter system switch logfile;
  系統已更改。

  SQL> select max(sequence#) from v$archived_log;
  MAX(SEQUENCE#)
  --------------
  68
  新的standby資料庫
  SQL> show parameter db_unique
  NAME TYPE VALUE
  ------------------------------------ ----------- ------------------------------
  db_unique_name string jssweb
  SQL> select max(sequence#) from v$archived_log;
  MAX(SEQUENCE#)
  --------------
  68
  轉換成功。
  二、物理standby的failover
  注意幾點:
• failover之後,原primary資料庫預設不再是data guard配置的一部分。  
• 多數情況下,其它邏輯/物理standby資料庫不直接參與failover的過程,因此這些資料庫不需要做任何操作。  
• 某些情況下,新的primary資料庫配置之後,需要重新建立其它所有的standby資料庫。  
  另外,如果待轉換角色的standby處於maximum protection或maximum availability模式的話,歸檔日誌應該是連續存在的,這種情況下你可以直接從第3步執行,否則建議你按照操作步驟從第1步開始執行。
  一般情況下failover都是表示primary資料庫癱瘓,最起碼也是起不來了,因此這種型別的切換基本上不需要primary資料庫做什麼操作。所以下列步驟中如果有提到primary和standby執行的,只是建議你如果primary還可以用,那就執行一下,即使它能用你卻不執行,也沒關係,不影響standby資料庫的切換:)
  1、檢查歸檔檔案是否連續
  查詢待轉換standby資料庫的V$ARCHIVE_GAP檢視,確認歸檔檔案是否連線:
  SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
  未選定行
  如果返回的有記錄,按照列出的記錄號複製對應的歸檔檔案到待轉換的standby伺服器。這一步非常重要,必須確保所有已生成的歸檔檔案均已存在於standby伺服器,不然可能會資料不一致造成轉換時報錯。檔案複製之後,透過下列命令將其加入資料字典:
  SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';

2、檢查歸檔檔案是否完整
  分別在primary/standby執行下列語句:
  SQL> select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;
  該語句取得當前資料庫各執行緒已歸檔檔案最大序號,如果primary與standby最大序號不相同,必須將多出的序號對應的歸檔檔案複製到待轉換的standby伺服器。不過既然是failover,有可能primary資料庫此時已經無法開啟,甚至無法訪問,那你只好聽天由命嘍,三思在這裡替你默唸:蒼天啊,大地啊,哪路的神仙大姐能來保佑俺們不丟資料呀!
  3、啟動failover
  執行下列語句:
  SQL> alter database recover managed standby database finish force;
  資料庫已更改。
  FORCE關鍵字將會停止當前活動的RFS程式,以便立刻執行failover。
  剩下的步驟就與前面switchover很相似了
  4、切換物理standby角色為primary
  SQL> alter database commit to switchover to primary;
  資料庫已更改。
  5、啟動新的primary資料庫。
  如果當前資料庫已mount,直接open即可,如果處於read-only模式,需要首先shutdown immediate,然後再直接startup。
  SQL> alter database open;
  資料庫已更改。
  角色轉換工作完成。剩下的是補救措施(針對原primary資料庫),由於此時primary資料庫已經不再是data guard配置的一部分,我們需要做的就是嘗試看看能否恢復原primary資料庫,將其改造為新的standby伺服器。具體操作方式可以分為二類:1.重建 2.備份恢復。

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

相關文章