Oracle 11g Data Guard (physical standby - active dataguard) [final]

tolywang發表於2010-09-02


Oracle 11g Data Guard


與Production DB同一臺Server上建立Standby庫,production db的名稱為
test11g,  Standby庫名為teststby .  使用RMAN duplicate來建立standby
系統。 透過DBCA已經建立了一個teststby的庫結構(作為standby DB)。

備註: 不同Server建立的話,可以建立相同DBNAME,SID的例項, 只是引數配置
時候db_unique_name 不同即可 。


1. 連線Produciton DB, 做RMAN 備份, 採用nocatalog方式 。
dbtest$mkdir backup
dbtest$rman target  / 

RMAN> backup device type disk format  '/data/backup/%U'  database plus archivelog ;
RMAN> backup device type disk format  '/data/backup/%U' current controlfile for standby ;


2. 連線Standby DB, 複製備份集到相關目錄,這裡由於在同一個Server上,
也使用上面的備份目錄 /data/backup , 所以備份檔案不用複製。

 

3. 在Standby機器上tnsnames.ora中加入連線primary db的別名test11g, 用於RMAN
duplicate 在standby上恢復時候的遠端連線別名 .

TEST11G =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.161.24.133)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test11g)
    )
  )


4. 注意建立Standby需要保持primary與Standby庫中的sys使用者密碼一致,一般我們
可以複製orapwSID檔案,也可以重建一個orapwd, 注意這裡我們在同一個server上,
sid是不一樣的。 這裡為了方便,可以直接修改兩個庫的sys密碼。如果sys密碼不記得,
可以更改密碼,也可以乾脆兩庫都重建也行  。

$ orapwd  file=orapwtest11g  password=sys  ignorecase=y 
$ orapwd  file=orapwteststby  password=sys  ignorecase=y 

備註: 密碼不一樣或檔名問題可能導致後面redo傳輸不能成功 。

 


5. 由於primary及standby庫中的datafile檔案位置不一致,那麼我們需要對Standby庫
的spfile進行調整及引數配置,比如db_file_name_convert, log_file_name_convert。
Standby DB上的引數修改如下(其他相關引數在建立standby完畢後配置):

*.audit_file_dest='/u01/product/admin/teststby/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/data/teststby/control01.ctl','/u01/product/flash_recovery_area/teststby/control02.ctl'
*.db_block_size=16384
*.db_domain=''
*.db_name='test11g'
*.db_unique_name='teststby'
*.global_names=TRUE
*.db_recovery_file_dest='/u01/product/flash_recovery_area'
*.db_recovery_file_dest_size=5218762752
*.diagnostic_dest='/u01/product'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=teststbyXDB)'
*.log_archive_dest_1='LOCATION=/data/teststby/arch'
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=209715200
*.processes=400
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=445
*.sga_target=629145600
*.undo_tablespace='UNDOTBS1'
*.standby_file_management='AUTO' 
*.db_file_name_convert='/data/test11g/','/data/teststby/'
*.log_file_name_convert='/data/test11g/','/data/teststby/'

然後使之在standby庫上生效:
SQL>  shutdown immediate 
SQL> create spfile from pfile='/u01/initstby.ora' ;

 

6.  在Standby上,進入到存放備份集的/data/backup目錄,如果primary及
standby是同一個server, 那麼需要切換ORACLE_SID到standby sid, 然後準備
開始恢復RMAN備份集到Standby 。 首先將Standby庫置為nomount模式,然後
進行standby庫的建立 :

SQL> startup nomount ; 

dbtest$rman target    auxiliary /

Recovery Manager: Release 11.2.0.1.0 - Production on Tue Aug 31 17:41:56 2010
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: TEST11G (DBID=879780823)
connected to auxiliary database: TEST11G (not mounted)

RMAN> duplicate target database for standby nofilenamecheck;

 


7. 完成後,在Standby 上alert log或透過查詢v$database中的open_mode欄位
可以看到standby上的庫處於mounted狀態。

SQL> select  open_mode from v$database;

OPEN_MODE
--------------------
MOUNTED

 

8. 我們複製後期的一些歸檔到standby對應的歸檔目錄,手工進行恢復測試。

dbtest$cp 1_9*  1_10*  /data/teststby/arch/
SQL> recover standby database;

 


9. 開始設定自動傳輸歸檔檔案進行恢復的引數。

首先,在primary db上設定引數 (需要先在primary 上tnsnames.ora中設定連線
到standby的別名standby):

standby =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = teststby)
    )
  )


primary下引數修改如下: 

(備註: ARCH模式的歸檔傳輸在11g中不是預設方式,11g中的預設是LGWR, 所以我們需要
在 *.log_archive_dest_2 屬性中加入 ARCH , 還有
*.log_archive_config='DG_CONFIG=(test11g,teststby)' 引數要麼在priamry及standby
上都加上,要麼都不加入,否則會有問題 。)


*.log_archive_config='DG_CONFIG=(test11g,teststby)'  
   -- 其中的test11g 及 teststby 分別代表primary及standby上的db_unique_name .
*.db_name='test11g' 
*.db_unique_name='test11g' 
*.log_archive_dest_1='location=/data/test11g/arch valid_for=(all_logfiles,all_roles)  db_unique_name=test11g'
*.log_archive_dest_2='service=standby ARCH valid_for=(online_logfiles,primary_role) db_unique_name=teststby'
*.log_archive_dest_state_1='enable'  
*.log_archive_dest_state_2='enable'  
    /*以下部分為主機切換為備庫使用,如果不需要可以不設定*/
*.fal_server=standby
*.fal_client=primary
*.standby_file_management=auto
      #如果主備庫檔案或路徑不同
*.db_file_name_convert='/data/test11g/','/data/teststby/'
*.log_file_name_convert='/data/test11g/','/data/teststby/'

重新啟動DB使之生效 。 

 


10.  然後在standby db上設定引數 (如果需要switch角色,需要先在Standby上
tnsnames.ora中設定連線到primary的別名primary): 

primary =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test11g)
    )
  )


Standby db上引數修改如下: 

*.db_name='test11g'
*.db_unique_name='teststby'  
*.log_archive_config='DG_CONFIG=(test11g,teststby)'  
*.log_archive_dest_1='location=/data/teststby/arch  valid_for=(all_logfiles,all_roles) db_unique_name=teststby'
*.log_archive_dest_2='service=primary ARCH valid_for=(online_logfiles,primary_role) db_unique_name=test11g'   
      --備庫中log_archive_dest_2可以不用設定,主要用於主庫備庫切換  
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'  
*.log_archive_min_succeed_dest=1  
*.standby_file_management='AUTO' 
 
*.fal_server='primary'   -- 在tnsnames.ora 中的服務名 
*.fal_client='standby'   -- 在tnsnames.ora 中的服務名

       --- 以下兩引數是為了切換用,如果後期不需要switch, 可以不用設定
*.db_file_name_convert='/data/teststby/','/data/test11g/'
*.log_file_name_convert='/data/teststby/','/data/test11g/'

備註: 10G下的standby_archive_dest 引數在11g中已經廢棄 。

 

11. 在Standby上是修改的引數生效,並開啟為 managed standby 模式 :

SQL> create spfile from pfile='/u01/initstby.ora';

SQL> startup nomount
SQL> alter database mount standby database;

SQL> alter database recover managed standby database disconnect from session ;


測試是否APPLY LOG正常,在Primary DB上 SQL> alter system switch logfile;
檢視是否在standby上log_archive_dest_1 對應的目錄下有相應的歸檔 。然後在alert log
中檢視是否已經恢復 。還可以在primary 中檢視 v$archive_dest 中的狀態值。 


至此,常規的物理Standby配置成功。下面我們準備開始設定11g的active data guard,使
之能夠open read only的同時可以進行apply log . 這裡假設還是以ARCH模式傳輸歸檔。

 


12 .  在Standby庫中,11g 以只讀開啟庫應用日誌:

SQL> select open_mode from v$database;
OPEN_MODE
--------------------
MOUNTED

SQL> recover managed standby database cancel; 
SQL> alter database open read only;
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY

SQL> alter database recover managed standby database disconnect from session;

SQL> select open_mode from v$database; 
OPEN_MODE
--------------------
READ ONLY WITH APPLY 


測試在stamdby恢復的時候進行查詢(可以使查詢及恢復持續進行觀察):
SQL> select * from tony.test2 ; 


成功..... 

 

-----------

 

13. 下面我們測試最大資料保護和最大可用性模式,採用lgwr非同步傳輸歸檔的情況。

需要修改原來的在primary上的ARCH最大效能保護模式為現在的LGWR非同步傳輸(ASYNC)
模式來進行 APPLY LOG .  我們在原來arch模式下進行修改。

首先要在standby上加入standby redo logfile. standby redo日誌檔案組數要
比primary 資料庫的online redo 日誌檔案組數至少多一組, 且與primary db上的
online redo log大小要一致 。如果後期想主備庫相互切換的話,在主庫及備庫上
都要加入standby redo logfile, 這裡我們兩邊都加入。

建議:
Standby redo log 組數公式>=(每個instance日誌組個數+1)*instance個數

Oracle文件原文是:
(maximum number of logfiles for each thread + 1) * maximum number of threads

 

14. 先在standby一端加入,由於primary db中有3組online redo, 這裡standby上的
standby redo log (注意不是online redo log哦) 加入4組 (單機,不是RAC, 只有
一個例項): 注意group的編號。

SQL> recover managed standby database cancel;

alter database add standby logfile group 10 ('/data/teststby/standbyredo10.dbf') size 50m ;
alter database add standby logfile group 11 ('/data/teststby/standbyredo11.dbf') size 50m ;
alter database add standby logfile group 12 ('/data/teststby/standbyredo12.dbf') size 50m ;
alter database add standby logfile group 13 ('/data/teststby/standbyredo13.dbf') size 50m ;


在priamry DB段修改引數log_archive_dest_2 : 
alter system set log_archive_dest_2='service=standby LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=teststby';

在standby DB段修改引數(如果這個可選引數有設定的話):
alter system set log_archive_dest_2='service=primary LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=test11g'; 

然後將備庫standby置於實時日誌應用與查詢模式。
SQL> alter database recover managed standby database using current logfile disconnect;

SQL> select open_mode from v$database; 
OPEN_MODE
--------------------
READ ONLY WITH APPLY

備註: 使用using current logfile 應用日誌是當日志傳到standby redo log的時候就去應用,
是real-time的,必須要有standby redo log。而沒有using current logfile是去apply standby
archived log.

 

15.  最後在primary db上加入standby redo logfile, 這一步是可選步驟,主要是為
主備庫相互切換。

alter database add standby logfile group 10 ('/data/test11g/standbyredo10.dbf') size 50m ;
alter database add standby logfile group 11 ('/data/test11g/standbyredo11.dbf') size 50m ;
alter database add standby logfile group 12 ('/data/test11g/standbyredo12.dbf') size 50m ;
alter database add standby logfile group 13 ('/data/test11g/standbyredo13.dbf') size 50m ;

透過V$STANDBY_LOG檢視驗證standby redo log檔案組是否成功建立 .

 


16.  啟用物理Standby和啟用9i,10g的一樣(注意啟用後修改引數及temp表空間)。
SQL> recover managed standby database cancel;
SQL> alter database activate standby database;
SQL> alter database open ; 
SQL> shutdown immediate ; 
SQL> startup ; 

備註: 監聽檔案一般格式如下,一旦啟用standby後,如果SID與primary 庫不一致,可能
導致需要更改大量客戶端tnsnames.ora檔案,我們可以設定啟用後的standby 中的global_dbname,
使之與primary DB的SID(也就是客戶端設定的SERVICE_NAME)一致 。

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/product/oracle)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = teststby)
      (ORACLE_HOME = /u01/product/oracle)
      (GLOBAL_DBNAME = test11g)     ------ 修改這裡的teststby為test11g即可。
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.161.24.133)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

 

17.  primary 及standby的swith over 用的比較少,這裡簡單介紹一下 。

具體切換的順序:先從主庫到備用,再從備庫到主庫

確保兩庫引數配置ok, primary是open, standby是mount狀態,及沒有活動會話。
在primarydb上:
SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
TO STANDBY

切換為standby :

SQL> alter database commit to switchover to physical standby with session shutdown;
然後shutdown,  開啟為standby模式。


然後登陸standby DB, 同樣select switchover_status from v$database;
SQL> alter database commit to switchover to physical primary;
SQL> alter database open ;  

登陸現在的standby庫:
SQL>  alter database recover managed standby database disconnect from session ;   

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-672479/,如需轉載,請註明出處,否則將追究法律責任。

相關文章