oracle 容災 DG(Data Guard)的搭建過程

1.什麼是Data GuardDG?

備用數據庫(Standby Database),從Oracle9i開始也叫做Data Guard,是Oracle推出的一種高可用性(High Available)數據庫解決方案,其主要的目標是Oracle數據庫層面的數據保護以及容災方案。主要組成部分爲一個在線的生產數據庫(或者是RAC集羣),我們一般叫做Primary;以及一個在線備用數據庫(或者是RAC集羣),我們一般叫做StandbyPrimaryStandby之間通過日誌同步來保證數據的同步和熱備,備用節點是是一種隨時處在database recovery的狀態應用主節點傳輸過來的日誌,並且隨時保持active的狀態以備隨時切換與災難恢復。從9i開始正式更名爲Data Guard,開始支持三種不同的數據保護模式,並可以採用LGWR/LNSn而不僅僅是以往的ARCH對數據進行傳送,並增加了一個叫做DMON的後臺進程進行監控。支持多大9standby同事複製。

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 logwaiting for log這兩個狀態來回切換。因爲primarystandby是物理上面兩個完全獨立的數據庫,所以遠沒有RAC那麼複雜,理論上面只要兩個庫能夠相互tnsping通,再加上一些配置就可以了。


9i開始,既可以傳送歸檔日誌,也可以直接傳送聯機日誌,如果是傳輸的歸檔日誌則有ARCn進程負責,如果是連接日誌,Oracle10g以前是由LGWR負責傳送,Oracle10g以後是完全由LNSn進程負責傳送。日誌的接受工作由standby端的RFS進程完成。standbylog apply工作可以手工完成,或者是物理standbyMRP進程完成的,邏輯standbylog apply是有LSP進程完成的。

如果採用聯機日誌的方式傳送,那麼建議在standby創建一組備用日誌(standby log),並保持與primary的日誌組大小一致。如果採用聯機日誌方法傳送,但是不在standby創建standby log的話,聯機日誌將會自動寫到standby的歸檔日誌中,如果在創建standby 控制文件的時候,maxlogfiles參數指定過小的話,會影響到standby log的創建,這種情況下必須重新創建控制文件。

5.決定standby的一些參數是哪些?

db_file_name_convert primarystandby數據文件的轉換目錄映射關係,如果目錄結構一致就可以省略。)
應用舉例:*.db_file_name_convert='/opt/oracle/oradata/dwapp_primary','/opt/oracle/oradata/dwapp_standby'

log_file_name_convert primarystandby日誌文件的轉換目錄映射關係,如果目錄結構一致就可以省略。)
應用舉例:*.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'

compatibleOracle兼容版本,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_pstandby=dwapp_s
db_name
(指定數據庫全局統稱,primarystandby對外界而言都是同一個)

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;(已經有了)


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章