1.什麼是Data Guard(DG)?
備用數據庫(Standby Database),從Oracle9i開始也叫做Data Guard,是Oracle推出的一種高可用性(High Available)數據庫解決方案,其主要的目標是Oracle數據庫層面的數據保護以及容災方案。主要組成部分爲一個在線的生產數據庫(或者是RAC集羣),我們一般叫做Primary;以及一個在線備用數據庫(或者是RAC集羣),我們一般叫做Standby。Primary與Standby之間通過日誌同步來保證數據的同步和熱備,備用節點是是一種隨時處在database recovery的狀態應用主節點傳輸過來的日誌,並且隨時保持active的狀態以備隨時切換與災難恢復。從9i開始正式更名爲Data Guard,開始支持三種不同的數據保護模式,並可以採用LGWR/LNSn而不僅僅是以往的ARCH對數據進行傳送,並增加了一個叫做DMON的後臺進程進行監控。支持多大9個standby同事複製。
2.保護模式有哪些分類?
A. maxmize protection,最大保護模式,沒有數據丟失,沒有數據分歧。LGWR/LNSn將同時傳送到備用節點,在主節點事務提交之前,備用節點也必須收到全部日誌數據。如果網絡不好,沒有傳送到將會引起嚴重的性能問題,導致主節點宕機。
B. maxmize availability,最大可用模式,沒有數據丟失,允許數據分歧,允許異步傳送。正常情況一般運行在該模式下,主節點與被節點由於網絡原因不能夠通信時候,將自動切換到最大性能模式運行,主節點的操作繼續。
C. maxmize performance,最大性能模式。異步傳送日誌,無數據同步檢查,可能丟失數據,但是能夠獲得主節點的最佳性能。9i的默認模式。
3.物理架構以及功能分佈是?
在DG方案中,理論上至少需要兩臺主機,兩套存儲。用於搭建邏輯上和物理上完全一致的DB,如果不是接管需要,standby可以比primary配置低一些。與RAC不同的是DG一般只有一個節點是active的,只有當主機發生故障的時候,才考慮切換到備用服務器。備用服務器一般不提供讀寫操作(因爲通常狀況下都是recover standby狀態,該狀態是沒有open的)。只有需要的時候才提供只讀的報表查詢服務,或者檔主站點出現故障的時候,經過一定的切換條件,才轉變爲主數據庫,提供正常服務。
4.DG的內部實現原理是?
物理standby其實就是採用的oracle備份恢復的原理實現的,不過是把很多操作封裝起來並且做成自動化處理過程而已。可以把standby數據庫看成是一個在不斷恢復中的數據庫,因爲他不知道歸檔日誌什麼時候結束。因爲運行中的primary永遠沒有結束業務,所以會不斷的長生日誌,所以standby就會會永遠在apply log和waiting for log這兩個狀態來回切換。因爲primary、standby是物理上面兩個完全獨立的數據庫,所以遠沒有RAC那麼複雜,理論上面只要兩個庫能夠相互tnsping通,再加上一些配置就可以了。
從9i開始,既可以傳送歸檔日誌,也可以直接傳送聯機日誌,如果是傳輸的歸檔日誌則有ARCn進程負責,如果是連接日誌,Oracle10g以前是由LGWR負責傳送,Oracle10g以後是完全由LNSn進程負責傳送。日誌的接受工作由standby端的RFS進程完成。standby的log apply工作可以手工完成,或者是物理standby的MRP進程完成的,邏輯standby的log apply是有LSP進程完成的。
如果採用聯機日誌的方式傳送,那麼建議在standby創建一組備用日誌(standby log),並保持與primary的日誌組大小一致。如果採用聯機日誌方法傳送,但是不在standby創建standby log的話,聯機日誌將會自動寫到standby的歸檔日誌中,如果在創建standby 控制文件的時候,maxlogfiles參數指定過小的話,會影響到standby log的創建,這種情況下必須重新創建控制文件。
5.決定standby的一些參數是哪些?
db_file_name_convert (primary,standby數據文件的轉換目錄映射關係,如果目錄結構一致就可以省略。)
應用舉例:*.db_file_name_convert='/opt/oracle/oradata/dwapp_primary','/opt/oracle/oradata/dwapp_standby'
log_file_name_convert (primary,standby日誌文件的轉換目錄映射關係,如果目錄結構一致就可以省略。)
應用舉例:*.log_file_name_conver='/opt/oracle/oradata/dwapp_primary','/opt/oracle/oradata/dwapp_standby'
log_archive_dest_n (備用數據庫歸檔的存放路徑,primary端和standby端的配置有所不同,這個參數比較重要。)
應用舉例(主):*.log_archive_dest_1='location=/oracle/arch/dwapp valid_for=(all_logfiles,all_roles) db_unique_name=dwapp_p'
應用舉例(備):*.log_archive_dest_2='service=dwapp_s lgwr sync net_timeout=50 valid_for=(online_logfiles,primary_role) db_unique_name=dwapp_s'
compatible(Oracle兼容版本,standby的版本號必須大於或者等於primary,如果想要來回切換,兩者必須一致)
應用舉例:compatible=10.2.0.3.0
fal_server(指明自動日誌同步的源頭庫的tnsname) fal_server = dwapp_p
fal_client (指明自動日誌同步的目標庫的tnsname) fal_client = dwapp_s
standby_file_management(可以自動同步數據文件,在auto模式下,primary創建數據文件的時候,standby也會自動創建,如果設置manual模式,則不會,可以動態修改)
應用舉例standby_file_management=auto|manual
db_unique_name(指定數據庫的唯一全局名稱,每個單獨的物理庫一個。如primary= dwapp_p,standby=dwapp_s)
db_name(指定數據庫全局統稱,primary,standby對外界而言都是同一個)
log_archive_config(主備庫的tnsname配置列表)
應用舉例:log_archive_config='DG_CONFIG(dwapp_p,dwapp_s)'
6.實戰完整搭建過程?
A 確認爲歸檔模式
SQL>Startup mount;
SQL> alter database archivelog;
SQL> archive log list;
B確認主庫強制寫日誌
SQL> select force_logging from v$database;
(所有sql語句nologging操作時 也會強制寫日誌)
C 修改主備數據庫的參數文件(主庫)
SQL> alter database open;
SQL> create pfile from spfile;
[oracle@sql ~]$ cd /oracle/app/oracle/product/10.2.0/db_1/dbs/
[oracle@sql dbs]$ vim initTEST.ora (將spfile改名爲其他)
DB_UNIQUE_NAME=TEST --show parameter DB_UNIQUE_NAME確認主庫名稱
LOG_ARCHIVE_CONFIG='DG_CONFIG=(DB95,DB96)' --此處爲主庫網絡連接串(tnsnames.ora)
LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=TEST' --主庫的歸檔日誌路徑
LOG_ARCHIVE_DEST_2='SERVICE=DB96 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=TEST'
FAL_SERVER=DB95 --網絡異常恢復後自動將延遲的歸檔日誌傳輸到備庫,此處爲主庫網絡連接串(tnsnames.ora)
FAL_CLIENT=DB96
STANDBY_FILE_MANAGEMENT=AUTO (默認只傳遞數據,此作用主庫把新創建的數據文件也傳到備庫)
[oracle@sql ~]$ cd /oracle/app/oracle/product/10.2.0/db_1/network/admin/
[oracle@sql admin]$ vim tnsnames.ora
DB95 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.95)(PORT = 1521))
)
(CONNECT_DATA =
(SID = TEST)
)
)
DB96 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.96)(PORT = 1521))
)
(CONNECT_DATA =
(SID = TEST)
)
)
[oracle@sql admin]$ vim listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = TEST)
(ORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1)
(SID_NAME = TEST)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.96)(PORT = 1521))
)
[oracle@sql ~]$ mkdir /home/oracle/archive/
SQL> startup force; (重啓數據庫)
SQL> show parameter ARCHIVE(查看到剛纔配置的值生效了)
D 將主庫的pfile 傳到備庫(將備庫的spfile改名)
[oracle@sql dbs]$ vim initTEST.ora (添加下面幾行到pfile中)
DB_UNIQUE_NAME=TEST --show parameter DB_UNIQUE_NAME
LOG_ARCHIVE_CONFIG='DG_CONFIG=(DB95,DB96)'
LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=TEST'
LOG_ARCHIVE_DEST_2='SERVICE=DB95 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=TEST'
FAL_SERVER=DB96
FAL_CLIENT=DB95
STANDBY_FILE_MANAGEMENT=AUTO
修改傳輸文件和監聽文件並在主備上都開啓監聽
[oracle@sql ~]$ cd /oracle/app/oracle/product/10.2.0/db_1/network/admin/
[oracle@sql admin]$ vim tnsnames.ora
DB95 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.95)(PORT = 1521))
)
(CONNECT_DATA =
(SID = TEST)
)
)
DB96 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.96)(PORT = 1521))
)
(CONNECT_DATA =
(SID = TEST)
)
)
[oracle@sql admin]$ vim listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = TEST)
(ORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1)
(SID_NAME = TEST)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.95)(PORT = 1521))
)
[oracle@sql ~]$ sqlplus sys/123456 as sysdba (登錄數據庫)
SQL> startup nomount ; (開啓到nonount狀態)
E 確保主備數據庫兩邊的密碼文件中的密碼一致(保證主備數據庫之間通過tns網絡連接串能夠互相連通對方DB95上本地測試)
[oracle@sql dbs]$ scp orapwTEST 192.168.18.95:$ORACLE_HOME/dbs/ (在主庫上)
[oracle@sql ~]$ sqlplus sys/123456@DB96 as sysdba (在備庫上成功連接主庫)
F 遷移數據庫到備庫,一下RMAN操作全部在主庫上執行
[oracle@sql ~]$ mkdir db_bak
[oracle@sql ~]$rman target /
RMAN> backup full database format='/home/oracle/db_bak/%U' include current controlfile for standby;
傳輸備份片文件到備庫的相同備份目錄下
[oracle@sql ~]$mkdir /home/oracle/db_bak
[oracle@sql db_bak]$ scp * 192.168.18.95:/home/oracle/db_bak/
RMAN> connect auxiliary sys/123456@DB95 (95上,一定不要退出上次的RMAN連接)
RMAN> duplicate target database for standby nofilenamecheck;
G在主庫上查看進程
SQL> select process from v$managed_standby;
PROCESS
---------
ARCH
ARCH
沒有災備的進程
查看歸檔錯誤信息
SQL> select error from v$archive_dest;
SQL> alter system switch logfile; (切換日誌組)
SQL> select process from v$managed_standby;
PROCESS
---------
ARCH
ARCH
LNS
(已經有了進程,lns傳輸進程)
H 在備庫查看
SQL> select process from v$managed_standby;
PROCESS
---------
ARCH
ARCH
RFS
RFS
(已經有了進程,rfs接收進程)
備庫具有恢復日誌進程,需要手動激活此進程
SQL> alter database recover managed standby database disconnect from session;
SQL> select process from v$managed_standby;
PROCESS
---------
ARCH
ARCH
RFS
RFS
MRP0
I 驗證
在主庫上
SQL> create table t01 as select * from dba_objects;
SQL> commit;
(主庫只有切換日誌時,備庫會同步,但主庫日誌變化備庫會記錄到歸檔日誌中)
SQL> alter system switch logfile;
在備庫上
SQL> alter database recover managed standby database cancel;
(備庫上,只有把恢復日誌進程取消,纔可以打開數據庫)
SQL> alter database open;
SQL> select count(*) from t01;(已經有了)