OS:windows 2000 advanced server SP2
Oracle:8.1.7.4
假定主庫與備用庫不在同一個主機上,目錄結構相同,并且配置一個自管理備用庫(managed standby database):
主庫 備庫
主機IP 192.168.1.20 192.168.1.30
主機名 PrimDB StbyDB
SID Orcl Orcl
資料庫服務名 Orcl Orcl
一 建立一個主庫的資料檔案備份:用冷備份方式,備份到e:\shared\back
二 建立備用庫的控制檔案:冷備份之後,打開主庫
SQL> connect internal/oracle as sysdba;
SQL>startup pfile=d:\oracle\admin\orcl\init.ora;
SQL>alter database create standby controlfile as ‘e:\shared\back\stby_ctl.ctl’;
三 通過網絡複制備份的資料檔案和備用控制檔案到備庫主機
四 配置主庫的tnsnames.ora檔案,添加備庫别名為stby1,即下面内容:
stby1=(description=
(address=
(protocol=tcp)
(port=1523)
(host=192.168.1.30))
(connect_data=
(SID=orcl)))
五 配置備用庫的listener.ora檔案,添加監聽服務standby_listener,在相應的節裡添加有關的内容。如果原檔案内已有,則修改之。
standby_listener節:
(address_list=
(host=192.168.1.30)
) )
SID_list_standby_listener節:
(sid_list=
(sid_desc=
(sid_name=orcl)
(oracle_home=d:\oracle\ora81)
這個檔案中隻能有這兩節,不能有多個組,雖然可以定義監聽的名字不同,但在啟動監聽服務的時候,都隻啟動一個監聽服務。
六 重新啟動備庫監聽服務,以使更改生效:
DOS>lsnrctl # 啟動監聽服務管理程式
LSNRCTL>status # 檢視監聽服務狀态
LSNRCTL>stop # 停止監聽服務
LSNRCTL>start # 啟動監聽服務
也可以在管理工具的服務管理裡停止和啟動服務。
七 配置主庫的初始化參數檔案init.ora,修改歸檔目的地。本地歸檔隻歸檔到一個目錄e:\log。添加以下内容:
# 定義本地歸檔路徑,強制歸檔,重試時間2秒
log_archive_dest_1 = “location=e:\log\ mandatory reopen=2”
log_archive_dest_state_1 = enable
# 定義歸檔到備用庫,強制歸檔,重試時間15秒。
# 如果定義為可選狀态(optional),那麼在歸檔失敗後不會再次嘗試歸檔的。定義
# 為madatory狀态後,如果本次歸檔失敗,則在歸檔下一個日志時會再次嘗試
# 重傳上一個未成功歸檔的日志。
log_archive_dest_2 = “service=stby1 mandatory reopen=15”
log_archive_dest_2 = enable
# 定義必須成功歸檔的日志數,隻需要本地成功歸檔即可
log_archive_min_succeed_dest = 1
八 使主庫修改後的參數生效。以下操作是在未重新開機主庫時使用。如果修改主庫初始化參數檔案後重新啟動了主庫,則可以不使用下列指令。下列指令隻對目前執行個體有效。
SQL>alter system set log_archive_dest_1 = “location=e:\log mandatory reopen=2”;
SQL>alter system set log_archive_dest_state_1 = enabl;
SQL>alter system set log_archive_dest_2 = “service=stby1 mandatory reopen=30”;
SQL>alter system set log_archive_dest_2 = enable;
SQL>alter system set log_archive_min_succeed_dest = 1;
九 配置備用庫的初始化參數檔案:将主庫的初始化參數檔案複制到備庫,删除原有的日志歸檔目錄項,并添加以下内容:
log_archive_dest = e:\log
log_archive_trace = 6 #定義日志跟蹤層次
standby_archive_dest = e:\log
# 更改控制檔案名
control_files = (“d:\oracle\oradata\orcl\stby_ctl.ctl”)
十 啟動備用庫
将從主庫複制過來的資料檔案、控制檔案複制到相應的位置,然後在備庫上操作(此時備庫處于關閉狀态):
SQL>connect internal/oracle as sysdba
SQL>startup nomount
SQL>alter database mount standby database
十一 如果有日志序列的缺失,則先将主庫的日志複制到備庫日志目錄,進行手工恢複
SQL>recover automatic standby database;
或者:
SQL>recover standby database until cancel;
檢視日志序列是否有缺失的SQL語句:
SQL>SELECT high.thread#, "LowGap#", "HighGap#"
FROM
(
SELECT thread#, MIN(sequence#)-1 "HighGap#"
( SELECT a.thread#, a.sequence#
v$archived_log a,
( SELECT thread#, MAX(next_change#) gap1
FROM v$log_history
GROUP BY thread#
) b
WHERE a.thread# = b.thread#
AND a.next_change# > b.gap1
)
) high,
SELECT thread#, MIN(sequence#) "LowGap#"
( SELECT thread#, sequence#
FROM v$log_history, v$datafile
WHERE checkpoint_change# <= next_change#
AND checkpoint_change# >= first_change#
) low
WHERE low.thread# = high.thread# ;
如果備庫有日志序列缺失,則同一個thread#的LowGap# 與 HighGap# 不等。如果沒有日志序列缺失,那麼選出空值或者是LowGap# 與 HighGap# 相同。
十二 将備庫置于自管理模式
SQL>recover managed standby database;
此時,SQLPLUS視窗停止響應,直到取消備庫自管理模式。要取消備庫的自管理模式的指令:
SQL>recover managed standby database cancel;
Standby database 維護Standby
database 的生命周期,從建立一個standby database開始,一直到激活為止。即:建立——>>
使用(手工管理、自管理、隻讀模式選擇循環)——>>激活。在使用過程中,主庫可能發生很多影響到standby
database正常使用的事件,也就是說,主庫的一些變化,不能通過日志同步到standby
database上來,因而需要手工幹預。對于不同的主庫事件,standby database需要進行不同的處理。
1
歸檔錯誤:發生歸檔錯誤的原因很多,因為各種原因導至主庫産生的歸檔日志不能傳遞到待用庫,都會發生歸檔錯誤。發生歸檔錯誤可以通過
error.v$archive_destination或archived.v$log查詢,也可以檢視alert.log日志檔案或者是歸檔跟蹤檔案
查出。一旦出現歸檔錯誤,就需要手工傳遞歸檔日志到待用庫。
2
添加主庫表空間或資料檔案:主庫添加了表空間或者資料檔案後,待用庫的控制檔案中表空間或資料檔案資訊可以通過使用主庫傳遞而來的日志,進而與主庫同步,
但是待用庫不能在磁盤上建立檔案,是以,如果待用庫使用主庫日志修改了待用庫控制檔案資訊,同時又在待用庫的相應位置找到了這個實體檔案的話,那麼恢複就
繼續自動進行。如果找不到,那麼恢複終止。這時,需要手工維護待用庫:
在待用庫處于自管理狀态下的維護過程:
1) 添加主庫的表空間tbs_2,檔案為f_tbs2.dbf,大小為2M:
SQL> create tablespace tbs_2 datafile ‘d:\oracle\oradata\orcl\f_tbs2.dbf’ size 2M;
2) 切換主庫日志,讓待用庫開始進行重做:
SQL>alter system switch logfile;
此
時,如果待用庫自動恢複到包含有create
tablespace語句的日志時,就會因為在待用庫的對應位置上找不到檔案而中止恢複。我們可以等待待用庫從自管理狀态下退出,也可以在待用庫上鍵入命
令 recover managed standby database cancel手工停止恢複。
待用庫停止恢複後,控制檔案中已包含了表空間tbs_2的資訊,在待用庫的alert.log檔案中也能找到相應的警告資訊,有該檔案的全路徑名。
3) 在待用庫中建立資料檔案:
SQL>alter database create datafile ‘d:\oracle\oradata\orcl\f_tbs2.dbf’ as ‘d:\oracle\oradata\orcl\f_tbs2.dbf’;
4) 将待用庫重新置于自管理狀态:
SQL> recover managed standby database;
這樣,繼續主庫的過程,解決了待用庫不能自動建立資料檔案的問題。
3 重命名主庫的資料檔案:主庫的資料檔案重命名不能待用庫,除非對待用庫的控制檔案也進行了更新。是以,在重命名了主庫的資料檔案後,同樣的指令也需要在待用庫是重做一遍。
4
添加或删除主庫的重做日志組或成員:這個操作僅對主庫的線上日志産生影響,而不影響到主庫的歸檔日志,也不導緻主庫的資料變化。而待用庫正常使用的過程
中,不需要線上日志,僅僅是在激活待用庫時,才建立線上日志級及其成員。是以,主庫添加或删除重做日志或成員,不影響待用庫。僅僅當待用庫激活後,才需要
重新添加或删除重做日志組或成員。也就是說,如果想讓待用庫與主庫的變化相一緻,這個操作應在待用庫激活之後再重複一遍。
5
主庫的資料檔案自動擴充:如果主庫的一個表空間資料檔案設定為autoextend
on,那麼當這個資料檔案空間不夠時,将會自動擴充。待用庫可以在控制檔案中記錄這個變化,但是不能改變資料檔案,是以不能完成資料檔案的自動擴充。
Oracle文檔在提到這個問題時,提供的解決辦法就是確定資料檔案有足夠的空間。那麼,一旦出現了空間不夠而自動擴充呢?我猜測,恐怕隻能重建待用庫
了。
6 清空未歸檔日志内容:如果在主庫上使用了clear unarchived logfiles 指令,則隻能重建待用庫。
7 open resetlogs: 隻能重建待用庫。
8 nologging :隻能重建待用庫。
其他的凡是導緻主庫記錄在日志中的SCN号不連續的事件,都必須重建待用庫,因為待用庫在應用主庫傳遞過來的歸檔日志時,會因為SCN号的不連續而中止。
9 主庫的初始化參數改變:當改變了重做所需要的參數時,隻能導緻重做失敗。此時,需要動态修改待用庫的參數,或者是修改待用庫的init.ora檔案後重新啟動待用庫。
如果主庫的一個表,設定nologging,那麼備庫肯定沒有該表操作的資料,至一點也要注意哦
standby database三種模式的互相關系環境: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*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 mount;
SQL>alter database open;
……這時就可以正常的使用資料庫了。
這是oracle文檔描述的standby database 三種模式的互相關系,按文檔的說法,三種模式可以“直接”互相切換。