第1節的時候我們就提到了角色切換,我們也聽說了其操作簡單但用途廣泛,同時我們也猜測其屬於primary與standby之間的互動,那麼在primary和standby數據庫(之一)上都需要有操作,並且切換又分了:switchover和failover,前者是無損切換,不會丟失數據,而後者則有可能會丟失數據,並且切換後原primary數據庫也不再是該data guard配置的一部分了.針對不同standby(邏輯或物理)的處理方式也不盡相同。en,內容也挺多地。我們還是先大概瞭解下概念,然後再通過實戰去印證。
角色轉換前的準備工作
l 檢查各數據庫的初始化參數,主要確認對不同角色相關的初始化參數都進行了正確的配置。
l 確保可能成爲primary數據庫的standby服務器已經處於archivelog模式。
l 確保standby數據庫的臨時文件存在並匹配primary數據庫的臨時文件
l 確保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即可:
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
轉換成功。