Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          本文作者: junsansi???? 轉(zhuǎn)載網(wǎng)址: http://www.5ienet.com/index.shtml
          ?
          ?
          第三部分邏輯standby(3)角色轉(zhuǎn)換? 2008.02.22
          ?
          ??? 關(guān)于角色轉(zhuǎn)換的一些概念在物理standby 章節(jié)的時候已經(jīng)講了很多,在概念和操作方式上二者基本一致,不過如果你真正深刻理解了物理standby 和邏輯standby,你會意識到,對于邏輯standby 而言,不管是switchover還是failover,怎么操作起來,都這么怪怪的呢~~~
          ?
          邏輯standby之switchover
          ?
          ??? 要在primary 和邏輯standby 之間切換角色,一般是從操作primary 開始。

          ??? 提示:
          ??? 如果primary 或邏輯standby 是rac 結(jié)構(gòu),切記只保留一個實例啟動,其它實例全部shutdown。等角色轉(zhuǎn)換操作完成之后再啟動其它實例,角色轉(zhuǎn)換的操作會自動傳播到這些實例上,并不需要你再對這些實例單獨做處理。

          ?
          一、準(zhǔn)備工作

          1、檢查primary 和邏輯standby 的初始化參數(shù)設(shè)置,常規(guī)的檢查包括:

          ??? 確保fal_server,fal_client 值設(shè)置正確
          ??? 確保log_archive_dest_n 參數(shù)設(shè)置正確
          ??? 更多可能涉及的初始化參數(shù)可以參考2.1 中的第4 小章
          ?
          ??? 首先來看當(dāng)前的primary數(shù)據(jù)庫:

          ??? JSSWEB> show parameter fal
          ??? NAME?????????????????????? TYPE??????? VALUE
          ??? -------------------------- ----------- -------------------------------
          ??? fal_client???????????????? string????? jssweb
          ??? fal_server???????????????? string????? jsspdg

          ?

          ??? JSSWEB> show parameter name_convert
          ??? NAME?????????????????????? TYPE??????? VALUE
          ??? -------------------------- ----------- -------------------------------
          ??? db_file_name_convert?????? string????? oradata\jsspdg, oradata\jssweb
          ??? log_file_name_convert????? string????? oradata\jsspdg, oradata\jssweb

          ?

          ??? JSSWEB> show parameter log_archive_dest
          ??? NAME?????????????????????? TYPE??????? VALUE
          ??? -------------------------- ----------- -------------------------------
          ??? log_archive_dest?????????? string
          ??? log_archive_dest_1???????? string????? LOCATION=E:\ora10g\oradata\jssweb\arc
          ?????????????????????????????????????????? VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
          ?????????????????????????????????????????? DB_UNIQUE_NAME=jssweb
          ??? log_archive_dest_2???????? string????? service=jsspdg OPTIONAL LGWR SYNC AFFIRM
          ?????????????????????????????????????????? VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
          ?????????????????????????????????????????? DB_UNIQUE_NAME=jsspdg
          ??? ................
          ??? ................
          ??? ................
          ??? log_archive_dest_state_1?? string????? ENABLE
          ??? log_archive_dest_state_2?? string????? defer

          ??? 由于此處primary 的初始化參數(shù)并不合適,為了避免其轉(zhuǎn)換之后發(fā)生錯誤,我們需要提前做些修改:

          ??? JSSWEB> alter system set log_archive_dest_2='location=e:\ora10g\oradata\jssweb\std\valid_for=(standby_logfiles,standby_role) db_unique_name=jssweb';
          ???
          系統(tǒng)已更改。

          ?

          ??? JSSWEB> alter system set log_archive_dest_1='location=e:\ora10g\oradata\jssweb\arc\valid_for=(online_logfiles,all_roles) db_unique_name=jssweb';
          ???
          系統(tǒng)已更改。

          ?

          ??? JSSWEB> alter system set log_archive_dest_state_2='enable';
          ???
          系統(tǒng)已更改。

          ?

          ??? JSSWEB> alter system set fal_server='jssldg';
          ???
          系統(tǒng)已更改。

          ?

          ??? --xx_file_name_convert 這兩個參數(shù)無法動態(tài)修改,因此我們首先修改 spfile ,然后再重啟一下數(shù)據(jù)庫
          ??? JSSWEB> alter system set db_file_name_convert='oradata\jssldg','oradata\jssweb' scope=spfile;
          ???
          系統(tǒng)已更改。

          ??? JSSWEB> alter system set log_file_name_convert='oradata\jssldg','oradata\jssweb' scope=spfile;
          ???
          系統(tǒng)已更改。

          ?

          ??? JSSWEB> startup force

          ?
          ??? 然后再看看待轉(zhuǎn)換的邏輯standbstandby

          ??? JSSLDG> show parameter fal
          ??? NAME?????????????????? TYPE??????? VALUE
          ??? ---------------------- ----------- --------------------
          ??? fal_client?????????? string
          ??? fal_server?????????? string

          ?

          ??? JSSLDG> show parameter file_name
          ??? NAME?????????????????? TYPE??????? VALUE
          ??? ---------------------- ----------- --------------------
          ??? db_file_name_convert?? string????? oradata\jssweb, oradata\jssldg
          ??? log_file_name_convert? string????? oradata\jssweb, oradata\jssldg

          ?

          ??? JSSLDG> show parameter log_archive
          ??? NAME?????????????????? TYPE??????? VALUE
          ??? ---------------------- ----------- --------------------
          ??? log_archive_config???? string????? DG_CONFIG=(jssweb,jsspdg,jssldg)
          ??? log_archive_dest?????? string
          ??? log_archive_dest_1???? string????? location=E:\ora10g\oradata\jssldg\arc\
          ?????????????????????????????????????? valid_for=(online_logfiles,all_roles)
          ?????????????????????????????????????? db_unique_name=jssldg
          ??? log_archive_dest_10??? string
          ??? log_archive_dest_2???? string????? location=E:\ora10g\oradata\JSSLDG\std\
          ?????????????????????????????????????? valid_for=(standby_logfiles,standby_role)
          ?????????????????????????????????????? db_unique_name=JSSLDG
          ??? .......................
          ??? .......................

          ?
          ?
          ??? 對于待轉(zhuǎn)換的邏輯standby 中,某些初始化參數(shù)也可以不設(shè)置,不過走到這一步了,順手全設(shè)置一遍。

          ??? JSSLDG> alter system set fal_server='jssweb';
          ??? 系統(tǒng)已更改。


          ??? JSSLDG> alter system set fal_client='jssldg';
          ??? 系統(tǒng)已更改。


          ??? JSSLDG> alter system set log_archive_dest_3='service=jssweb lgwr async?valid_for=(online_logfiles,primary_role) db_unique_name=jssweb';
          ??? 系統(tǒng)已更改。

          ?
          2、檢查primary 數(shù)據(jù)庫是否配置了standby redologs

          ??? JSSWEB> select * from v$standby_log;
          ??? 未選定行

          ?
          ??? 對于邏輯standby 數(shù)據(jù)庫,standby redologs 是必須的,因此我們需要為當(dāng)前的primary 創(chuàng)建幾個standbyredologs。

          ??? JSSWEB> alter database add standby logfile group 4 ('e:\ora10g\oradata\jssweb\standbyrd01.log') size 20m;
          ??? 數(shù)據(jù)庫已更改。
          ??? .....................
          ??? .......................
          ??? .........................
          ??? JSSWEB> alter database add standby logfile group 8 ('e:\ora10g\oradata\jssweb\standbyrd05.log') size 20m;
          ??? 數(shù)據(jù)庫已更改。

          ?
          ?
          二、檢查primary數(shù)據(jù)庫狀態(tài)
          ?
          ??? 在當(dāng)前的primary 數(shù)據(jù)庫查詢v$database 視圖中的switchover_status 列,查看當(dāng)前primary 數(shù)據(jù)庫狀態(tài)。

          ??? JSSWEB> select switchover_status from v$database;
          ??? SWITCHOVER_STATUS
          ??? --------------------
          ??? TO STANDBY

          ?
          ??? 如果該查詢返回TO STANDBY 或SESSIONS ACTIVE 則表示狀態(tài)正常,可以執(zhí)行轉(zhuǎn)換操作,如果否的話,就需要你先檢查一下當(dāng)前的dataguard 配置,看看是否
          ?
          ?
          三、準(zhǔn)備轉(zhuǎn)換primary為邏輯standby
          ?
          ??? 執(zhí)行下列語句,將primary 置為準(zhǔn)備轉(zhuǎn)換的狀態(tài):

          ??? JSSWEB> alterdatabasepreparetoswitchovertologicalstandby;
          ??? 數(shù)據(jù)庫已更改。

          ?
          ??? 查看一下switchover_status 的狀態(tài),喲,果然變成準(zhǔn)備ing 啦~~

          ??? JSSWEB> select switchover_status from v$database;
          ??? SWITCHOVER_STATUS
          ??? --------------------
          ??? PREPARING SWITCHOVER

          ?
          ?
          四、準(zhǔn)備轉(zhuǎn)換邏輯standby為primary
          ?
          ??? 我們一定要學(xué)習(xí)oracle 這種邏輯,甭管想做什么,都得先有個準(zhǔn)備的過程~

          ??? JSSLDG> alterdatabasepreparetoswitchovertoprimary;
          ??? 數(shù)據(jù)庫已更改。

          ??? JSSLDG> select switchover_status from v$database;
          ??? SWITCHOVER_STATUS
          ??? --------------------
          ??? PREPARING SWITCHOVER

          ?
          ?
          五、再次檢查primary數(shù)據(jù)庫狀態(tài)

          ?

          ??? JSSWEB> select switchover_status from v$database;
          ??? SWITCHOVER_STATUS
          ??? --------------------
          ??? TO LOGICAL STANDBY

          ?
          ??? 注意:這步雖然不做什么操作,但檢查結(jié)果卻非常重要,它直接關(guān)系到switchover 轉(zhuǎn)換是否能夠成功。邏輯standby 執(zhí)行完prepare 命令之后,就會生成相應(yīng)的LogMiner 字典數(shù)據(jù)(就像我們前面創(chuàng)建邏輯standby 時,primary 會生成LogMiner 字典數(shù)據(jù)一樣),只有它正常生成并發(fā)送至當(dāng)前的primary,轉(zhuǎn)換操作才能夠繼續(xù)下去。不然當(dāng)前的primary 數(shù)據(jù)庫在轉(zhuǎn)換完之后,可能就失去了從新的primary 接收redo 數(shù)據(jù)的能力了。
          ?
          ??? 因此,如果上述查詢的返回結(jié)果不是:TO LOGICAL STANDBY 的話,你可能就需要取消此次轉(zhuǎn)換,檢查原因,然后再重新操作了。

          ??? 提示:
          ??? 取消轉(zhuǎn)換可以通過下列語句:
          ??? ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
          ??? 需要分別在primary 和邏輯standby 執(zhí)行。

          ?

          ?

          六、轉(zhuǎn)換primary為邏輯standby
          ?
          ??? 執(zhí)行下列語句:

          ??? JSSWEB> alterdatabasecommittoswitchovertologicalstandby;
          ??? 數(shù)據(jù)庫已更改。

          ?
          ??? 該語句需要等待當(dāng)前primary 所有事務(wù)全部結(jié)束。同時該語句也會自動拒絕用戶發(fā)布的新事務(wù)或修改需求。為確保該操作盡可能快的執(zhí)行,最好自開始切換操作起就禁止所有用戶的操作。
          ??? 該命令執(zhí)行完之后,這個primary 就已經(jīng)成為新的邏輯standby 了。不過在新primary 執(zhí)行完轉(zhuǎn)換之前,不要關(guān)閉當(dāng)前這個數(shù)據(jù)庫。
          ?
          ?
          七、再次檢查邏輯standby狀態(tài)
          ?
          ??? 邏輯standby 在接收到前primary 的轉(zhuǎn)換消息,并應(yīng)用完相關(guān)的redo 數(shù)據(jù)之后,會自動暫停sql 應(yīng)用,然后查詢switchover_status 的狀態(tài),應(yīng)該為:TO PRIMARY

          ??? JSSLDG> select switchover_status from v$database;
          ??? SWITCHOVER_STATUS
          ??? --------------------
          ??? TO PRIMARY

          ?
          ?
          八、轉(zhuǎn)換邏輯standby為primary
          ?
          ??? 最后的工作總會在邏輯standby 上操作,通過上列語句,將該邏輯standby 轉(zhuǎn)換為新的primary。

          ??? JSSLDG> alterdatabasecommittoswitchovertoprimary;
          ??? 數(shù)據(jù)庫已更改。

          ?
          ??? 轉(zhuǎn)換完成
          ?
          ?
          九、啟動新邏輯standby的sql應(yīng)用

          ??? 最后啟動新邏輯standby 的sql 應(yīng)用。

          ??? JSSWEB> alter database start logical standby apply;
          ??? 數(shù)據(jù)庫已更改。

          ?
          ??? 提示:還記的我們的jsspdg 嗎,雖然它也是standby(物理),不過它現(xiàn)在也并非這個dataguard 配置中的一員了,這也是由于邏輯standby 自身特性決定的,每一個邏輯standby 都相當(dāng)于是一個不同于primary 的數(shù)據(jù)庫(DBID都不同),因此在邏輯standby 完成了轉(zhuǎn)換之后,相當(dāng)于原primary 已經(jīng)消失,因此原primary 配置的物理standby也失去了主從參照,不過原primary 配置的邏輯standby 不會有影響。
          ?
          ?
          邏輯standby之failover

          ??? 前面學(xué)習(xí)物理standby 的failover 時我們提到過,failover 有可能會丟失數(shù)據(jù)(視當(dāng)前的數(shù)據(jù)庫保護(hù)模式而定),對于邏輯standby 也一樣;物理standby 在做failover 演示時還提到過,所有的操作都會在standby 端執(zhí)行,對于邏輯standby 這也一樣,甚至對于明確提及在前primary 執(zhí)行的,你不執(zhí)行,也沒關(guān)系,畢竟對于failover,我們假設(shè)的就是,primary 已經(jīng)over 了:)
          ?
          ?
          一、準(zhǔn)備工作要充分
          ?
          ??? 準(zhǔn)備工作可以從以下幾個方面著手:
          ?
          1、檢查及處理丟失的歸檔
          ?
          ??? 雖然本步不是必須的,但如果希望盡可能少丟失數(shù)據(jù),除了數(shù)據(jù)保護(hù)模式之外,本步操作也非常重要。如果此時primary 仍可被訪問,首先檢查當(dāng)前的歸檔日志序號與邏輯standby 是否相同:

          ??? JSSLDG> select max(sequence#) from v$archived_log;
          ??? MAX(SEQUENCE#)
          ??? --------------
          ??? 24

          ?

          ??? JSSWEB> select sequence#,applied from dba_logstdby_log;
          ??? SEQUENCE#? APPLIED
          ??? ---------- --------
          ??? 23???????? YES
          ??? 24???????? YES
          ???
          已選擇2 行。

          ?
          ??? 提示:如果primary 的數(shù)據(jù)庫已經(jīng)無法打開,您就只好直接到磁盤上查看歸檔目錄中的序號來與standby端做比較了。
          ?
          ??? 如果不同序號,則將primary 尚未發(fā)送至standby 的歸檔文件手工復(fù)制到待轉(zhuǎn)換的邏輯standby 服務(wù)器,然后在standby 端通過ALTER DATABASE REGISTER LOGICAL LOGFILE ''; 命令將文件手工注冊
          ??? 如果standby 與primary 的歸檔序號相同,但某些序號的applied 狀態(tài)為no,建議你檢查一下當(dāng)前standby是否啟動了SQL 應(yīng)用:)。
          ?
          2、檢查待轉(zhuǎn)換邏輯standby 的日志應(yīng)用情況

          ??? 可以通過查詢v$logstdby_progress 視圖:

          ??? JSSWEB> select applied_scn,latest_scn from v$logstdby_progress;
          ??? APPLIED_SCN LATEST_SCN
          ??? ----------- ----------
          ??? 1259449???? 1259453

          ?
          ??? 如果兩值一致,表示所有接收到的歸檔都已經(jīng)應(yīng)用了。
          ?
          3、檢查及修正待轉(zhuǎn)換邏輯standby 的初始化參數(shù)配置

          ??? 確認(rèn)待轉(zhuǎn)換的邏輯standby 配置了正確的歸檔路徑,不僅是寫本地的歸檔,還要有寫遠(yuǎn)程的歸檔,不然轉(zhuǎn)換完之后,這臺新的primary 就成了光桿司令了。

          ??? JSSWEB> show parameter log_archive_dest
          ??? .......................

          ?
          ??? 當(dāng)然一般來說,我們都是推薦在創(chuàng)建standby 的同時將一些用于角色切換的初始化參數(shù)也配置好(primary 和standby 端都應(yīng)如此),以減小切換時操作的時間,提高切換效率。
          ?

          二、激活新的primary數(shù)據(jù)庫
          ?
          ??? 首先查看當(dāng)前操作的角色

          ??? JSSWEB> 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;

          ??? 轉(zhuǎn)換standby 角色為primary

          ??? JSSWEB> altealterdatabaseactivatelogicalstandbydatabasefinishapply;
          ??? 數(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 角色。

          ??? JSSWEB> select database_role,force_logging from v$database;
          ??? DATABASE_ROLE??? FOR
          ??? ---------------- ---
          ??? PRIMARY????????? YES

          ?
          ??? 基本上到這一步,我們可以說角色轉(zhuǎn)換的工作已經(jīng)完成了,但是注意,活還沒有干完!
          ?
          ??? 此處與邏輯standby 的switchover 同理,切換完之后,原dg 配置就失效了(不僅原物理standby 沒了,原邏輯standby 也失去了參照,看看,邏輯standby 的failover 確實威力巨大呀,怪不得邏輯standby 用的人這么人呢,環(huán)境脆弱肯定是原因之一啊),因此我們需要做些設(shè)置,重新將原來的standby 再加入到新的dg 配置環(huán)境中。
          ?
          ?
          三、修復(fù)其它standby
          ?
          ??? 注意喲,邏輯standby 的修復(fù)可并不像物理standby 那樣簡單,每個邏輯standby 都相當(dāng)于是獨立的數(shù)據(jù)庫,如果你不希望重建邏輯standby 的話呢,oracle 倒是也提供了其它解決方案(雖然不一定好使):
          ?
          1、在各個原邏輯standby 中創(chuàng)建數(shù)據(jù)庫鏈,連接到新的primary
          ?
          ??? 注意,數(shù)據(jù)庫鏈中用于連接新primary 的用戶必須擁有SELECT_CATALOG_ROLE 角色。

          ??? JSSLDG2> alter session disable guard;
          ??? 會話已更改。
          ??? JSSLDG2> create database link getjssweb connect to jss identified by jss using 'jssweb';
          ??? 數(shù)據(jù)庫鏈接已創(chuàng)建。
          ??? JSSLDG2> alter session enable guard;
          ??? 會話已更改。

          ?
          ??? 驗證一下數(shù)據(jù)鏈?zhǔn)欠衲軌蛘TL問:

          ??? JSSLDG2> select sysdate from dual@getjssweb;
          ??? SYSDATE
          ??? --------------
          ??? 23-2 月-08


          ??? 提示:關(guān)于alter session enable|disable guard 語句,用于允許或禁止用戶修改邏輯standby 中的結(jié)構(gòu)。例如:

          ??? JSSLDG2> conn jss/jss
          ???
          已連接。

          ?

          ??? JSSLDG2> select * from b;
          ??? ID
          ??? ----------
          ??? 1
          ??? 2
          ??? 3
          ??? 4
          ??? 5
          ??? 6
          ??? 7
          ??? 8
          ???
          已選擇8 行。

          ?

          ??? JSSLDG2> alter table b rename to a;
          ??? alter table b rename to a
          ??? *
          ???
          1 行出現(xiàn)錯誤:
          ??? ORA-16224: Database Guard
          已啟用

          ?

          ??? JSSLDG2> alter session disable guard;
          ???
          會話已更改。

          ?

          ??? JSSLDG2> alter table b rename to a;
          ???
          表已更改。

          ?
          2、重新啟動SQL 應(yīng)用

          ??? 在各個邏輯standby 執(zhí)行下列語句啟動sql 應(yīng)用(注意更新dblinkName):

          ??? JSSLDG2> alter database start logical standby apply new primary getjssweb;
          ??? 數(shù)據(jù)庫已更改。

          ?
          ??? 如果你運氣好,等語句執(zhí)行完之后,恢復(fù)過程就完成了。如果你非常不幸的碰到了ORA-16109 錯誤,那么我不得不告訴你,恐怕你得重建邏輯standby 了。所以,祝你好運吧:)

          ??? 語句順利執(zhí)行完之后,我們來驗證一下:

          ??? JSSWEB> alter system switch logfile;
          ???
          系統(tǒng)已更改。

          ?

          ??? JSSWEB> select max(sequence#) from v$archived_log;
          ??? MAX(SEQUENCE#)
          ??? --------------
          ??? 862

          ?

          ??? JSSLDG2> select sequence#,applied from dba_logstdby_log;
          ??? SEQUENCE#? APPLIED
          ??? ---------- --------
          ??? 862??????? NO


          ?
          ??? 注意:出現(xiàn)問題了!!
          ?
          ??? 日志是傳輸過去了,但是邏輯standby 并沒有開始應(yīng)用,怎么回事?
          ?
          ??? 我們先來確認(rèn)一下standby 的各進(jìn)程狀態(tài):

          ??? JSSLDG2> select process,status,group#,thread#,sequence#,block#,blocks from v$managed_standby;
          ??? PROCESS?? STATUS?????? GROUP#????THREAD#??? SEQUENCE#?BLOCK#???? BLOCKS
          ??? --------- ------------ --------- ---------- ---------- ---------- ----------
          ??? ARCH????? CLOSING????? 2???????? 1????????? 4????????? 16385????? 1836
          ??? ARCH????? CLOSING????? 6???????? 1????????? 862??????? 1????????? 18
          ??? RFS?????? IDLE???????? N/A?????? 0??????????0??????????0????????? 0
          ??? RFS?????? IDLE???????? 3?????????1????????? 863??????? 2????????? 1


          ??? 看起來也是正常的,接收完了862,正在等待863,但是,為什么不應(yīng)用呢。
          ?
          ??? 手工查詢一下新primary 生成的歸檔日志情況:

          ??? JSSWEB> select sequence#,name,COMPLETION_TIME from v$archived_log where sequence#>855;
          ??? SEQUENCE#?NAME?????????????????????????????????????????????????????COMPLETION_TIME
          ??? ---------- -------------------------------------------------------- -------------------
          ??? 856??????? E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_856_641301252.ARC????? 2008-02-21 10:15:42
          ??? 857??????? E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_857_641301252.ARC????? 2008-02-21 10:16:46
          ??? 858??????? E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_858_641301252.ARC????? 2008-02-23 14:15:18
          ??? 859??????? E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_859_641301252.ARC??????2008-02-23 14:56:55
          ??? 860????????E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_860_641301252.ARC????? 2008-02-23 14:57:03
          ??? 861??????? E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_861_641301252.ARC????? 2008-02-23 16:58:14
          ??? 861??????? jssldg2????????????????????????????????????????????????? 2008-02-23 16:58:16
          ??? 862??????? E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_862_641301252.ARC????? 2008-02-23 17:08:57
          ??? 862??????? jssldg2??????????????????????????????????????????????????2008-02-23 17:08:57
          ??? 863??????? E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_863_641301252.ARC????? 2008-02-23 17:19:48
          ??? 863??????? jssldg2????????????????????????????????????????????????? 2008-02-23 17:20:59
          ??? 864????????E:\ORA10G\ORADATA\JSSWEB\ARC\LOG1_864_641301252.ARC????? 2008-02-23 17:21:11
          ??? 864??????? jssldg2????????????????????????????????????????????????? 2008-02-23 17:21:13
          ??? 已選擇13 行。


          ??? 發(fā)現(xiàn)了一點點痕跡,我們的切換操作是下午3 點左右進(jìn)行的,期間還產(chǎn)生了序列號為860,861 之類的歸檔文件,但并未傳輸至standby,是不是因為這些文件中包含了一部分應(yīng)被應(yīng)用的數(shù)據(jù),因此造成standby
          接收到的新primary 傳輸過來的歸檔scn 與最后應(yīng)用的scn 不連續(xù),所以無法應(yīng)用?再來驗證一下:

          ??? JSSLDG2> select applied_scn,latest_scn from v$logstdby_progress;
          ??? APPLIED_SCN LATEST_SCN
          ??? ----------- ----------
          ??? 1259449???? 1284126


          ??? 果然如此,應(yīng)用的scn 與最后的scn 確實不匹配,剩下的就好解決了,把所有可疑的應(yīng)傳輸?shù)絪tandby的歸檔文件手工復(fù)制到standby,然后通過alter 命令注冊一下:

          ??? JSSLDG2> alter database register logical logfile 'E:\ora10g\oradata\jssldg2\std\LOG1_859_641301252.ARC';
          ??? 數(shù)據(jù)庫已更改。
          ??? JSSLDG2> alter database register logical logfile 'E:\ora10g\oradata\jssldg2\std\LOG1_860_641301252.ARC';
          ??? 數(shù)據(jù)庫已更改。
          ??? JSSLDG2> alter database register logical logfile 'E:\ora10g\oradata\jssldg2\std\LOG1_861_641301252.ARC';
          ??? 數(shù)據(jù)庫已更改。

          ?
          ??? 提示:復(fù)制文件的時候盡可能把相近時間段的歸檔文件都拷過來,不用擔(dān)心無用歸檔會不會影響到應(yīng)用,oracle 會自動判斷歸檔中的scn,對于已經(jīng)應(yīng)用過的正常情況下是不會重復(fù)應(yīng)用的,因此我們把
          859,860,861 全部復(fù)制過來。
          ??? 再查看一下應(yīng)用狀態(tài):

          ??? JSSLDG2> select sequence#,applied from dba_logstdby_log;
          ??? SEQUENCE#?APPLIED
          ??? ---------- --------
          ??? 862??????? CURRENT
          ??? 863??????? CURRENT

          ?
          ??? 哈哈,已經(jīng)開始應(yīng)用了。邏輯standby 恢復(fù)成功!想起官方文檔中有一句提示,說的是在打開新的primary數(shù)據(jù)庫,生成數(shù)據(jù)字典之前,不要執(zhí)行任何DDL,不然就只能重建邏輯standby 了,估計就是擔(dān)心執(zhí)行ddl后不幸觸發(fā)日志切換,造成邏輯standby 接收新primary 傳來的歸檔文件不連續(xù),無法順利應(yīng)用。
          ?
          ??? 切換完成之后,在修復(fù)邏輯standby 的同時,順手打掃一下戰(zhàn)場,比如設(shè)置新primary 數(shù)據(jù)庫的備份策略,以及考慮如何修復(fù)前故障的primary 等等,dba 這份工作,人前看起來光鮮,如果你已經(jīng)下定決心要從事這行,那對于人后的辛苦一定要有深刻心理準(zhǔn)備喲,你看看像上面這種情況,primary 只要隨隨便便宕個機(jī),引之而來的工作量就夠我們忙活的。
          ?
          ?
          ??? 也許這個時候dba 需要的不僅是保持清晰的大腦,還要能打開思路,此時我們更不妨考慮在做角色切換和修復(fù)損壞的primary 之間做個選擇,究竟哪個更快,哪個更簡便一些呢,你看,干dba 這行,不僅壓力大,不僅要本領(lǐng)過硬,不僅要耐心細(xì)致,關(guān)鍵時刻還要保持清醒的頭腦,額地神耶,太刺激啦,太有挑戰(zhàn)啦~~~~~~




          -The End-

          posted on 2009-02-25 21:46 decode360-3 閱讀(704) 評論(0)  編輯  收藏 所屬分類: DBA
          主站蜘蛛池模板: 海南省| 商丘市| 轮台县| 东乌珠穆沁旗| 利辛县| 襄樊市| 新巴尔虎右旗| 济阳县| 绵竹市| 新田县| 喀喇沁旗| 汝州市| 从江县| 阿鲁科尔沁旗| 县级市| 右玉县| 灌云县| 邹平县| 孟州市| 二连浩特市| 清原| 竹北市| 前郭尔| 津市市| 新乡市| 孝义市| 古交市| 札达县| 中方县| 沙河市| 栾川县| 临西县| 屏山县| 平果县| 阿克苏市| 柳林县| 木兰县| 朝阳市| 沛县| 石狮市| 和平县|