作業系統:linux redhat 4.7
Oracle: 10.2.0.1
主庫:orcl_pd
備庫:LGDG
一. 邏輯Standby建立過程
1 建立實體Standby
參考之前的部落格
簡單的做如下幾點提示:
1).初始化參數配置
初始化參數的修改并不僅僅隻是在待建立的Standby資料庫端建立,目前的Primary資料庫甚至同一個Data Guard配置中的其他Standby資料庫的初始化參數都有可能需要進行修改。
對于Primary資料庫,至少需要新增一個LOG_ARCHIVE_DEST_n參數,以發送REDO資料到新的Standby端,同時其他一些與Standby環境相關的參數也會涉及調整,如LOG_ARCHIVE_CONFIG及FAL_*等參數。
而對于現有的Standby資料庫(如果有的話),主要是基于角色轉換的考慮,有必要對一些參數提前進行設定,設定的參數對目前功能不會有任何影響或促進,如果确定不進行角色轉換,那麼同一個Data Guard配置中的其他Standby資料庫初始化參數也可以不做任何調整。
2).監聽和NetService配置
建議用Net Manager 工具來配置,這樣不容易出現錯誤。
3).建立密鑰檔案
必須確定在同一個Data Guard環境中,所有資料庫的SYS使用者擁有相同密碼,建議從其他伺服器複制密鑰檔案到本地,然後按照密鑰檔案名的格式修改檔案名即可。
注意Windows平台和Linux/UNIX平台下,密鑰檔案名的命名格式并不相同,Windows平台下密鑰檔案名格式為PWD[sid].ora,而Linux/UNIX平台下密鑰檔案名格式為orapw[sid],注意檔案名的大小寫喲。
2 Primary資料庫生成資料字典
注意:在Primary生成資料字典前,一定要確定待轉換的實體Standby資料庫已經停止REDO應用。如果已經啟用了REDO應用,執行下列語句停止REDO應用:
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
執行下列過程,生成LogMiner字典資訊:
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
PL/SQL procedure successfully completed.
控制檔案中記錄了日志檔案的應用狀态,正常情況下一個日志檔案隻會被應用一次,如果Primary生成的資料字典資訊被實體Standby資料庫應用了,等該實體Standby轉換成邏輯Standby資料庫時(不應用資料字典不代表就不能執行轉換喲)就不會再應用這些檔案,自然也沒有Primary資料庫對象的中繼資料,這可能會導緻這部分對象的修改不能被邏輯Standby正常應用。
我們操作的根本目的是為了讓邏輯Standby能夠應用到這部分資料字典資訊,隻要能夠實作這一點,是否暫停REDO應用或什麼時間暫停REDO應用就無所謂了。這也我們了解另外一個問題,如果Primary生成LogMiner字典資訊時,待轉換的實體Standby資料庫沒有暫停REDO應用怎麼辦?好辦,馬上暫停REDO應用,然後Primary資料庫重新生成一下LogMiner字典資訊就是。
3 轉換實體Standby為邏輯Standby
執行下列語句,轉換實體Standby為邏輯Standby:
SQL> SHOW PARAMETER DB_NAME
NAME TYPE VALUE
---------------------- ----------- ------------------------------
db_name string mynew1
SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY LGDG;
執行完該語句之後,關閉資料庫并重新啟動到MOUNT狀态:
SQL> SHUTDOWN IMMEDIATE
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> STARTUP MOUNT;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
為什麼要重新開機?因為上述操作涉及邏輯Standby資料庫更名,包括DBID、INCARNATION等均已被重新初始化。
再次檢視DB_NAME參數和資料庫角色:
SQL> SHOW PARAMETER DB_NAME;
NAME TYPE VALUE
-------------------------- ----------- ------------------------------
db_name string LGDG
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
LOGICAL STANDBY
現在DB_NAME和資料庫的角色都已經被修改。
4 調整邏輯Standby資料庫初始化參數
設定重做日志檔案路徑,将本地生成的歸檔檔案和Primary資料庫發送來的歸檔檔案分開,存放到不同目錄内,注意歸檔檔案路徑不要沖突,修改參數如下:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/archive VALID_FOR=(ONLINE_LOGFILES, ALL_ROLES) DB_UNIQUE_NAME=LGDG'; # LGDG 是在tnsnames.ora 中配置的
System altered.
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='LOCATION=/u01/std
VALID_FOR=(STANDBY_LOGFILES, STANDBY_ROLE) DB_UNIQUE_NAME=LGDG';
5 打開邏輯Standby
由于邏輯Standby與Primary資料庫事務并不一緻,是以第一次打開時必須指定RESETLOGS子句,執行語句如下:
SQL> ALTER DATABASE OPEN RESETLOGS;
然後執行下列SQL指令開始應用REDO資料:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY ;
如果要啟用實時應用,建議首先建立Standby Redologs,例如,為該邏輯Standby建立幾組Standby Redologs:
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/oracle/oradata/orcl/redo04.log' SIZE 50m;
Database altered.
重新執行啟動REDO應用的指令,附加APPLY IMMEDIATE子句,以打開實時應用(由于目前REDO應用已經啟動,是以我們首先停止REDO應用):
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
6 驗證環境
所有配置完成,接下來嘗試在Primary資料庫端執行修改操作,看看是否能夠分别在邏輯Standby和實體Standby端應用。
首先在Primary資料庫端執行下列語句,向tmp1表插入一條新記錄并送出:
SQL> insert into scott.dept values(1,'dave','dmm');
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
接下來看看邏輯Standby的同步情況:
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
1 dave dmm
提 示: 細心觀察重做日志,發現邏輯Standby有一點設計得很好,從Primary資料庫接收到的重做日志檔案檔案,應用過之後就會自動删除,節省了磁盤空間。
OK,至此邏輯Standby建立成功.
二. 主備切換之switchover
要在Primary和邏輯Standby之間切換角色,一般是從Primary資料庫開始操作。
如果Primary或邏輯Standby是RAC結構,切記在執行角色切換時,隻保留一個執行個體啟動,其他執行個體應當全部SHUTDOWN。等角色轉換操作完成之後再啟動其他執行個體,角色轉換的操作會自動傳播到這些執行個體上,并不需要DBA再對這些執行個體單獨做處理。
注意下列操作的執行步驟,強烈建議按照以下步驟執行,否則可能導緻切換不成功。
1.準備工作
檢查Primary和邏輯Standby的初始化參數設定,正常的檢查包括:
檢查兩機中初始化參數FAL_SERVER、FAL_CLIENT、LOG_ARCHIVE_CONFIG的參數值設定是否正确。
檢查兩機中初始化參數LOG_ARCHIVE_DEST_n的參數值設定是否正确。
首先來看目前的Primary資料庫:
SQL> SHOW PARAMETER FAL;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fal_client string orcl_pd
fal_server string orcl_st
SQL> SHOW PARAMETER LOG_ARCHIVE_DEST;
NAME TYPE VALUE
log_archive_dest string
log_archive_dest_1 string location=/u01/archive
log_archive_dest_10 string
log_archive_dest_2 string service=LGDG
從上述顯示的結果來看,Primary資料庫的初始化參數并不太适合,為了避免其轉換之後可能發生的錯誤,我們提前做些修改:
SQL> ALTER SYSTEM SET FAL_SERVER='LGDG';
SQL> alter system set log_archive_dest_1='location=/u01/archive
valid_for=(online_logfiles,all_roles) db_unique_name=orcl_pd';
System altered.
SQL> alter system set log_archive_dest_3='location=/u01/std
valid_for=(standby_logfiles,standby_role) db_unique_name=orcl_pd';
System altered.
然後再看看待轉換的邏輯Standby:
SQL> SHOW PARAMETER FAL;
fal_client string orcl_st
fal_server string orcl_pd
log_archive_dest_1 string LOCATION=/u01/archive VALID_FO
R=(ONLINE_LOGFILES, ALL_ROLES)
DB_UNIQUE_NAME=LGDG
log_archive_dest_2 string service=orcl_pd lgwr sync AFFI
RM
log_archive_dest_3 string LOCATION=/u01/std
VALID_FOR=(STANDBY_LOGFILES, S
TANDBY_ROLE) DB_UNIQUE_NAME=LG
DG
修改一下:
SQL> ALTER SYSTEM SET FAL_CLIENT='LGDG';
最後檢查Primary資料庫是否配置了Standby Redologs:
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- -------------------------------------------------------------------------
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log
4 STANDBY /u01/app/oracle/oradata/orcl/redo04.log
5 STANDBY /u01/app/oracle/oradata/orcl/redo05.log
6 STANDBY /u01/app/oracle/oradata/orcl/redo06.log
7 STANDBY /u01/app/oracle/oradata/orcl/redo07.log
已經存在, 如果不存在,我們就手工的添加一下:
2.檢查Primary資料庫狀态
檢視目前Primary資料庫狀态:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO STANDBY
如果該查詢傳回TO STANDBY 或SESSIONS ACTIVE則表示狀态正常,可以執行轉換操作,如果是其他值,你就需要重新檢查一下Data Guard配置,如看看LOG_ARCHIVE_DEST_n之類的參數值是否正确、有效等。
3.準備轉換Primary為邏輯Standby
執行下列語句,将Primary置為準備轉換的狀态:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY;
Database altered.
執行完上述操作後,Primary資料庫就開始為角色的轉換打好基礎,時刻準備着接收來自邏輯Standby資料庫,也就是未來的新Primary資料庫發來的REDO資料。
檢視一下SWITCHOVER_STATUS的狀态:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
PREPARING SWITCHOVER
4.準備轉換邏輯Standby為Primary
邏輯Standby資料庫準備轉換為Primary角色,執行下列語句:
SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY;
語句執行時響應可能會有點慢。
執行完後檢視目前邏輯Standby資料庫的轉換狀态:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
PREPARING SWITCHOVER
5.再次檢查Primary資料庫狀态
執行下列語句:
TO LOGICAL STANDBY
這步雖然不用做什麼操作,但檢查結果卻非常重要,它直接關系到switchover轉換是否能夠成功。邏輯Standby執行完PREPARE指令之後,就會生成相應的LogMiner字典資料(就像我們前面建立邏輯Standby時,Primary資料庫會生成LogMiner字典資料一樣),隻有它正常生成并發送至目前的Primary資料庫,轉換操作才能夠繼續下去。不然目前的Primary資料庫在轉換完之後,可能就失去了從新的Primary資料庫接收REDO資料的能力了。
是以,如果上述查詢的傳回結果不是TO LOGICAL STANDBY的話,DBA就需要考慮是否取消此次轉換,檢查原因,然後再重新操作了。
取消轉換可以通過下列語句進行:
ALTER DATABASE PREPARE TO SWITCHOVER CANCEL;
需要分别在Primary端和邏輯Standby端執行。由此可見準備工作的好處顯現出來了嘛,一旦異常,随時可以選擇取消。
6.轉換Primary為邏輯Standby
如果前面的操作都沒有問題,就可以正式開始角色轉換的操作,首先是将原Primary資料庫轉換成新的Standby,操作如下:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;
該語句需要等待目前Primary資料庫所有事務全部結束才開始執行。該語句執行過程中會自動拒絕使用者送出新事務或修改需求。為了確定該操作盡可能快的執行,最好自開始切換操作起就禁止所有使用者的操作。
該指令執行完之後,這個Primary資料庫就已經成為新的邏輯Standby了。不過在新Primary執行完轉換之前,不要關閉目前這個資料庫。
7.再次檢查邏輯Standby狀态
邏輯Standby在接收到前Primary的轉換消息,并應用完相關的REDO資料之後,會自動暫停SQL應用,然後查詢SWITCHOVER_STATUS的狀态,應該為TO PRIMARY:
SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE;
TO PRIMARY
或者
NOT ALLOWED
8.轉換邏輯Standby為新的Primary資料庫
最後的工作總會在邏輯Standby端操作,通過下列語句,将該邏輯Standby轉換為新的Primary資料庫:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
轉換操作至此完成。
最後啟動新邏輯Standby,即前Primary資料庫端的SQL應用即可:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
注意:每一個邏輯Standby都相當于是一個不同于(前)Primary的資料庫(DBID都不同),是以當邏輯Standby完成了轉換之後,相當于原Primary資料庫已經消失,依照原Primary資料庫配置的實體Standby自然也就失去了主從參照,實體Standby也就不再是目前Data Guard配置中的成員了。
這也正是前面修改Primary初始化參數時,取消發送REDO資料到實體Standby資料庫的原因。不過還好,對于switchover,Data Guard配置中的其他邏輯Standby資料庫不會有影響。
9.環境測試
最後來測試一下目前的Data Guard配置,首先在新Primary資料庫操作一條記錄:
SQL> insert into scott.dept values(2,'bl','bl');
轉到邏輯Standby端檢視:
2 bl bl
同步成功,也基本代表轉換成功。
三.主備切換之 Failover
failover有可能會丢失資料(視目前的資料庫保護模式而定),而且所有的操作都是在Standby資料庫端執行,這幾點對于邏輯Standby也同樣适用,甚至對于明确提及需要在前Primary資料庫執行的,不執行也沒關系,畢竟對于failover,我們假設的就是Primary資料庫已經over。
1.檢查及處理丢失的歸檔
雖然本步不是必需的,但如果希望盡可能少的丢失資料,除了資料保護模式之外,本步操作也非常重要。如果此時Primary資料庫仍可被通路,首先應當檢查目前的歸檔日志序号與邏輯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
如果上述查詢的結果不同,說明Primary存在尚未發送至邏輯Standby資料庫的歸檔檔案,手工複制這些檔案到待轉換角色的邏輯Standby端,然後在該邏輯Standby資料庫的SQL*Plus指令視窗,
通過執行ALTER DATABASE REGISTER LOGICAL LOGFILE 'filepath'; 指令,将複制過來的歸檔檔案手工注冊。
如果邏輯Standby與Primary的歸檔序号相同,但某些序号的APPLIED狀态為NO,建議DBA檢查一下目前邏輯Standby資料庫是否啟動了SQL應用。
如果Primary資料庫已經無法打開,DBA就隻好直接到磁盤上檢視歸檔目錄中的序号,來與邏輯Standby資料庫做比較。如果Primary資料庫已經完全無法通路,那請直接跳過本步。
2.檢查待轉換邏輯Standby的日志應用情況
查詢重做日志的應用情況,可以通過V$LOGSTDBY_PROGRESS視圖進行,例如:
SQL> SELECT APPLIED_SCN,LATEST_SCN FROM V$LOGSTDBY_PROGRESS;
APPLIED_SCN LATEST_SCN
----------- ----------
598967 598967
如果傳回的結果中顯示,兩列的列值一緻,則表示所有接收到的重做日志都已經應用。如果不一緻的話,啟動邏輯Standby端的SQL應用。
3.檢查及修正待轉換邏輯Standby的初始化參數配置
确認待轉換的邏輯Standby配置了正确的歸檔路徑,不僅是寫本地的歸檔配置,還要有寫遠端伺服器的歸檔配置,不然轉換完之後,這台新的Primary資料庫就成了光杆司令了。
一般來說,我們都是推薦在建立Standby資料庫的同時将一些用于角色切換的初始化參數也配置好(Primary和Standby端都應如此),以減少切換時操作的時間,提高切換效率。執行如下指令:
SQL> SHOW PARAMETER LOG_ARCHIVE_DEST
4.激活新的Primary資料庫
首先檢視目前操作的角色:
SQL> SELECT DATABASE_ROLE,FORCE_LOGGING FROM V$DATABASE;
DATABASE_ROLE FOR
---------------- ---
LOGICAL STANDBY YES
注 意
如果目前FORCE_LOGGING為NO,務必執行ALTER DATABASE FORCE LOGGING;指令。
執行下列語句,轉換Standby資料庫角色為Primary:
SQL> ALTER DATABASE ACTIVATE LOGICAL STANDBY DATABASE FINISH APPLY;
資料庫已更改。
該語句主要是停止待轉換的邏輯Standby中RFS程序,并應用完目前所有已接收但并未應用的REDO資料,然後停止SQL應用,将資料庫轉換成Primary角色。
語句執行完成後,再次檢視目前資料庫的角色:
PRIMARY YES
基本上到這一步,我們可以說角色轉換的工作已經完成了. 此處與邏輯Standby的switchover同理,切換完之後,原Data Guard配置就失效了,徹底的失效了,不僅實體Standby沒了,邏輯Standby也失去了參照,邏輯Standby的failover威力确實大呀,怪不得邏輯Standby用的人這麼少呢,環境脆弱肯定是原因之一,是以我們需要做些設定,重新将原來的邏輯Standby再加入到新的Data Guard配置環境中。
5.修複其他Standby資料庫
實體Standby資料庫的修複隻有重建一種方式,至于如何建立實體Standby,前面說的已經足夠多了,下面重點描述一下原Data Guard環境中的邏輯Standby。
注意的是,邏輯Standby的修複可不像實體Standby那樣簡單,相比較來說,重建其實是個簡單的工作,因為初始化參數檔案、密鑰檔案、存放目錄等都是現成的,幾乎不需要改動,DBA所需要做的,基本上就是重新複制一份新Primary資料庫的相關檔案,每個邏輯Standby都相當于是獨立的資料庫,如果你不希望重建邏輯Standby的話呢,Oracle倒是也提供了其他的解決方案。
假定原Data Guard環境中有邏輯Standby資料庫LGDG,執行failover後,LGDG不再是新Data Guard環境中的成員,這裡示範如何恢複該資料庫到目前的Data Guard配置,操作步驟如下:
(1)在原邏輯Standby中建立資料庫鍊,連接配接到新的Primary資料庫。
這裡所謂的原Standby資料庫,自然是指JSSLDG2喽,注意,資料庫鍊中用于連接配接新Primary資料庫的使用者必須擁有SELECT_CATALOG_ROLE角色。執行以下語句:
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;
會話已更改。
驗證一下資料鍊是否能夠正常通路:
SQL> SELECT SYSDATE FROM DUAL@BL;
SYSDATE
---------
06-MAY-10
提 示: ALTER SESSION ENABLE|DISABLE GUARD語句作用?
該語句用于允許或禁止使用者修改邏輯Standby中的結構。
(2)重新啟動SQL應用。
在各個邏輯Standby端執行下列語句啟動SQL應用(注意更新dblinkName):
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NEW PRIMARY BL;
如果你運氣好,等語句執行完之後,恢複過程就完成了。如果你非常不幸地碰到了ORA-16109錯誤,那麼我不得不告訴你,恐怕你得重建邏輯Standby了。