逻辑备库的Swichover和Failover
邏輯備庫的Switchover?
檢查Primary數(shù)據(jù)庫狀態(tài)
查看當(dāng)前Primary數(shù)據(jù)庫狀態(tài):
SQL>? SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO STANDBY?
如果該查詢返回TO STANDBY 或SESSIONS ACTIVE則表示狀態(tài)正常,可以執(zhí)行轉(zhuǎn)換操作,如果是其他值,你就需要重新檢查一下Data Guard配置,如看看LOG_ARCHIVE_DEST_n之類的參數(shù)值是否正確、有效等。
3.準(zhǔn)備轉(zhuǎn)換Primary為邏輯Standby
執(zhí)行下列語句,將Primary置為準(zhǔn)備轉(zhuǎn)換的狀態(tài):
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;
Database altered.?
執(zhí)行完上述操作后,Primary數(shù)據(jù)庫就開始為角色的轉(zhuǎn)換打好基礎(chǔ),時(shí)刻準(zhǔn)備著接收來自邏輯Standby數(shù)據(jù)庫,也就是未來的新Primary數(shù)據(jù)庫發(fā)來的REDO數(shù)據(jù)。
查看一下SWITCHOVER_STATUS的狀態(tài):
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
PREPARING SWITCHOVER?
4.準(zhǔn)備轉(zhuǎn)換邏輯Standby為Primary
邏輯Standby數(shù)據(jù)庫準(zhǔn)備轉(zhuǎn)換為Primary角色,執(zhí)行下列語句:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY;
Database altered.?
語句執(zhí)行時(shí)響應(yīng)可能會(huì)有點(diǎn)慢。
執(zhí)行完后查看當(dāng)前邏輯Standby數(shù)據(jù)庫的轉(zhuǎn)換狀態(tài):
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;??
SWITCHOVER_STATUS??
--------------------?
PREPARING SWITCHOVER?
5.再次檢查Primary數(shù)據(jù)庫狀態(tài)
執(zhí)行下列語句:?
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO LOGICAL STANDBY?
這步雖然不用做什么操作,但檢查結(jié)果卻非常重要,它直接關(guān)系到switchover轉(zhuǎn)換是否能夠成功。邏輯Standby執(zhí)行完P(guān)REPARE命令之后,就會(huì)生成相應(yīng)的LogMiner字典數(shù)據(jù)(就像我們前面創(chuàng)建邏輯Standby時(shí),Primary數(shù)據(jù)庫會(huì)生成LogMiner字典數(shù)據(jù)一樣),只有它正常生成并發(fā)送至當(dāng)前的Primary數(shù)據(jù)庫,轉(zhuǎn)換操作才能夠繼續(xù)下去。不然當(dāng)前的Primary數(shù)據(jù)庫在轉(zhuǎn)換完之后,可能就失去了從新的Primary數(shù)據(jù)庫接收REDO數(shù)據(jù)的能力了。
因此,如果上述查詢的返回結(jié)果不是TO LOGICAL STANDBY的話,DBA就需要考慮是否取消此次轉(zhuǎn)換,檢查原因,然后再重新操作了。
取消轉(zhuǎn)換可以通過下列語句進(jìn)行:
ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;?
需要分別在Primary端和邏輯Standby端執(zhí)行。由此可見準(zhǔn)備工作的好處顯現(xiàn)出來了嘛,一旦異常,隨時(shí)可以選擇取消
6.轉(zhuǎn)換Primary為邏輯Standby
如果前面的操作都沒有問題,就可以正式開始角色轉(zhuǎn)換的操作,首先是將原Primary數(shù)據(jù)庫轉(zhuǎn)換成新的Standby,操作如下:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;
Database altered.?
該語句需要等待當(dāng)前Primary數(shù)據(jù)庫所有事務(wù)全部結(jié)束才開始執(zhí)行。該語句執(zhí)行過程中會(huì)自動(dòng)拒絕用戶提交新事務(wù)或修改需求。為了確保該操作盡可能快的執(zhí)行,最好自開始切換操作起就禁止所有用戶的操作。
該命令執(zhí)行完之后,這個(gè)Primary數(shù)據(jù)庫就已經(jīng)成為新的邏輯Standby了。不過在新Primary執(zhí)行完轉(zhuǎn)換之前,不要關(guān)閉當(dāng)前這個(gè)數(shù)據(jù)庫。
7.再次檢查邏輯Standby狀態(tài)
邏輯Standby在接收到前Primary的轉(zhuǎn)換消息,并應(yīng)用完相關(guān)的REDO數(shù)據(jù)之后,會(huì)自動(dòng)暫停SQL應(yīng)用,然后查詢SWITCHOVER_STATUS的狀態(tài),應(yīng)該為TO PRIMARY:
SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE;??
SWITCHOVER_STATUS??
--------------------?
TO PRIMARY?
或者?
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
NOT ALLOWED?
8.轉(zhuǎn)換邏輯Standby為新的Primary數(shù)據(jù)庫
最后的工作總會(huì)在邏輯Standby端操作,通過下列語句,將該邏輯Standby轉(zhuǎn)換為新的Primary數(shù)據(jù)庫:
SQL>? ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.?
轉(zhuǎn)換操作至此完成。
最后啟動(dòng)新邏輯Standby,即前Primary數(shù)據(jù)庫端的SQL應(yīng)用即可:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
Database altered.?
注意:每一個(gè)邏輯Standby都相當(dāng)于是一個(gè)不同于(前)Primary的數(shù)據(jù)庫(DBID都不同),因此當(dāng)邏輯Standby完成了轉(zhuǎn)換之后,相當(dāng)于原Primary數(shù)據(jù)庫已經(jīng)消失,依照原Primary數(shù)據(jù)庫配置的物理Standby自然也就失去了主從參照,物理Standby也就不再是當(dāng)前Data Guard配置中的成員了。
這也正是前面修改Primary初始化參數(shù)時(shí),取消發(fā)送REDO數(shù)據(jù)到物理Standby數(shù)據(jù)庫的原因。不過還好,對于switchover,Data Guard配置中的其他邏輯Standby數(shù)據(jù)庫不會(huì)有影響。
9.環(huán)境測試
最后來測試一下當(dāng)前的Data Guard配置,首先在新Primary數(shù)據(jù)庫操作一條記錄:
SQL> insert into scott.dept values(2,'bl','bl');
1 row created.
SQL> commit;
Commit complete.?
轉(zhuǎn)到邏輯Standby端查看:??
??? DEPTNO DNAME????????? LOC
---------- -------------- -------------
???????? 1 dave?????????? dmm
???????? 2 bl????????? ?? ? bl?
同步成功,也基本代表轉(zhuǎn)換成功。
邏輯備庫的Failover?
failover有可能會(huì)丟失數(shù)據(jù)(視當(dāng)前的數(shù)據(jù)庫保護(hù)模式而定),而且所有的操作都是在Standby數(shù)據(jù)庫端執(zhí)行,這幾點(diǎn)對于邏輯Standby也同樣適用,甚至對于明確提及需要在前Primary數(shù)據(jù)庫執(zhí)行的,不執(zhí)行也沒關(guān)系,畢竟對于failover,我們假設(shè)的就是Primary數(shù)據(jù)庫已經(jīng)over。
1.檢查及處理丟失的歸檔
雖然本步不是必需的,但如果希望盡可能少的丟失數(shù)據(jù),除了數(shù)據(jù)保護(hù)模式之外,本步操作也非常重要。如果此時(shí)Primary數(shù)據(jù)庫仍可被訪問,首先應(yīng)當(dāng)檢查當(dāng)前的歸檔日志序號與邏輯Standby是否相同:
在主庫查詢:
SQL>? SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
MAX(SEQUENCE#)
--------------
?????????? 113?
在備庫查詢:?
SQL> SELECT SEQUENCE#,APPLIED FROM DBA_LOGSTDBY_LOG;
?SEQUENCE# APPLIED
---------- --------
?????? 110 CURRENT
?????? 111 NO?
如果上述查詢的結(jié)果不同,說明Primary存在尚未發(fā)送至邏輯Standby數(shù)據(jù)庫的歸檔文件,手工復(fù)制這些文件到待轉(zhuǎn)換角色的邏輯Standby端,然后在該邏輯Standby數(shù)據(jù)庫的SQL*Plus命令窗口,
通過執(zhí)行?ALTER DATABASE REGISTER LOGICAL LOGFILE 'filepath';?命令,將復(fù)制過來的歸檔文件手工注冊。
如果邏輯Standby與Primary的歸檔序號相同,但某些序號的APPLIED狀態(tài)為NO,建議DBA檢查一下當(dāng)前邏輯Standby數(shù)據(jù)庫是否啟動(dòng)了SQL應(yīng)用。
如果Primary數(shù)據(jù)庫已經(jīng)無法打開,DBA就只好直接到磁盤上查看歸檔目錄中的序號,來與邏輯Standby數(shù)據(jù)庫做比較。如果Primary數(shù)據(jù)庫已經(jīng)完全無法訪問,那請直接跳過本步。
2.檢查待轉(zhuǎn)換邏輯Standby的日志應(yīng)用情況
查詢重做日志的應(yīng)用情況,可以通過V$LOGSTDBY_PROGRESS視圖進(jìn)行,例如:
SQL>? SELECT APPLIED_SCN,LATEST_SCN FROM V$LOGSTDBY_PROGRESS;
APPLIED_SCN LATEST_SCN
----------- ----------
???? 598967???? 598967?
如果返回的結(jié)果中顯示,兩列的列值一致,則表示所有接收到的重做日志都已經(jīng)應(yīng)用。如果不一致的話,啟動(dòng)邏輯Standby端的SQL應(yīng)用。
3.檢查及修正待轉(zhuǎn)換邏輯Standby的初始化參數(shù)配置
確認(rèn)待轉(zhuǎn)換的邏輯Standby配置了正確的歸檔路徑,不僅是寫本地的歸檔配置,還要有寫遠(yuǎn)端服務(wù)器的歸檔配置,不然轉(zhuǎn)換完之后,這臺(tái)新的Primary數(shù)據(jù)庫就成了光桿司令了。
一般來說,我們都是推薦在創(chuàng)建Standby數(shù)據(jù)庫的同時(shí)將一些用于角色切換的初始化參數(shù)也配置好(Primary和Standby端都應(yīng)如此),以減少切換時(shí)操作的時(shí)間,提高切換效率。執(zhí)行如下命令:
SQL> SHOW PARAMETER LOG_ARCHIVE_DEST??
4.激活新的Primary數(shù)據(jù)庫
首先查看當(dāng)前操作的角色:?
SQL> SELECT DATABASE_ROLE,FORCE_LOGGING FROM V$DATABASE;??
DATABASE_ROLE??? FOR?
---------------- ---?
LOGICAL STANDBY? YES?
注 意
如果當(dāng)前FORCE_LOGGING為NO,務(wù)必執(zhí)行ALTER DATABASE FORCE LOGGING;命令。
執(zhí)行下列語句,轉(zhuǎn)換Standby數(shù)據(jù)庫角色為Primary:
SQL> ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY;?
數(shù)據(jù)庫已更改。
該語句主要是停止待轉(zhuǎn)換的邏輯Standby中RFS進(jìn)程,并應(yīng)用完當(dāng)前所有已接收但并未應(yīng)用的REDO數(shù)據(jù),然后停止SQL應(yīng)用,將數(shù)據(jù)庫轉(zhuǎn)換成Primary角色。
語句執(zhí)行完成后,再次查看當(dāng)前數(shù)據(jù)庫的角色:
SQL> SELECT DATABASE_ROLE,FORCE_LOGGING FROM V$DATABASE;??
DATABASE_ROLE??? FOR?
---------------- ---?
PRIMARY????????? YES?
基本上到這一步,我們可以說角色轉(zhuǎn)換的工作已經(jīng)完成了. 此處與邏輯Standby的switchover同理,切換完之后,原Data Guard配置就失效了,徹底的失效了,不僅物理Standby沒了,邏輯Standby也失去了參照,邏輯Standby的failover威力確實(shí)大呀,怪不得邏輯Standby用的人這么少呢,環(huán)境脆弱肯定是原因之一,因此我們需要做些設(shè)置,重新將原來的邏輯Standby再加入到新的Data Guard配置環(huán)境中。
5.修復(fù)其他Standby數(shù)據(jù)庫
物理Standby數(shù)據(jù)庫的修復(fù)只有重建一種方式,至于如何創(chuàng)建物理Standby,前面說的已經(jīng)足夠多了,下面重點(diǎn)描述一下原Data Guard環(huán)境中的邏輯Standby。
注意的是,邏輯Standby的修復(fù)可不像物理Standby那樣簡單,相比較來說,重建其實(shí)是個(gè)簡單的工作,因?yàn)槌跏蓟瘏?shù)文件、密鑰文件、存放目錄等都是現(xiàn)成的,幾乎不需要改動(dòng),DBA所需要做的,基本上就是重新復(fù)制一份新Primary數(shù)據(jù)庫的相關(guān)文件,每個(gè)邏輯Standby都相當(dāng)于是獨(dú)立的數(shù)據(jù)庫,如果你不希望重建邏輯Standby的話呢,Oracle倒是也提供了其他的解決方案。
假定原Data Guard環(huán)境中有邏輯Standby數(shù)據(jù)庫LGDG,執(zhí)行failover后,LGDG不再是新Data Guard環(huán)境中的成員,這里演示如何恢復(fù)該數(shù)據(jù)庫到當(dāng)前的Data Guard配置,操作步驟如下:
(1)在原邏輯Standby中創(chuàng)建數(shù)據(jù)庫鏈,連接到新的Primary數(shù)據(jù)庫。
這里所謂的原Standby數(shù)據(jù)庫,自然是指JSSLDG2嘍,注意,數(shù)據(jù)庫鏈中用于連接新Primary數(shù)據(jù)庫的用戶必須擁有SELECT_CATALOG_ROLE角色。執(zhí)行以下語句:
SQL> ALTER SESSION DISABLE GUARD;?
Session altered.
SQL> CREATE DATABASE LINK BL CONNECT TO SYSTEM IDENTIFIED BY admin USING 'orcl_pd';
Database link created.
SQL> ALTER SESSION ENABLE GUARD;?
會(huì)話已更改。?
驗(yàn)證一下數(shù)據(jù)鏈?zhǔn)欠衲軌蛘TL問:
SQL> SELECT SYSDATE FROM DUAL@BL;
SYSDATE
---------
06-MAY-10?
提 示: ALTER SESSION ENABLE|DISABLE GUARD語句作用?
該語句用于允許或禁止用戶修改邏輯Standby中的結(jié)構(gòu)。
(2)重新啟動(dòng)SQL應(yīng)用。
在各個(gè)邏輯Standby端執(zhí)行下列語句啟動(dòng)SQL應(yīng)用(注意更新dblinkName):
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NEW PRIMARY BL;??
Database altered.?
如果你運(yùn)氣好,等語句執(zhí)行完之后,恢復(fù)過程就完成了。如果你非常不幸地碰到了ORA-16109錯(cuò)誤,那么我不得不告訴你,恐怕你得重建邏輯Standby了。
參考至:http://blog.csdn.net/tianlesoftware/article/details/5564179
如有錯(cuò)誤,歡迎指正
郵箱:czmcj@163.com
總結(jié)
以上是生活随笔為你收集整理的逻辑备库的Swichover和Failover的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux高可用性方案之Heartbea
- 下一篇: websocket 之入门 (一)