Oracle Data Gurad Physical Standby 相关说明
Oracle?Data?Guard,?分邏輯Standby和物理Standby。?下面講的是物理Standby?環境的搭建步驟。?有關Data?Guard的一些概念性的理論知識,請參考我的blog,?這里不做過多的說明。
?
Oracle?Data?Gurad?理論知識
http://blog.csdn.net/tianlesoftware/archive/2010/04/22/5514082.aspx
?
?
一.?啟用Force?Logging
將Primary數據庫置為Force?Logging模式。通過下列語句:
?
查看狀態:
SQL>?SELECT?DATABASE_ROLE,FORCE_LOGGING?FROM?V$DATABASE;
DATABASE_ROLE????FORCE_LOGGING
----------------? ---------------
PRIMARY????????? ?NO
?
修改模式
SQL>?alter?database?force?logging;
Database?altered.
?
取消Force?logging?模式:
SQL>?alter?database?no?force?logging;
Database?altered.
?
說明:為什么要改成Force?Logging
有一些DDL語句可以通過指定NOLOGGING子句的方式避免寫REDO(目的是提高速度,某些時候確實有效)。指定數據庫為Force?Logging模式后,數據庫將會記錄除臨時表空間或臨時回滾段外所有的操作,而忽略類似NOLOGGING之類的指定參數。如果在執行Force?Logging時有NOLOGGING之類的語句在執行,那么Force?Logging會等待,直到這類語句全部執行。
Force?Logging是作為固定參數保存在控制文件中,因此其不受重啟之類操作的影響(只執行一次即可),如果想取消,可以通過ALTER?DATABASE?NO?FORCE?LOGGING語句關閉強制記錄。
?
?
?
二.?創建密鑰文件(如果不存在的話)
同一個Data?Guard配置中所有數據庫必須都擁有獨立的密鑰文件,并且必須保證同一個Data?Guard配置中,所有數據庫服務器的SYS用戶擁有相同密碼,以保證REDO數據的順利傳輸,因為REDO傳輸服務是通過認證的網絡會話來傳輸REDO數據,而會話使用包含在密鑰文件中的SYS用戶密碼來認證。
如果使用DBCA建庫則Oracle會自動創建密鑰文件,該文件默認路徑在%ORACLE_HOME%/database目錄下,如果在該目錄沒能找到對應的密鑰文件也沒關系,Oracle提供了一個創建密鑰文件的命令:orapwd,位于%ORACLE_HOME%/bin目錄下,該命令有兩種調用方式:帶參調用和不帶參調用。
不帶參調用時,會返回該命令的調用方式和參數形式,例如:
[oracle@localhost?~]$?orapwd
Usage:?orapwd?file=<fname>?password=<password>?entries=<users>?force=<y/n>
??where
????file?-?name?of?password?file?(mand),
????password?-?password?for?SYS?(mand),
????entries?-?maximum?number?of?distinct?DBA?and?????force?-?whether?to?overwrite?existing?file?(opt),
OPERs?(opt),
??There?are?no?spaces?around?the?equal-to?(=)?character.
其中:
file:指定密鑰文件名稱和路徑。
password:SYS用戶密碼。
entries:指定該數據庫能夠擁有SYSDBA權限的用戶最大數。
force:如果文件存在是否覆蓋。
orapwd命令使用非常簡單,file和password為必填參數。
?
需要注意Windows平臺和Linux/UNIX平臺密鑰文件的命名規則并不相同:
Windows平臺命名規則:PWD[sid].ora??
Linux/UNIX平臺命令規則:orapw[sid]??--?注意:沒有文件名,(大小寫敏感)
?
示例如下:
[oracle@localhost?dbs]$?orapwd?file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl?password=admin?entries=30
?
Oracle?OS認證?口令文件?密碼丟失處理
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4698293.aspx
?
?
三.??配置Standby?Redologs
對于最大保護和最高可用性模式,建議為Standby數據庫配置Standby?Redologs(不配置也可以,Oracle將在Standby數據庫端自動創建歸檔文件,并虛擬為一組Standby?Redologs),并使用LGWR?SYNC模式傳輸REDO數據。
?
1.關于Standby?Redologs
Oracle建議DBA在創建Standby數據庫時,就考慮Standby?Redologs配置的問題。Standby?Redologs與Online?Redologs非常類似,應該說兩者只是服務對象不同,其他參數屬性,甚至操作的命令格式幾乎都一樣,DBA在設計Standby?Redologs的時候完全可以借鑒創建Online?Redologs的思路,如創建幾個文件組,每組多個文件冗余之類的。除些之外呢,Oracle提供了一些標準的建議,如下所示:
(1)確保Standby?Redologs的文件大小與Primary數據庫Online?Redologs文件大小相同。這個很好理解,就是為了接收和應用方便嘛。
(2)創建適當數目的日志組。一般而言,Standby?Redologs日志組要比Primary數據庫的Online?Redologs日志文件組數至少多一個。建議Standby?Redologs日志組數量基于Primary數據庫的線程數來確定(這里的線程數可以理解為RAC環境中的節點數)。
有一個推薦的公式可供參考:(每線程的日志組數+1)×最大線程數。
例如Primary數據庫有兩個線程,每個線程分配兩組日志,則Standby日志組數建議為6組,使用這個公式可以降低Primary數據庫實例LGWR進程鎖住的可能性。
?
提?示:?邏輯Standby數據庫有可能需要視工作量,增加更多的Standby?Redologs組(或增加歸檔進程),因為邏輯Standby數據庫有可能需要同時寫Online?Redologs文件。
?
2.管理Standby?Redologs
Standby?Redologs的操作方式與Online?Redologs幾乎一模一樣,只不過在創建或刪除時需要多指定一個Standby關鍵字。
?
查看redo?log:
SQL>?SELECT?GROUP#,TYPE,MEMBER?FROM?V$LOGFILE;
?
????GROUP#?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
?
?
添加一個新的Standby?Redologs組(注意組號不要與當前存在的Online?Redologs組重復),并為該組指定一個成員:
SQL>?ALTER?DATABASE?ADD?STANDBY?LOGFILE?GROUP?4?('/u01/app/oracle/oradata/orcl/redo04.log')?size?50M;?
SQL>?ALTER?DATABASE?ADD?STANDBY?LOGFILE?GROUP?5?('/u01/app/oracle/oradata/orcl/redo05.log')?size?50M;?
SQL>?ALTER?DATABASE?ADD?STANDBY?LOGFILE?GROUP?6?('/u01/app/oracle/oradata/orcl/redo06.log')?size?50M;?
SQL>?ALTER?DATABASE?ADD?STANDBY?LOGFILE?GROUP?7?('/u01/app/oracle/oradata/orcl/redo07.log')?size?50M;?
?
?
刪除Standby?Redologs組也同樣簡單:
SQL>?ALTER?DATABASE?DROP?STANDBY?LOGFILE?GROUP?4;
?
可以通過動態性能視圖V$LOGFILE查看當前數據庫中創建的Standby?Redologs,例如:
SQL>?SELECT?GROUP#,TYPE,MEMBER?FROM?V$LOGFILE;
????GROUP#?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
?
提示:通過該視圖中的TYPE列區分該條記錄是Online?Redologs或是Standby?Redologs。
通過查看Standby?Redologs的專用視圖V$STANDBY_LOG來查看當前數據庫中創建的Standby?Redologs,如:
SQL>?SELECT?GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS?FROM?V$STANDBY_LOG;
????GROUP#????THREAD#??SEQUENCE#?ARC?STATUS
----------?----------?----------?---?----------
?????????4??????????0??????????0?YES?UNASSIGNED
?????????5??????????0??????????0?YES?UNASSIGNED
?????????6??????????0??????????0?YES?UNASSIGNED
?????????7??????????0??????????0?YES?UNASSIGNED
?
從可靠性方面考慮,DG的設計初衷就是當發生故障時快速切換Primary和Standby的角色,以達到快速恢復應用訪問的目的。一旦發生切換,原Primary數據庫就變成了Standby數據庫,就得需要Standby?Redologs,為了減少真正切換時應做的工作,建議在Primary數據庫也創建Standby?Redologs,這樣即使發生切換,也不會影響Primary作為Standby身份的正常運行。
?
四??設置初始化參數
對于Primary數據庫,有幾個與角色相關的初始化參數需要進行設置,這些參數初始時有些用來控制REDO傳輸服務(即Primary數據庫生成的REDO數據傳給誰以及怎么傳),有些用來指定角色,還有幾個與Standby角色相關的初始化參數,也建議進行配置,以便switchover/failover操作后,Primary/Standby數據庫仍能正常工作,建議不管是Primary數據庫,還是Standby數據庫,對于角色相關的初始化參數都進行配置。
?
五.將Primary數據庫置于歸檔模式
要創建一個Data?Guard環境,Primary數據庫必須處于歸檔模式。
?
對于非歸檔模式的數據庫該為歸檔模式,步驟如下:?
1.?SQL>?alter?system?set?log_archive_dest_1='location=/oracle/oracle10g/log/archive_log';?
2.關閉數據庫?
SQL>?shutdown?immediate?
3.啟動數據mount狀態:?
SQL>?startup?mount;?
4、修改數據庫為歸檔模式:?
SQL>?alter?database?archivelog;?
5、打開數據庫,查詢:?
SQL>?alter?database?open;?
?
更多內容參考我的Blog:?Oracle?歸檔與非歸檔的切換:
http://blog.csdn.net/tianlesoftware/archive/2009/10/19/4693470.aspx
?
?
----------
10.2.2??物理Standby創建時的操作步驟
?
一.?創建備份
物理Standby數據庫相當于Primary數據庫在某個時間點的鏡像復制,因此在創建物理Standby數據庫之前,至少要有一份Primary數據庫的完整備份。
Oracle建議使用RMAN創建備份集,不過如果數據庫規模不是太大,我個人更傾向于通過用戶管理的方式創建備份集。
?
創建備份有三種方式:
1.?RMAN?備份與恢復?--?不需要shutdown?數據庫
備份:
$?rman?target?/
RMAN>?backup?full?format?'D:/FULL_%d_%T_%s.bak'?database?include?current?controlfile?for?standby;
RMAN>?sql?'alter?system?archive?log?current';
RMAN>?Backup?ArchiveLog?all?format='D:/arch_%d_%T_%s.bak';?
傳送:
備份完后將備份文件拷到standby上同樣的目錄,強調:同樣的目錄,在standby進行rman?恢復即可
?
恢復:
$rman?targetsys/admin@primaryauxiliary?/
RMAN>?duplicate?target?database?for?standby?dorecover?nofilenamecheck;
?
2.?用戶管理方式??--?不需要shutdown?數據庫
用用戶管理方式創建熱備份就是備份表空間,可以分成三個步驟:
1).?通過ALTER?TABLESPACE?BEGIN?BACKUP命令標記指定表空間進入備份狀態。
2).?通過操作系統命令復制鎖定表空間的數據文件。
3).?通過ALTER?TABLESPACE?END?BACKUP命令標記指定表空間結束備份。
?
例如,對USERS表空間進行備份:
SQL>?select?tablespace_name,?file_name?from?dba_data_files;
TABLESPACE_NAME????????????????FILE_NAME
------------------------------?-------------------------------------------------
USERS??????????????????????????/u01/app/oracle/oradata/orcl/users01.dbf
SYSAUX?????????????????????????/u01/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1???????????????????????/u01/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM?????????????????????????/u01/app/oracle/oradata/orcl/system01.dbf
?
SQL>?ALTER?TABLESPACE?USERS?BEGIN?BACKUP;
Tablespace?altered.
SQL>?!cp?/u01/app/oracle/oradata/orcl/users01.dbf?/u01/users01.dbf
SQL>?ALTER?TABLESPACE?USERS?END?BACKUP;
Tablespace?altered.
?
3.?直接copy?文件?--?shutdown?進行
實例關閉后,拷貝數據文件到備庫上即可。
?
二.創建Standby數據庫控制文件
?
在Primary?庫上執行如下語句,為Standby數據庫創建控制文件:
SQL>?ALTER?DATABASE?CREATE?STANDBY?CONTROLFILE?AS?'/u01/backup/control01.ctl';?
?
注?意:控制文件通常需要有多份,你要么手工將上述文件復制幾份,要么用命令多創建幾個出來。需要注意,如果選擇多次執行上述命令創建出多份,務必確保執行創建時數據庫處于MOUNT狀態,否則幾個控制文件的SCN有可能并不匹配,從而導致Standby數據庫無法正常啟動到MOUNT狀態。
另外,創建完控制文件之后到Standby數據庫創建完成這段時間內,要保證Primary數據庫不再有結構上的變化(如增加表空間等),不然Primary和Standby同步時會有問題。
Data?Guard?也是根據控制文件來判斷哪個是standby的
?
?
三.??配置Standby數據庫的初始化參數文件
可按照下列步驟操作:
(1)創建PFILE客戶端初始化參數文件。
由于SPFILE服務器端初始化參數文件為二進制格式,無法直接編輯,因此建議首先通過SPFILE創建PFILE,操作如下:
SQL>?CREATE?PFILE?FROM?SPFILE;?
(2)修改初始化參數文件中的參數。
注意Primary和Standby不同角色對應初始化參數的配置。
注意保持各初始化參數中的路徑準確有效。
?
四.??復制文件到Standby服務器
復制文件到Standby服務器主要包括三部分:備份的數據文件、創建的Standby數據庫控制文件和修改過的初始化參數文件。
?
五.??配置Standby數據庫
?
如果是Windows?環境下,?還需要創建新的OracleService。
oradim.exe?-new?-sid?orcl?-startmode?m?
oradim.exe?-edit?-sid?orcl?-startmode?a?
?
創建密鑰文件,注意保持密碼與Primary數據庫一致。
配置監聽并啟動。
修改Primary數據庫所在服務器和Standby數據庫所在服務器的tnsnames.ora,各自增加對應的Net?Service?Name。
創建服務器端的初始化文件。
?
六.??啟動物理Standby數據庫REDO應用
完成對Standby數據庫的配置之后,就可以啟動該Standby數據庫了。物理Standby極少情況下可以以READ?WRITE模式打開,某些情況下可以以READ?ONLY模式打開,不過多數情況下,應該啟動到MOUNT狀態。
直接執行STARTUP命令打開物理Standby數據庫,默認會以只讀方式打開數據庫,而不是READ?WRITE模式,Oracle會根據控制文件判斷是否是物理Standby,如果是則默認啟動到READ?ONLY模式,例如:
SQL>?STARTUP;??
......??
SQL>?SELECT?OPEN_MODE?FROM?V$DATABASE;??
OPEN_MODE??
----------?
READ?ONLY?
跟你想的不一樣是吧,那說明你的思維還沒轉過彎來。
通常情況下,我們將物理Standby數據庫加載到MOUNT狀態即可:
SQL>?STARTUP?MOUNT;?
進入MOUNT狀態后,Standby數據庫就開始接收Primary數據庫發送的歸檔REDO數據,然后你可以繼續通過一些命令應用這些REDO數據。
例如,啟動REDO應用:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?DISCONNECT?FROM?SESSION;?
?
或者附加USING?CURRENT?LOGFILE子句啟動實時應用:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?USING?CURRENT?LOGFILE?DISCONNECT?FROM?SESSION;?
注意,要啟動實時應用,Primary數據庫在發送REDO數據時必須使用LGWR進程發送。如果使用ARCH方式發送REDO數據,Standby數據庫無法啟動實時應用,強行啟動會報ORA-38500錯誤。
?
提?示:?DISCONNECT?FROM?SESSION子句并非必需,該子句的作用呢,是指定啟動完應用后自動退出到命令操作符前。如果不指定該子句的話,當前SESSION就會一直停留處理REDO應用,如果想做其他操作,就只能新建一個連接。
?
七??停止Standby數據庫
跟啟動一樣,關閉Standby數據庫也有很多講究,某些情況下如果操作不當,關閉Standby數據庫甚至會連帶導致Primary數據庫也關閉(這點后面會有詳細介紹),幸好一般情況下不會出現這種情況,即使是像Primary數據庫那樣直接關閉,數據庫也沒有問題,畢竟Data?Guard就是用于容災的,別說普通的關閉數據庫,就是直接拔電源也不怕,最多就是在Primary數據庫的警告日志文件中記錄一堆報錯信息。
正常情況下,停止Standby數據庫(含物理Standby和邏輯Standby)之前,應該首先停止Primary數據庫,如果直接停止Standby數據庫,輕則Primary數據庫的Alert文件中記錄一堆歸檔發送失敗的錯誤信息,重則Primary直接shutdown。
不過,對于一些測試環境,偶爾也希望能在Primary數據庫正常運行的情況下,停止Standby以進行一些其他操作,在這種情況下通常建議使用下列步驟:
?
首先是Primary端操作,修改Primary數據庫的log_archive_dest_state_n參數,暫時取消向Standby數據庫發送日志,例如:
SQL>?ALTER?SYSTEM?SET?LOG_ARCHIVE_DEST_STATE_2=DEFER;?
這樣Standby端不可訪問時,Primary數據庫的Alert日志文件中也不會再報錯了。
然后Standby端就可以停止REDO應用:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?CALCEL;?
最后才是關閉Standby數據庫:
SQL>?SHUTDOWN?IMMEDIATE;?
物理Standby創建的基本步驟就是這樣。
?
?
Oracle?Data?Guard?環境搭建的完整實例,請參考我的CSDN?Blog:
?
Oracle?Data?Guard?Linux?平臺?Physical?Standby?搭建實例
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5547565.aspx
?
Oracle?10G?windows?平臺?DataGuard?實例
http://blog.csdn.net/tianlesoftware/archive/2009/10/27/4730092.aspx
?
?
?
八??用READ?ONLY模式打開物理Standby
物理Standby可以有效分擔Primary數據庫壓力,提升資源利用,實際上說的就是將物理Standby置于OPEN狀態。
當以READ?ONLY模式打開物理Standby,可以將一些不涉及數據庫寫操作的任務如查詢、備份轉移到Standby數據庫端進行,通過這種方式來分擔Primary數據庫的壓力。下面我們通過實際操作,詳細了解Standby數據庫在關閉狀態、打開狀態以及REDO應用狀態中的轉換。
?
1.物理Standby數據庫從SHUTDOWN狀態啟動到READ?ONLY狀態
SQL>STARTUP??
ORACLE?instance?started.??
SQL>?SELECT?OPEN_MODE?FROM?V$DATABASE;
OPEN_MODE
----------
MOUNTED
不過啟動成功之后,并不是像普通Oracle數據庫那樣置于READ?WRITE模式,而是進入到READ?ONLY模式。
?
2.物理Standby數據庫從REDO應用狀態啟動到READ?ONLY狀態
?
1)首先需要取消REDO應用,執行下列語句:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?CANCEL;
Database?altered.
?
注意:雖然當前是在MOUNT狀態,但并不能直接ALTER?DATABASE?OPEN打開數據庫,否則會報ORA-01154錯誤。
SQL>?ALTER?DATABASE?OPEN;
ALTER?DATABASE?OPEN
*
ERROR?at?line?1:
ORA-01154:?database?busy.?Open,?close,?mount,?and?dismount?not?allowed?now
?
2)取消REDO應用后,再打開數據庫:
SQL>?ALTER?DATABASE?OPEN;
Database?altered.
SQL>?SELECT?OPEN_MODE?FROM?V$DATABASE;
OPEN_MODE
----------
MOUNTED
?
注意:OPEN的時候不需要附加READ?ONLY子句,Oracle會根據控制文件判斷是否是物理Standby,從而自動啟動到READ?ONLY模式。
?
3.物理Standby數據庫從READ?ONLY狀態切換回REDO應用狀態
要從OPEN狀態切換回REDO應用狀態,并不需要SHUTDOWN數據庫再啟動,直接執行啟用REDO應用的語句即可,例如:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?DISCONNECT?FROM?SESSION;
Database?altered.
SQL>?SELECT?OPEN_MODE?FROM?V$DATABASE;
OPEN_MODE
----------
MOUNTED
?
由于只讀打開時不能應用,查詢的結果可能與Primary數據庫并不同步的,這一點小小的缺憾降低了物理Standby提供報表服務,分擔Primary數據庫壓力的實用性,對于這點呢,我們有兩個解決方案:
改用邏輯Standby,由于邏輯Standby是打開狀態下的實時應用,因此數據同步應該是沒啥問題了(只要Primary數據庫的數據類型都能被邏輯Standby支持)。
Oracle?11g全面改良了物理Standby,最突出的特點就是在READ?ONLY打開模式下,可以邊接收邊應用了,所以可以考慮升級數據庫到最新版本,當然新版本也有新版本的問題,如各種尚未暴露出來的Bug。
?
?
九??管理影響物理Standby的Primary數據庫事件
多數情況下,Primary數據庫的修改會隨著REDO數據傳播到物理Standby數據庫端并被應用,不需要在物理Standby端做額外的操作,不過根據實際配置的不同,也會有例外,有些操作不是沒有被傳播到Standby端,而是傳播過去了,但不能正確執行,其中最常見的就是對表空間和日志文件的管理操作,下面通過實例逐一進行說明。
?
9.1??創建表空間或數據文件
初始化參數STANDBY_FILE_MANAGEMENT用來控制是否自動將Primary數據庫增加表空間或數據文件的改動,傳播到物理Standby數據庫。該參數有兩個值:
AUTO:如果該參數值設置為AUTO,則Primary數據庫執行的表空間創建操作也會被傳播到物理Standby數據庫上執行。
MANUAL:如果設置為MANUAL或未設置任何值(默認值是MANUAL),需要手工復制新創建的數據文件到物理Standby服務器。
?
注?意:STANDBY_FILE_MANAGEMENT參數特指Primary數據庫端的表空間或數據文件創建,如果數據文件是從其他數據庫復制而來(比如通過TTS傳輸表空間),則不管STANDBY_FILE_MANAGEMENT參數值如何設置,都必須同時手工復制到Standby數據庫,并重建物理Standby數據庫的控制文件。
?
9.2??刪除表空間
在Primary數據庫端刪除表空間時,會影響到物理Standby端數據庫的數據文件和表空間,初始化參數STANDBY_FILE_MANAGEMENT的屬性值設置決定了該事件是否需要DBA介入。
當STANDBY_FILE_MANAGEMENT設置為AUTO。
SQL>?ALTER?SYSTEM?SET?STANDBY_FILE_MANAGEMENT=AUTO;??
System?altered.?
在Primary數據庫端執行刪除表空間的操作:
SQL>?DROP?TABLESPACE?TEST?INCLUDING?CONTENTS?AND?DATAFILES;??
Tablespace?dropped.?
注:INCLUDING?DATAFILES子句,在刪除表空間時Oracle也將自動刪除對應的物理文件。
?
將初始化參數STANDBY_FILE_MANAGMENT設置為AUTO,對于表空間和數據文件的操作也無須DBA手工干預,物理Standby能很好地進行處理。
?
當STANDBY_FILE_MANAGEMENT參數設置為MANUAL時,即使DBA在Primary數據庫端執行刪除操作時加上了INCLUDING?DATAFILES子句,Standby數據庫仍然只會將表空間和數據文件從數據字典中刪除,表空間涉及的物理文件仍需要手工刪除。
?
對于文件系統,我們可以將初始化參數STANDBY_FILE_MANAGMENT設置為AUTO,但是對于裸設備,只能將該參數設置為MANUAL。
?
9.3??重命名數據文件
如果Primary數據庫重命名了一個或多個數據文件,該項修改并不會自動傳播到Standby數據庫。?就算設置了初始化參數STANDBY_FILE_MANAGEMENT等于AUTO也不行,要讓Standby的數據文件與Primary保持一致,只能手工操作。
?
下面通過示例演示,操作步驟如下:
首先OFFLINE要更名的數據文件所在的表空間:
SQL>?ALTER?TABLESPACE?SCOTT_TBS?OFFLINE;??
Tablespace?altered.?
然后手工修改數據文件名。方法很多,這里直接使用操作系統自帶的RENAME命令(在Linux平臺下可用mv命令):
SQL>?HOST?RENAME?F:/oracle/oradata/test/scott_tbs01.dbf?scott01.dbf?
通過命令修改數據字典中的數據文件路徑,然后ONLINE表空間:
SQL>?ALTER?TABLESPACE?SCOTT_TBS?RENAME?DATAFILE??
??2??'F:/oracle/oradata/test/scott_tbs01.dbf'?to?
??3??'F:/oracle/oradata/test/scott01.dbf';??
Tablespace?altered.??
SQL>?ALTER?TABLESPACE?SCOTT_TBS?ONLINE;??
Tablespace?altered.??
SQL>?SELECT?NAME?FROM?V$DATAFILE;??
NAME?
--------------------------------------------------?
F:/ORACLE/ORADATA/TEST/SCOTT01.DBF??
切換日志:??
SQL>?ALTER?SYSTEM?SWITCH?LOGFILE;??
System?altered.??
?
在物理Standby端查看當前數據文件路徑:??
SQL>?SELECT?NAME?FROM?V$DATAFILE;??
NAME?
--------------------------------------------------?
L:/ORADATA/JSSPDG/SCOTT_TBS01.DBF?
?
Standby數據庫端的數據文件仍為原路徑,并未被修改,因此只能DBA介入手動修改。步驟如下:
首先暫停REDO應用:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?CANCEL;??
Database?altered.?
手工將數據文件改名:
SQL>?HOST?REN?l:/oradata/test/scott_tbs01.dbf?scott01.dbf?
然后修改數據字典中數據文件的路徑:
SQL>?ALTER?DATABASE?RENAME?FILE??
??2??'L:/ORADATA/TEST/SCOTT_TBS01.DBF'?to?
??3??'L:/ORADATA/TEST/SCOTT01.DBF';??
Database?altered.?
最后重新啟動Standby數據庫的REDO應用即可:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?DISCONNECT?FROM?SESSION;??
Database?altered.?
?
9.4?添加或刪除Redologs文件
?數據庫調優時極有可能會涉及重置日志文件大小或增加刪除日志組等操作,如果STANDBY_FILE_MANAGEMENT參數值設置為AUTO的話,這種操作也會被傳播到物理Standby數據庫。不過在一般情況下,你可以不管STANDBY_FILE_MANAGEMENT參數的設置,因為無論Primary端對日志組或日志文件的操作是否傳播到物理Standby數據庫,也不會影響到物理Standby數據庫的運行,不過如果你不注意其中的關系,造成的影響可能會很深遠。
?
通常建議當你在Primary數據庫增加或刪除Online?Redologs時,一定記得手工同步相關物理Standby數據庫中相關的設置,同時也要考慮好Standby?Redologs與Online?Redologs之間的關系,即保證Standby?Redologs比Online?Redologs要至少多一組。
注意的就是在Standby數據庫端操作前務必將STANDBY_FILE_MANAGEMENT設置為MANUAL,如果物理Standby數據庫的日志文件與Primary數據庫路徑不同的話,應該通過初始化參數LOG_FILE_NAME_CONVERT的設置,讓其自動進行轉換。
?
9.5??跨OPEN?RESETLOGS的應用
在某些情況下,Primary數據庫以RESETLOGS方式打開之后,也不會影響Data?Guard的配置,Standby數據庫無須人工參與,自動應用OPEN?RESETLOGS的操作,繼續接收并應用Primary數據庫OPEN?RESETLOGS之后產生的日志。
當然這是有條件的,并不是所有情況下都能這么智能。我們知道執行ALTER?DATABASE?OPEN?RESETLOGS語句之后,數據庫的INCARNATION被重置,也就是此時其Standby數據庫的SEQUENCE序號也會從頭開始設置。當然物理Standby數據庫并不關注這一點,它只是忠實地緊跟Primary數據庫的腳步,一步一步地執行Primary數據庫曾經執行過的操作,因此當其接收到新的REDO數據時,就會自動應用這部分REDO數據。
正常情況下這個邏輯沒有問題,不過遇到Primary執行過OPEN?RESETLOGS之后,又通過備份恢復到OPEN?RESETLOGS之前的狀態,視物理Standby的具體配置(配置方式決定了物理Standby是否有可能回到OPEN?RESETLOGS之前的狀態)的不同,情況可能會復雜很多。
?
圖中顯示了Primary數據庫RESETLOGS操作對Standby的影響
| Standby數據庫狀態 | Standby服務器操作 | 解決方案 |
| 尚未應用RESETLOGS之前的REDO數據 | 自動應用REDO數據 | 無須手工介入 |
| 應用了RESETLOGS之后的REDO數據,不過Standby數據庫啟用了FRA | 可以回到應用RESETLOGS之前的狀態,不過需要DBA手工介入 | 手工FLASHBACK?DATABASE到應用RESETLOGS日志之前的狀態 重啟REDO應用,以重新接收新的REDO數據 |
| 應用了RESETLOGS之后的REDO數據,而且沒有配置FRA | 無法進行應用處理 | 重建物理Standby是唯一的選擇 |
?
?
十?監控Primary和物理Standby數據庫
10.1??監控途徑:概括起來主要通過兩個方面來進行:
?
| Primary數據庫事件 | Primary監控途徑 | 物理Standby監控途徑 |
| 帶有ENABLE|DISABLE?THREAD子句的ALTER?DATABASE命令 | ??????Alert.log ??????V$THREAD | ?????????Alert.log |
| 當前數據庫角色,保護模式,保護級別,switchover狀態,failover快速啟動信息等 | ????????V$DATABASE | ?????????V$DATABASE |
| Redolog切換 | ???????Alert.log ??????V$LOG V$LOGFILE的status列 | ?????????Alert.log |
| 重建控制文件 | ?????????Alert?log | ???????Alert?log |
| 手動執行恢復 | ?????????Alert?log | ???????Alert?log |
| 表空間狀態修改(READ?WRITE/READ?ONLY,ONLINE/OFFLINE) | ?????DBA_TABLESPACES ????????Alert?log | ????????V$RECOVER_FILE |
| 創建刪除表空間或數據文件 | DBA_DATA_FILES ???????Alert?log | ????????V$DATAFILE ?????????Alert?log |
| 表空間或數據文件OFFLINE | ???V$RECOVER_FILE ?????????Alert?log ??DBA_TABLESPACES | ????????V$RECOVER_FILE ???????DBA_TABLESPACES |
| 重命名數據文件 | ????????V$DATAFILE ????????Alert?log | ???????V$DATAFILE ?????????Alert?log |
| 未被日志記錄或不可恢復的操作 | ??????V$DATAFILE ?????V$DATABASE | ?????????Alert?log |
| 恢復的進程 | ???????????????????V$ARCHIVE_DEST_STATUS????????? Alert?log | ?????V$ARCHIVED_LOG ???V$LOG_HISTORY???????????V$MANAGED_STANDBY ????????Alert?log |
| REDO傳輸的狀態和進度 | ???????????????????V$ARCHIVE_DEST_STATUS ????V$ARCHIVED_LOG?????????V$ARCHIVE_DEST ????????Alert?log | ?????????V$ARCHIVED_LOG?????????Alert?log |
| 數據文件自動擴展 | ?????????Alert?log | ?????????Alert?log |
| 執行OPEN?RESETLOGS或CLEAR?UNARCHIVED?LOGFILES | ????????Alert?log | ?????????Alert?log |
| 修改初始化參數 | ???????Alert?log | ????????Alert?log |
?
10.2??監控恢復進度
10.2.1?查看進程的活動狀態
V$MANAGED_STANDBY視圖專用于顯示物理Standby數據庫相關進程的當前狀態,該視圖中的列也很有特點,查看進程狀態時,通常我們會關注PROCESS、CLIENT_PROCESS、SEQUENC#和STATUS幾列,例如:
SQL>?SELECT?PROCESS,CLIENT_PROCESS,SEQUENCE#,?STATUS?FROM?V$MANAGED_STANDBY;
?
PROCESS???CLIENT_P??SEQUENCE#?STATUS
---------?--------?----------?------------
ARCH??????ARCH????????78? CLOSING
ARCH??????ARCH????????79 ?CLOSING
MRP0??????N/A??????????80? WAIT_FOR_LOG
RFS???????LGWR????????80? IDLE
RFS???????ARCH?????????0 ?IDLE
RFS???????N/A?????????? ?0 ?IDLE
?
相關說明:
PROCESS:進程名稱,如ARCH、RFS、MRP0等。
CLIENT_P:對應的Primary數據庫中的進程,如ARCH、LGWR等。
SEQUENCE#:歸檔序號。
STATUS:進程的當前狀態,值較多,常見的有:
1)ALLOCATED:正準備連接Primary數據庫。
2)ATTACHED:正在連接Primary數據庫。
3)CONNECTED:已連接至Primary數據庫。
4)IDLE:空閑中。
5)RECEIVING:歸檔文件接收中。
6)OPENING:歸檔文件處理中。
7)CLOSING:歸檔文件處理完,收尾中。
8)WRITING:REDO數據庫寫向歸檔文件中。
9)WAIT_FOR_LOG:等待新的REDO數據中。
10)WAIT_FOR_GAP:歸檔有中斷,正等待中斷的那部分REDO數據。
11)APPLYING_LOG:應用REDO數據中。
?
?
10.2.2??檢查REDO應用進度
V$ARCHIVE_DEST_STATUS視圖顯示歸檔文件路徑配置信息及REDO的應用情況等,例如:
SQL>?SELECT?DEST_NAME,ARCHIVED_THREAD#,ARCHIVED_SEQ#,APPLIED_THREAD#,APPLIED_SEQ#,?
DB_UNIQUE_NAME?FROM?V$ARCHIVE_DEST_STATUS?WHERE?STATUS='VALID';
?
DEST_NAME?ARCHIVED_THREAD#?ARCHIVED_SEQ#?APPLIED_THREAD#?APPLIED_SEQ#?DB_UNIQUE_NAME
--------------------?----------------?-------------?---------------?------------?------------------------------
LOG_ARCHIVE_DEST_1?????????1??????????79??????????????0????????????0 ?????NONE
STANDBY_ARCHIVE_DEST??????1??????????78??????????????1???????????78?????NONE
?
10.2.3?檢查歸檔文件路徑和創建信息
物理Standby數據庫端可以通過查詢V$ARCHIVED_LOG視圖,獲取歸檔文件的一些附加信息,如文件創建時間、創建進程、歸檔序號、是否被應用等,例如:
SQL>??SELECT?NAME,CREATOR,SEQUENCE#,APPLIED,COMPLETION_TIME?FROM?V$ARCHIVED_LOG;
NAME???????????????????????????????????????????????CREATOR??SEQUENCE#?APP?COMPLETIO
--------------------------------------------------?-------?----------?---?---------
/u01/archive/1_1_717413573.dbf?????????????????????ARCH?????????????1?YES?30-APR-10
/u01/archive/1_3_717413573.dbf?????????????????????ARCH?????????????3?YES?30-APR-10
...?...?
/u01/archive/1_78_717413573.dbf????????????????????ARCH????????????78?YES?01-MAY-10
/u01/archive/1_79_717413573.dbf????????????????????ARCH????????????79?YES?02-MAY-10
?
10.2.4?查詢歸檔歷史
物理Standby數據庫端通過V$LOG_HISTORY視圖,可以查詢所有已被應用的歸檔文件信息(無論該歸檔文件是否還存在),例如:
SQL>?SELECT?FIRST_TIME,FIRST_CHANGE#,NEXT_CHANGE#,?SEQUENCE#?FROM?V$LOG_HISTORY;
?
FIRST_TIM?FIRST_CHANGE#?NEXT_CHANGE#??SEQUENCE#
---------?-------------?------------?----------
27-APR-10????????446075???????475833??????????1
27-APR-10????????475833???????489482??????????2
...?...
30-APR-10????????544929???????590113?????????78
01-MAY-10????????590113???????652357?????????79
?
仍然通過該視圖,稍稍修改下SQL語句,就可以查詢到最后應用的歸檔文件,例如:
SQL>?SELECT?THREAD#,?MAX(SEQUENCE#)?AS?"LAST_APPLIED_LOG"?FROM?V$LOG_HISTORY?GROUP?BY?THREAD#;
?
???THREAD#?LAST_APPLIED_LOG
----------?----------------
?????????1???????????????79
?
當然也可以通過查詢V$ARCHIVED_LOG視圖中的APP列獲得相同的功能,例如:??
SQL>?SELECT?THREAD#,?SEQUENCE#,?APPLIED?FROM?V$ARCHIVED_LOG;
???THREAD#??SEQUENCE#?APP
----------?----------?---
?????????1??????????1?YES
?????????1??????????2?YES
?????????1??????????3?YES
?
10.2.5 查看物理Standby數據庫未接收的日志文件
日志文件的發送是通過LOG_ARHIVE_DEST_N參數來控制,因此我們只需要對比本地生成的歸檔和遠端生成的歸檔間差異即可。例如:
SQL>?SELECT?LOCAL.THREAD#,?LOCAL.SEQUENCE#?FROM?(SELECT?THREAD#,?SEQUENCE#?FROM?V$ARCHIVED_LOG?WHERE?DEST_ID=1)?LOCAL?WHERE?LOCAL.SEQUENCE#?NOT?IN??(SELECT?SEQUENCE#?FROM?V$ARCHIVED_LOG?WHERE?DEST_ID=2?AND??THREAD#?=?LOCAL.THREAD#);
?
???THREAD#??SEQUENCE#
----------?----------
?????????1?????????76
?????????1?????????77
?????????1?????????78
?????????1?????????79
?
說明:??DEST_ID=N,N其實就是LOG_ARCHIVE_DEST_N參數中的那個N。
?
10.2.6??監控日志應用服務
1)?查詢當前數據的基本信息(v$database信息):如,查詢數據庫角色、保護模式、保護級別等:
SQL>?SELECT?DATABASE_ROLE,DB_UNIQUE_NAME,OPEN_MODE,
PROTECTION_MODE,PROTECTION_LEVEL,?SWITCHOVER_STATUS??FROM?V$DATABASE;?
?
DATABASE_ROLE????DB_UNIQUE_NAME?????????????????OPEN_MODE??PROTECTION_MODE??????PROTECTION_LEVEL?????SWITCHOVER_STATUS
----------------?------------------------------?----------?--------------------?--------------------?--------------------
PRIMARY??????????orcl_pd????????????????????????READ?WRITE?MAXIMUM?AVAILABILITY?MAXIMUM?AVAILABILITY?SESSIONS?ACTIVE
?
?
再比如,查詢failover后快速啟動的信息:
SQL>?SELECT?FS_FAILOVER_STATUS,FS_FAILOVER_CURRENT_TARGET,??FS_FAILOVER_THRESHOLD,??FS_FAILOVER_OBSERVER_PRESENT?FROM?V$DATABASE;
?
FS_FAILOVER_STATUS????FS_FAILOVER_CURRENT_TARGET?????FS_FAILOVER_THRESHOLD?FS_FAIL
---------------------?------------------------------?---------------------?-------
DISABLED?????????????????????????????????????????????????????????????????0
?
2)?查看當前REDO應用和REDO傳輸服務的活動狀態
查詢物理Standby數據庫當前REDO應用和REDO傳輸服務的狀態非V$MANAGED_STANDBY視圖莫屬,例如:
SQL>?SELECT?PROCESS,?STATUS,?THREAD#,?SEQUENCE#,?BLOCK#,?BLOCKS?FROM?V$MANAGED_STANDBY;
?
PROCESS???STATUS??????????THREAD#??SEQUENCE#?????BLOCK#?????BLOCKS
---------?------------?----------?----------?----------?----------
ARCH??????CLOSING???????????????1?????????78??????98305???????1752
ARCH??????CLOSING???????????????1?????????79??????98305???????1752
MRP0??????WAIT_FOR_LOG??????????1?????????80??????????0??????????0
RFS???????IDLE??????????????????1?????????80??????75297??????????3
RFS???????IDLE??????????????????0??????????0??????????0??????????0
RFS???????IDLE??????????????????0??????????0??????????0??????????0
?
3)?檢查應用模式(是否啟用了實時應用)
物理Standby數據庫查詢V$ARCHIVE_DEST_STATUS視圖,如果打開了實時應用,則RECOVERY_MODE列會顯示為:MANAGED?REAL?TIME?APPLY,例如:
SQL>?SELECT?RECOVERY_MODE?FROM?V$ARCHIVE_DEST_STATUS?WHERE?DEST_ID=2;
?
RECOVERY_MODE
-----------------------
MANAGED
?
4)?Data?Guard事件(V$DATAGUARD_STATUS)
該視圖顯示那些被自動觸發寫入Alert.log或服務器Trace文件的事件。通常是在你不便訪問到服務器查詢Alert.log時,可以臨時訪問本視圖查看一些與Data?Guard相關的信息,例如:
SQL>?SELECT?MESSAGE?FROM?V$DATAGUARD_STATUS;
?
MESSAGE
---------------------------------------------------------------------------------------------------
ARC0:?Archival?started
ARC1:?Archival?started
ARC0:?Becoming?the?'no?FAL'?ARCH
ARC0:?Becoming?the?'no?SRL'?ARCH
ARC1:?Becoming?the?heartbeat?ARCH
Attempt?to?start?background?Managed?Standby?Recovery?process
MRP0:?Background?Managed?Standby?Recovery?process?started
Managed?Standby?Recovery?not?using?Real?Time?Apply
Clearing?online?redo?logfile?1?/u01/app/oracle/oradata/orcl/redo01.log
Clearing?online?redo?logfile?1?complete
Media?Recovery?Waiting?for?thread?1?sequence?74
?
?
10.2.7??調整物理Standby端REDO數據應用頻率
調整應用頻率,說白了就是調整I/O讀取能力,所以通常我們從以下幾個方面著手:
1)設置RECOVER并行度
在介質恢復或REDO應用期間,都需要讀取重做日志文件,默認都是串行恢復,我們可以在執行RECOVER的時候加上PARALLEL子句來指定并行度,提高讀取和應用的性能,例如:
SQL>?RECOVER?STANDBY?DATABASE?PARALLEL?2?;?
?
提?示:?建議PARALLEL的值為#CPUs×2。
注意:?該設置僅對當前環境有效,Oracle數據庫重啟之后,默認情況下并行度會恢復至初始值,如果DBA覺著每次執行很麻煩,要通過初始化參數PARALLEL_MAX_SERVERS來設置默認的并行度。
?
2)?加快REDO應用頻繁
設置初始化參數DB_BLOCK_CHECKING=FALSE能夠提高2倍左右的應用效率,該參數設置是否驗證數據塊的有效性,對于物理Standby數據庫,禁止驗證基本上還是可以接受的(Primary數據庫強烈建議將該參數值設置為TRUE,當然默認就是TRUE),該參數是一個動態參數,修改后直接生效,不需要重啟數據庫。
?
3)?設置PARALLEL_EXECUTION_MESSAGE_SIZE參數值
如果打開了并行恢復,適當提高初始化參數PARALLEL_EXECUTION_MESSAGE_?SIZE的參數值,比如4096也能提高大概20%左右的性能,不過需要注意,增大這個參數的參數值可能會占用更多內存。
?
4)?優化磁盤I/O
在恢復期間最大的瓶頸就是I/O讀寫,要緩解這個瓶頸,使用本地異步I/O并設置初始化參數DISK_ASYNCH_IO=TRUE會有所幫助。DISK_ASYNCH_IO參數控制到數據文件的磁盤I/O是否異步。某些情況下異步I/O?能降低數據庫文件并行讀取,提高整個恢復時間。
?
?
?
?
注:?整理自?李丙洋《涂抹Oracle》
轉載于:https://www.cnblogs.com/tianlesoftware/archive/2010/05/04/3610163.html
總結
以上是生活随笔為你收集整理的Oracle Data Gurad Physical Standby 相关说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下一代Android或官方支持“App2
- 下一篇: SqlServerCe 数据库操作示例