2007年08月2日

Oracle 9iR2 online create dataguard

os: rhce 4.0
oracle: 9iR2

目標: 大多數的資料都是需要停止db的運作才建置起data guard的,但真實情況中,大多數的企業中是不太能忍受長時間的停止運作
           為了符合現實情況,這次需要二個pc來完成所需要的環境

作用: 做異地備援、縮短移轉機器的停止運作時間


我所用到的vmware的環境
角色 sid 版本 ip
primary binhu 9iR2 192.168.200.101
sandby binhu 9iR2 192.168.200.102
catalog rman10g 10g 192.168.200.101
我的catalog db是使用10g的版本,並且是跟primary的機器放同一台上面




1、先建置初始環境
一、分別在二台機器的os上建置oracle,在primary上需建立二個資料庫,分別為data guard測試用的db跟catalog用的db
二、在做standby的機器上只要建置oracle就夠了,不需要建置資料庫
三、設定機器的ip到 /etc/hosts 裏面
四、二台機器上的目錄都是相同的
五、primary db必需是archive mode


2、primary需要的設定
一、先設定網路相關的
listener.ora

LOG_DIRECTORY_LISTENER = /u01/app/oracle/product/9.2.0/network/log

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.101)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = binhu)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (SID_NAME = binhu)
    )
  )



tnsnames.ora

NB_BINHU =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.101)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = binhu)
    )
  )
#ip是指primary


SNB_BINHU =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.102)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = binhu)
    )
  )
# ip是standby

rman10g =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.101)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rman10g)
    )
  )


二、primary parameter 的內容
*.aq_tm_processes=1
*.background_dump_dest='/u01/app/oracle/admin/binhu/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/binhu/control01.ctl','/u01/app/oracle/oradata/binhu/control02.ctl','/u01/app/oracle/oradata/binhu/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/binhu/cdump'
*.db_block_size=4096
*.db_cache_size=102760448
*.db_domain=''
*.db_file_multiblock_read_count=8
*.db_name='binhu' --預設值
*.dispatchers='(PROTOCOL=TCP) (SERVICE=binhuXDB)'
*.fal_client='NB_BINHU'  --指自已的機器
*.fal_server='SNB_BINHU'  --指standby的機器
*.fast_start_mttr_target=300
*.hash_join_enabled=FALSE
*.instance_name='binhu' --預設值
*.java_pool_size=20971520
*.job_queue_processes=10
*.large_pool_size=19922944
*.log_archive_dest='' --這是空白
*.log_archive_dest_1='location=/u01/arch' --設定本機archive log的目錄
*.log_archive_dest_2='service=snb_binhu' --設定standby機器,這時是會查tnsnames.ora的設定值,所以一定要設對
*.log_archive_dest_state_2='ENABLE' --在standby機器還沒有好之前是設defer
*.log_archive_start=TRUE
*.open_cursors=300
*.pga_aggregate_target=45088768
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=33554432
*.sort_area_size=524288
*.standby_archive_dest='/u01/arch' --設定standby 的archive log的目錄,為了日後機器角色交換方便,可以先設定
*.standby_file_management='AUTO' --我是讓oracle自動管理archive log file 傳送的流程
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=900
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/binhu/udump'


3、standby  相關設定
一、密碼檔:
預設檔案是在 $ORACLE_HOME/dbs/orapw<$ORACLE_SID>
看你是要把primary上的orapw<$ORACLE_SID>檔  copy到standby機器上的相同目錄下,不然也可去orapw指立去建立

二、
pfile parameter 的內容(是跟primary相同,但有一些地方要特別注意,fal_cline、fal_server的參數一定要設定, log_archive_dest_state_2的值為'DEFER'(primary值為enable),裏面所用到的目錄都需要全建立起來跟給於 oracle能讀寫的權限。簡單的說,把環境用成二台都相同
*.aq_tm_processes=1
*.background_dump_dest='/u01/app/oracle/admin/binhu/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/binhu/control01.ctl','/u01/app/oracle/oradata/binhu/control02.ctl','/u01/app/oracle/oradata/binhu/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/binhu/cdump'
*.db_block_size=4096
*.db_cache_size=102760448
*.db_domain=''
*.db_file_multiblock_read_count=8
*.db_name='binhu'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=binhuXDB)'
*.fast_start_mttr_target=300
*.hash_join_enabled=FALSE
*.instance_name='binhu'
*.java_pool_size=20971520
*.job_queue_processes=10
*.large_pool_size=19922944
*.log_archive_dest=''
*.log_archive_dest_1='location=/u01/arch'
*.log_archive_dest_2='service=snb_binhu'
*.log_archive_dest_state_2='DEFER'
*.log_archive_start=TRUE
*.open_cursors=300
*.pga_aggregate_target=45088768
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=33554432
*.sort_area_size=524288
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=900
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/binhu/udump'
*.fal_server=snb_binhu
*.fal_client=nb_binhu
*.standby_file_management='AUTO'
*.standby_archive_dest='/u01/arch'

三、網路設定
listener.ora

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = binhu)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (SID_NAME = binhu)
    )
  )
LOG_DIRECTORY_LISTENER=/u01/app/oracle/product/9.2.0/network/log

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.102)(PORT = 1521))
      )
    )
  )


tnsnames.ora

nb_binhu =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.102)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = binhu)
    )
  )
# 這時的ip是指standby自已的ip哦,可別指錯了

snb_binhu =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.101)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = binhu)
    )
  )
#這時的ip是指primary的ip哦,別指錯了


rman10g =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.101)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rman10g)
    )
  )


4、準備primay的rman備份跟搬到standby機器上
1、rman  sys/oracle@nb_binhu catalog  binhu/oracle@rman10g
2、backup full format '/u01/backup/full_%u_%s_%p' database include current controlfile for standby  plus archivelog;
(我本來是用 plus archive delete all input的,但最後面老是回報少一個archive log檔,所以我就手動再搬一次archive log檔到 standby機器上)
3、把備份好的檔案放上standby機器上
4、把parimary上的archive的檔 copy一份到standby對應的目錄裏
scp /u01/arch/*  oracle@snb_binhu:/u01/arch/.

5、
開起二台的listener,並且用tnsping看是否能正常回應

6、開始做standby db了
登到standby機器上,使用修改過的pfile內容開到nomount
SQL> startup  nomount pfile='/tmp/pfile';
SQL> exit
一定要離開,不然有可能會發生lock的情況發生

要做duplicate的動作了
rman target sys/oracle@snb_binhu  catalog binhu/oracle@rman10g  auxiliary sys/oracle@nb_binhu
(在執行之前你要確定primary上面的archive log 檔案都有 copy到standby機器上了,不然到最後執行dorecover時將產生錯誤,執行的log就不貼了,因為很長=.=")
RMAN> duplicate target  database  for standby  nofilenamecheck dorecover;
RMAN>exit

7、開始驗證
進standby資料庫
SQL> select dbid from v$database; --這時的dbid值將跟primary上面的相同
SQL>select status from v$instance; --這時應該是在mount
SQL>alter database recover managed standby database disconnect; --9i 只能開到recover的狀態
這時可看alter log的資料,應該會出現等待primary的archive log檔送過來的訊習才對
Tue Jul 31 23:41:56 2007
Completed: alter database recover managed standby database di
Tue Jul 31 23:42:25 2007
Media Recovery Log /u01/arch/1_53.dbf
Media Recovery Waiting for thread 1 seq# 54
Tue Jul 31 23:43:13 2007
Restarting dead background process QMN0
QMN0 started with pid=9



登到primary的機器

SQL> alter system set  log_archive_dest_state_2=ENABLE; --開起data guard 的運作
在alter log裏應該可看到開始傳送primary跟standby機器之間相差的archive log檔的訊習
Tue Jul 31 23:40:40 2007
ALTER SYSTEM SET log_archive_dest_state_2='ENABLE' SCOPE=BOTH;
Tue Jul 31 23:42:23 2007
Thread 1 advanced to log sequence 54
  Current log# 2 seq# 54 mem# 0: /u01/app/oracle/oradata/binhu/redo02.log
Tue Jul 31 23:42:23 2007
ARC1: Evaluating archive   log 1 thread 1 sequence 53
ARC1: Beginning to archive log 1 thread 1 sequence 53
Creating archive destination LOG_ARCHIVE_DEST_2: 'snb_binhu'
Creating archive destination LOG_ARCHIVE_DEST_1: '/u01/arch/1_53.dbf'
ARC1: Completed archiving  log 1 thread 1 sequence 53
Tue Jul 31 23:43:31 2007
create tablespace t2 datafile '/u01/app/oracle/oradata/binhu/t2.dbf' size 1M
Tue Jul 31 23:43:32 2007
Starting control autobackup
Control autobackup written to DISK device
        handle '/u02/backup/c-649538103-20070731-08'
Completed: create tablespace t2 datafile '/u01/app/oracle/ora


如alter log中都沒有看到錯誤訊習的話,那就可以建立一些資料測看看了,範列如下:

1、在primary建立一個tablespace,看standby的機器上是否有建立起對應的檔案
2、可在primary上新增一些資料,然後手動執行 alter system switch logfile / alter system archive log current都可
如沒有錯誤的話,應該可看到standby也會增加archive log file
3、如standby機器要查看資料的話,需要注意

 
小結:
1、確定二台的環境、os、oracle、路行都相同,就可由上列最簡單的方法實做
2、oracle必需要為archive log mode
3、要確認網路的設定要正確
4、standby要有必要的archive log file,不然會在log中一直看到需要recvoer


心得:
利用rman來做data guard的很方便,如移轉db沒有很長的down time的話,可考慮這種方法移轉db






Posted by my_work at 樂多Roodo! │21:15 │回應(4)引用(0)DB
樂多分類:網路/3C 共同主題:Oracle 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/3853715
回應文章
您好:
第一次使用rman 做備份,很陌生。
目前接了一個孤兒db,其init檔除primary裡只設fal_client, 而standby 裡只設 fal_server的設定外,其餘都跟您上述大至一樣。
以該架構而言,是否要做到duplicate的動作,才真的有standby 同步 ?
另crosscheck 是否只做到archive 同步? 真要standby 機on為primary還是要再做duplicate?
很唐突的問題,不好意思!!anywhere 謝謝!!
Posted by 小姐姐 at 2008年06月18日 11:38

我不太了解你所說的東西呢?standby是否有跟primary同步,跟做duplicate沒有什關連。
你現在是要做data guard嗎?還是要做????
Posted by 睡貓 at 2008年06月18日 13:28
說明一下目前的狀況: 9i
primary 及standby init 檔除primary裡只設fal_client, 而standby 裡只設 fal_server的設定外,其餘設定類似上述。
由於archive log 佔空間,standby 的archive log 被刪除,後做了crosscheck的作業後,發現standby 又自行產生了log , 而且 primary裡產生 :
ARC0: Complete FAL archive (thread 1 sequence 1929 destination standby)
ARC0: Begin FAL archive (thread 1 sequence 1931 destination standby)
Creating archive destination LOG_ARCHIVE_DEST_2: 'standby'

想確認的是:
1. 對data guard 的觀念很糢糊,是否已做了data guard 了?
2. duplicate 是否在初建data guard 時才需用到?
3. 後續的archive log如何維護?
再次感激!! 謝謝!!
Posted by 小姐姐 at 2008年06月18日 14:31

1、看一下設定檔,並進入oracle中查看一下狀態,就知道他們對應的參數是否有設錯
2、並不需要,也可offline方式建置,只是我的方式不必停機,較符合企業環境
3、9i我沒有建過data guard呢,不過10g是會自動去檢查是否有少的archive log檔。有一個table是記錄有些archive log檔是否還沒有同步,大陸有很多安裝手冊,都有提到,請先找看看了
Posted by 睡貓 at 2008年06月18日 16:12