??? 提示:
??? 如果primary 或邏輯standby 是rac 結(jié)構(gòu),切記只保留一個(gè)實(shí)例啟動(dòng),其它實(shí)例全部shutdown。等角色轉(zhuǎn)換操作完成之后再啟動(dòng)其它實(shí)例,角色轉(zhuǎn)換的操作會(huì)自動(dòng)傳播到這些實(shí)例上,并不需要你再對(duì)這些實(shí)例單獨(dú)做處理。
1、檢查primary 和邏輯standby 的初始化參數(shù)設(shè)置,常規(guī)的檢查包括:
??? ●確保fal_server,fal_client 值設(shè)置正確
??? ●確保log_archive_dest_n 參數(shù)設(shè)置正確
??? 更多可能涉及的初始化參數(shù)可以參考2.1 中的第4 小章
??? 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:\ora
?????????????????????????????????????????? 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
??? JSSWEB> alter system set log_archive_dest_2='location=e:\ora
???
系統(tǒng)已更改。
?
??? JSSWEB> alter system set log_archive_dest_1='location=e:\ora
???
系統(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
這兩個(gè)參數(shù)無法動(dòng)態(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
??? 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:\ora
?????????????????????????????????????? valid_for=(online_logfiles,all_roles)
?????????????????????????????????????? db_unique_name=jssldg
??? log_archive_dest_10??? string
??? log_archive_dest_2???? string????? location=E:\ora
?????????????????????????????????????? valid_for=(standby_logfiles,standby_role)
?????????????????????????????????????? db_unique_name=JSSLDG
??? .......................
??? .......................
?
??? 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)已更改。
??? JSSWEB> select * from v$standby_log;
??? 未選定行
??? 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ù)庫已更改。
??? JSSWEB> select switchover_status from v$database;
??? SWITCHOVER_STATUS
??? --------------------
??? TO STANDBY
??? JSSWEB> alterdatabasepreparetoswitchovertologicalstandby;
??? 數(shù)據(jù)庫已更改。
??? JSSWEB> select switchover_status from v$database;
??? SWITCHOVER_STATUS
??? --------------------
??? PREPARING SWITCHOVER
??? JSSLDG> alterdatabasepreparetoswitchovertoprimary;
??? 數(shù)據(jù)庫已更改。
??? JSSLDG> select switchover_status from v$database;
??? SWITCHOVER_STATUS
??? --------------------
??? PREPARING SWITCHOVER
?
??? JSSWEB> select switchover_status from v$database;
??? SWITCHOVER_STATUS
??? --------------------
??? TO LOGICAL STANDBY
??? 提示:
??? 取消轉(zhuǎn)換可以通過下列語句:
??? ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
??? 需要分別在primary 和邏輯standby 執(zhí)行。
六、轉(zhuǎn)換primary為邏輯standby
??? JSSWEB> alterdatabasecommittoswitchovertologicalstandby;
??? 數(shù)據(jù)庫已更改。
??? 該命令執(zhí)行完之后,這個(gè)primary 就已經(jīng)成為新的邏輯standby 了。不過在新primary 執(zhí)行完轉(zhuǎn)換之前,不要關(guān)閉當(dāng)前這個(gè)數(shù)據(jù)庫。
??? JSSLDG> select switchover_status from v$database;
??? SWITCHOVER_STATUS
??? --------------------
??? TO PRIMARY
??? JSSLDG> alterdatabasecommittoswitchovertoprimary;
??? 數(shù)據(jù)庫已更改。
??? 最后啟動(dòng)新邏輯standby 的sql 應(yīng)用。
??? JSSWEB> alter database start logical standby apply;
??? 數(shù)據(jù)庫已更改。
??? 前面學(xué)習(xí)物理standby 的failover 時(shí)我們提到過,failover 有可能會(huì)丟失數(shù)據(jù)(視當(dāng)前的數(shù)據(jù)庫保護(hù)模式而定),對(duì)于邏輯standby 也一樣;物理standby 在做failover 演示時(shí)還提到過,所有的操作都會(huì)在standby 端執(zhí)行,對(duì)于邏輯standby 這也一樣,甚至對(duì)于明確提及在前primary 執(zhí)行的,你不執(zhí)行,也沒關(guān)系,畢竟對(duì)于failover,我們假設(shè)的就是,primary 已經(jīng)over 了:)
??? 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 行。
??? 如果standby 與primary 的歸檔序號(hào)相同,但某些序號(hào)的applied 狀態(tài)為no,建議你檢查一下當(dāng)前standby是否啟動(dòng)了SQL 應(yīng)用:)。
??? 可以通過查詢v$logstdby_progress 視圖:
??? JSSWEB> select applied_scn,latest_scn from v$logstdby_progress;
??? APPLIED_SCN LATEST_SCN
??? ----------- ----------
??? 1259449???? 1259453
??? 確認(rèn)待轉(zhuǎn)換的邏輯standby 配置了正確的歸檔路徑,不僅是寫本地的歸檔,還要有寫遠(yuǎn)程的歸檔,不然轉(zhuǎn)換完之后,這臺(tái)新的primary 就成了光桿司令了。
??? JSSWEB> show parameter log_archive_dest
??? .......................
二、激活新的primary數(shù)據(jù)庫
??? JSSWEB> select database_role,force_logging from v$database;
??? DATABASE_ROLE??? FOR
??? ---------------- ---
??? LOGICAL STANDBY?YES
??? 轉(zhuǎn)換standby 角色為primary
??? JSSWEB> altealterdatabaseactivatelogicalstandbydatabasefinishapply;
??? 數(shù)據(jù)庫已更改。
??? JSSWEB> select database_role,force_logging from v$database;
??? DATABASE_ROLE??? FOR
??? ---------------- ---
??? PRIMARY????????? YES
??? JSSLDG2> alter session disable guard;
??? 會(huì)話已更改。
??? JSSLDG2> create database link getjssweb connect to jss identified by jss using 'jssweb';
??? 數(shù)據(jù)庫鏈接已創(chuàng)建。
??? JSSLDG2> alter session enable guard;
??? 會(huì)話已更改。
??? 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)錯(cuò)誤:
??? ORA-16224: Database Guard 已啟用
?
??? JSSLDG2> alter session disable guard;
??? 會(huì)話已更改。
?
??? JSSLDG2> alter table b rename to a;
??? 表已更改。
??? 在各個(gè)邏輯standby 執(zhí)行下列語句啟動(dòng)sql 應(yīng)用(注意更新dblinkName):
??? JSSLDG2> alter database start logical standby apply new primary getjssweb;
??? 數(shù)據(jù)庫已更改。
??? 語句順利執(zhí)行完之后,我們來驗(yàn)證一下:
??? 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
??? 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)用呢。
??? 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)了一點(diǎn)點(diǎn)痕跡,我們的切換操作是下午3 點(diǎn)左右進(jìn)行的,期間還產(chǎn)生了序列號(hào)為860,861 之類的歸檔文件,但并未傳輸至standby,是不是因?yàn)檫@些文件中包含了一部分應(yīng)被應(yīng)用的數(shù)據(jù),因此造成standby
接收到的新primary 傳輸過來的歸檔scn 與最后應(yīng)用的scn 不連續(xù),所以無法應(yīng)用?再來驗(yàn)證一下:
??? JSSLDG2> select applied_scn,latest_scn from v$logstdby_progress;
??? APPLIED_SCN LATEST_SCN
??? ----------- ----------
??? 1259449???? 1284126
??? 果然如此,應(yīng)用的scn 與最后的scn 確實(shí)不匹配,剩下的就好解決了,把所有可疑的應(yīng)傳輸?shù)絪tandby的歸檔文件手工復(fù)制到standby,然后通過alter 命令注冊(cè)一下:
??? 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ù)庫已更改。
859,860,861 全部復(fù)制過來。
??? JSSLDG2> select sequence#,applied from dba_logstdby_log;
??? SEQUENCE#?APPLIED
??? ---------- --------
??? 862??????? CURRENT
??? 863??????? CURRENT