一步一步學DataGuard(6)物理standby之switchover

第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即可:

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

轉換成功。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章