standby database三種模式的相互關係

season0891發表於2010-08-02

環境:windows 2k advServer SP2 + oracle 8.1.7.4

一 standby database不同模式的特點及其作用 
……standby database可以分別執行在三種模式下,即手工恢復模式(manual recover mode)、自動恢復模式(managed recover mode)和只讀模式(read only mode)。透過這三種不同的執行方式,oracle standby database提供了豐富的功能。 
……1 手工模式:手工模式是standby database執行的基礎模式,在這個模式下,standby database並不自動使用主庫傳遞過來的日誌進行恢復而保持與主庫的同步,而是需要手工進行恢復。雖然我們可以配置主庫的歸檔位置,使得主庫的歸檔日 志能自動傳遞到手工模式的待用庫,但更多的情況下是使用作業系統命令手工傳遞日誌,因而理論上我們可以為一個主庫配置無窮多個手工模式的待用庫。 
…… 在手工模式下,待用庫可以看作是處於靜止狀態,資料檔案、控制檔案等是一致的,我們可以簡單的關閉一個手工模式的待用庫,從而得到一個資料檔案一致的冷備 份,再用這個冷備份結合歸檔日誌來做其他方式的恢復,比如時間點恢復,指定事務號的恢復,特定的資料檔案的恢復,或者是做完全恢復等。 
…… 當建立完一個備用庫,並且使用alter database mount standby database載入以後,待用庫即處於手工恢復模式。在這個模式的基礎上,我們可以以只讀方式開啟(open)它,或者是將他切換到自動恢復模式,或者 是進行手工恢復,或者是關閉它而得到一個一致的冷備份,或者是啟用它成為一個普通的資料庫。 
……2 自動恢復模式:將一個standby database切換到自動恢復模式需要兩個前提:一是主庫的歸檔日誌能自動傳遞過來,二是切換之前,standby database與主庫的最大歸檔日誌號是一致的,即沒有日誌序列缺失(gap sequence 我實在不知道這樣的一個單詞應該怎樣翻譯,從原文來講,應該是序列縫隙,而從oracle文件裡的意思來講,應該是指待用庫的v$log_history 裡的最大日誌號與主庫的v$log_history 裡的最大日誌號之間的差距,即是待用庫裡還有多少個主庫的日誌沒有用於恢復,就起了這樣一個名字。各位大俠如果有更合適的詞來翻譯這個短語,請不吝賜 教)。有了這兩個前提,就可以將一個standby database 從手工模式切換到自動模式。當standby database 處於自動模式時,它可以自動應用主庫傳遞過來的歸檔日誌進行恢復,從而使得standby database資料與主庫保持一致(相差主庫線上日誌裡記錄的事務)。在8i版本,一個主庫的日誌歸檔路徑最多有5個,其中一個必須是本地路徑,因此, 從理論上講,一個主庫最多隻能帶4個自動模式的待用庫。 
…… 自動模式的待用庫使用起來非常方便,只要日誌能正常歸檔,不需要對它進行干預。當主庫出現問題時,我們可以簡單的將一個自行恢復模式的待用庫啟用,即可替 代主庫執行,數秒鐘的操作即可完成這個轉換。但是,如果因為任何原因出現了日誌序列缺失,那麼自動模式就會中止,從而回到手工模式。 
……3 只讀模式:將一個standby database 置於只讀模式是oracle在8i以後才增加的功能。Oracle 7 只有手工模式,8.0以後增加了自動模式,815以後才增加了standby database 的只讀模式。我們可以將一個standby database以只讀模式開啟,然後對資料庫進行查詢,在上面執行較大較複雜的查詢事務,比如統計報表之類的,減輕主庫的負擔。也可以透過查詢最新的數 據來檢驗standby database是否真的自動恢復了主庫的資料,是否真的與主庫同步了。如同oracle文件所講的那樣,我們可以將一個只讀模式的standby database切換到手工模式,或者是自動模式,從而再次使得這個standby database能保持與主庫同步。 
…… 據oracle文件講,在只讀模式上執行較大較複雜的查詢事務時,我們可能需要使用磁碟進行排序操作。在只讀模式下,我們可以為一個只讀的庫建立一個臨時 表空間來進行排序,這樣將在磁碟上建立一個臨時檔案,而不需要改變standby database的控制檔案。關於oracle文件裡講到的臨時表空間的問題,我看得不是很明白,當時也沒有時間做這方面的測試,這裡就不細細的再翻譯文 檔了,免得誤導大家。等我詳細的做完測試,徹底搞清楚這個臨時表空間的問題之後,再專門的寫一個專題貼上來。

二 oracle standby database三種模式的相互關係 
…… 在oracle文件裡,提供了一張圖片,描述了三種模式的相互關係。據我的測試,這張圖片是錯誤的。如圖1所示,oracle文件講,這三種模式可以直接 的互相轉換。按照我在做standby database的測試時得出的結論(具體的測試後面單獨的寫一文貼上來)以及我的理解這三種模式,包括standby database建立、啟用的關係,應該是如圖2所示 
…… 我們可以將一個手工模式的standby database切換到其他的任何一個模式,反過來講,當一個standby database處於其他模式時,要切換到另外一種模式,都必須先切換回手工恢復模式(或者取消只讀,或者中止自動恢復),然後才能切換到想要切換的模 式。並不是如oracle文件裡所講,手工模式,自動模式與只讀模式可以互相(直接)切換。不同模式的轉換,必須透過手工模式作為中介(只限於8i版本。 據說9i版本可以直接的切換而不需要透過手工模式進行轉換,因為我沒有9i環境,也沒有針對9i作過測試,也沒有看過9i的文件,姑且存疑)。這就是為什 麼我說手工模式是oracle standby database三種模式的基礎模式的原因。後面的相互切換的測試將詳細的說明這種關係。

三 standby database相互切換的測試結果 
1 手工模式切換到其他模式: 
……手工模式————> 自動模式 
SQL>recover managed standby database; 
……此時,當前的SQL*PLUS視窗停止響應。可以關閉當前視窗或者開啟另外的SQL*PLUS視窗來對待用庫進行管理或查詢。也可以在另外的視窗中輸入命令取消待用庫的自動模式,即中止待用庫自動恢復。 
……手工模式————> 只讀模式 
SQL> alter database open read only; 
……將一個待用庫置於只讀模式以後,就可以進行查詢。

2 自動模式到其他模式: 
…… 雖然oracle文件講,自動模式可以切換到手工模式,也可以切換到只讀模式,但是文件所提供的方法,都是首先取消自動模式的自動恢復。實際上,將一個自 動模式的自動恢復取消,就是將它切換到了手工模式了。因此,自動模式的standby database只能直接切換到手工模式,然後再透過手工模式切換到其他模式。 
SQL>recover managed standby database cancel; 
……或者 
SQL>recover managed standby database cancel immediate; 
…… 這兩個命令的不同之處在於,如果不帶immediate選項,那麼managed standby database將當前正在進行恢復的日誌恢復完成以後,才中止自動恢復,而不再讀取下一個歸檔日誌。如果新增了immediate選項,那麼 managed standby database將在讀取當前使用的歸檔日誌的下一個塊之前,或者是在讀取下一個日誌之前中止恢復。如果輸入此命令時,oracle正在使用當前日誌的最 後一個塊,即在讀取下一個日誌之前中止了恢復,那麼與不帶immediate選項是一樣的。如果是在讀取當前日誌的下一個塊之前中止了恢復,那麼 oracle的檔案是不一致的,這種情況下,不能以只讀方式開啟待用庫(這一步未做測試,因為我的測試環境裡沒有產生過超過100K的日誌檔案,姑且信 之)。 
……要想快速檢測備庫是否自動使用了主庫的最 新的歸檔日誌,即檢測備庫是否真的處於自管理模式,可以手工強制切換主庫日誌後,分別查詢主庫與備庫的最大歸檔日誌號是否一致。如果不一致,等待一段時間 後再查詢(有可能備庫還沒有來得及用主庫的日誌進行自動恢復),等待的時間取決於歸檔日誌的大小,以及機器的效能。 
查詢最大歸檔日誌號的命令: 
SQL>select max(sequence#) from v$log_history;

3 只讀模式到其他模式: 
…… 同樣地,oracle文件也說可以將只讀模式的standby database轉換到其他模式,前提是首先關閉所有連線到待用庫的連線,然後再進行切換。我在測試中發現,就連當前輸入切換命令的連線也需要關閉,只讀 模式的standby database才能切換。在實際的應用中,如果連輸入命令的視窗都關閉了,那麼如何輸入切換的命令呢?因此,想要將一個只讀模式的待用庫切換到其他模 式,只能先將它關閉,然後再載入它,切換到其他的模式。 
SQL>shutdown immediate; 
SQL>startup nomunt; 
SQL>alter database mount standby database; 
……此時,standby database就置於手工模式了,可以進行手工恢復,或者在消除了日誌序列缺失後,切換到自動模式。

4 啟用一個standby database: 
……如果standby database處於手工模式之外的其他模式,首先應將之切換到手工模式,然後做手工恢復,消除日誌序列缺失,再將它啟用,否則可能丟失資料。 
SQL>alter database activate standby database; 
……完成這一步操作之後,檢視線上日誌組所在的目錄,可以看到新生成了線上日誌組。此時查詢v$instance檢視,資料庫為start狀態,此時資料庫還不能進行查詢或其他操作。Oracel文件講,需要關閉資料庫,然後再開啟它,即作如下操作: 
SQL>shutdown immdiate; 
SQL>startup; 
……但經測試發現,雖然在啟用standby database之後資料庫處於start狀態,但是可以不關閉再開啟它,而可以先載入,然後再開啟: 
SQL>alter database activate standby database; 
SQL>alter database mount; 
SQL>alter database open; 
……這時就可以正常的使用資料庫了。 
這是oracle文件描述的standby database 三種模式的相互關係,按文件的說法,三種模式可以“直接”相互切換。

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

相關文章