Oracle 11g Data Guard 使用duplicate from active database

us_yunleiwang發表於2013-12-04
Oracle 11g Data Guard 使用duplicate from active database 建立 standby databaseOracle 11g Data Guard 使用duplicate from active database 建立 standby database


            


 Oracle 11g的pyhsical standby 支援open read only 下的apply和Real-time query。 因此就有了physical standby 穩定和logical standby 的報表查詢功能。 


Oracle: 11.2.0.1
OS: redhat 5.5
Primary IP: 192.168.2.42
DB_NAME=orcl


Standby IP: 192.168.2.43
DB_NAME=orcl


一. Primary 端操作:
1. 設定歸檔模式
 這個生產庫都是這種模式。
 SQL> archive log list; 
 SQL> shutdown immediate 
 SQL> startup mount 
 SQL> alter database archivelog; 
 archive log list;
 
2. Primary 設定force logging
SQL> alter database force logging;
SQL> select force_logging from v$database;
FORCE_LOG
---------
YES


3. 配置Oracle Net
 在Primary 庫和Standby 都要修改。也可以使用netca 和netmgr命令配置。
注意:修改完後記得重啟listener。


Listener.ora
[oracle@qs-dmm-rh1 admin]$ cat listener.ora 
LISTENER =
 (DESCRIPTION_LIST =
 (DESCRIPTION =
 (ADDRESS = (PROTOCOL = TCP)(HOST = localhost6.localdomain6)(PORT = 1521))
 )
 )


ADR_BASE_LISTENER = /u01/app/oracle


SID_LIST_LISTENER = 
 (SID_LIST = 
 (SID_DESC = 
 (GLOBAL_DBNAME = orcl) 
 (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) 
 (SID_NAME = orcl) 
 ) 
 )
-- 配置靜態註冊 


tnsname.ora
[oracle@qs-dmm-rh1 admin]$ cat tnsnames.ora 
ORCL_ST =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.43)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVICE_NAME = orcl)
 )
 )


ORCL_PD =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.42)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVICE_NAME = orcl)
 )
 )




4. 新增data guard 引數
 建立pfile, 新增如下檔案:
SQL> create pfile from spfile;
*.db_name='orcl'
*.db_unique_name='orcl_pd' 
*.log_archive_config='dg_config=(orcl_pd,orcl_st)'
*.log_archive_dest_1='location=/u01/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=orcl_pd'
*.log_archive_dest_2='service=orcl_st reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcl_st'
*.log_archive_dest_state_1=enable 
*.log_archive_dest_state_2=enable 
*.standby_file_management='auto'
*.fal_server='orcl_st'
*.fal_client='orcl_pd'




注意:
 在Oracle 11g的Data Guard中,standby_archive_dest引數已經被取消了。
 
Standby歸檔檔案的存放位置按如下規則來進行:
(1)當LOG_ARCHIVE_DEST_n設定了valid_for=(all_logfiles,all_roles),那麼在不定義standby_archive_dest引數時,Oracle就會選擇LOG_ARCHIVE_DEST_n引數作為歸檔目標。
(2)如果在第一步設定的同時,又獨立設定LOG_ARCHIVE_DEST_n引數為 valid_for=(standby_logfile,*) 屬性,那麼當compatible引數大於10.0的時候,會自動的選擇任意一個LOG_ARCHIVE_DEST_n的值。
(3)如果LOG_ARCHIVE_DEST_n 沒有設定的話,預設位置是:
 $ORACLE_HOME/dbs.
 不過valid_for引數的預設值就是all_logfiles和all_roles. 所以只要設定了本地的歸檔位置,遠端的歸檔檔案也會放到這個目錄下面。


5. 用新pfile重啟主庫


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> create spfile from pfile='/u01/app/oracle/product/11.2.0/dbhome_1/dbs/initorcl.ora';
File created.
SQL> startup 
ORACLE instance started.


Total System Global Area 422670336 bytes
Fixed Size 1336960 bytes
Variable Size 310380928 bytes
Database Buffers 104857600 bytes
Redo Buffers 6094848 bytes
Database mounted.
Database opened.
SQL>




二. Standby 端設定:


1. 建立相關目錄結構
[oracle@qs-dmm-rh2 trace]$ mkdir -p /u01/app/oracle/oradata/dave
--這裡我們建立的目錄和Target 庫不同,我們在引數檔案裡需要轉換一下。


2. 建立standby的口令檔案
[oracle@qs-dmm-rh2 trace]$ orapwd file=?/dbs/orapwdave password=oracle


3. 建立standby的初始化引數:
*db_name=orcl
*.control_files='/u01/app/oracle/oradata/dave/control01.ctl', '/u01/app/oracle/oradata/dave/control02.ctl',
'/u01/app/oracle/oradata/dave/control03.ctl'
*.db_unique_name='orcl_st' 
*.log_archive_config='dg_config=(orcl_pd,orcl_st)'
*.log_archive_dest_1='location=/u01/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=orcl_st'
*.log_archive_dest_2='service=orcl_pd reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=orcl_pd'
*.log_archive_dest_state_1=enable 
*.log_archive_dest_state_2=enable 
*.standby_file_management='auto'
*.fal_server='orcl_pd'
*.fal_client='orcl_st'
*.log_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/dave'
*.db_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/dave'


4. 用pfile 將standby 啟動到nomount狀態:
SQL> startup nomount pfile=?/dbs/initorcl.ora
ORACLE instance started.


Total System Global Area 146472960 bytes
Fixed Size 1335080 bytes
Variable Size 92274904 bytes
Database Buffers 50331648 bytes
Redo Buffers 2531328 bytes


5. 開始duplicate 


[oracle@qs-dmm-rh2 dbs]$ rman target sys/oracle@orcl_pd auxiliary sys/oracle@orcl_st


Recovery Manager: Release 11.2.0.1.0 - Production on Tue Mar 8 16:10:25 2011


Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.


connected to target database: ORCL (DBID=1272955137)
connected to auxiliary database: ORCL (not mounted)


RMAN> duplicate target database for standby from active database;


Starting Duplicate Db at 08-MAR-11
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=20 device type=DISK


contents of Memory Script:
{
 backup as copy reuse
 targetfile '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapworcl' auxiliary format 
'/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapworcl' ;
--用duplicate 建立standby 時會複製口令檔案
}
executing Memory Script


Starting backup at 08-MAR-11
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=45 device type=DISK
Finished backup at 08-MAR-11


contents of Memory Script:
{
 backup as copy current controlfile for standby auxiliary format '/u01/app/oracle/oradata/dave/control01.ctl';
 restore clone controlfile to '/u01/app/oracle/oradata/dave/control02.ctl' from 
'/u01/app/oracle/oradata/dave/control01.ctl';
 restore clone controlfile to '/u01/app/oracle/oradata/dave/control03.ctl' from 
'/u01/app/oracle/oradata/dave/control01.ctl';
--建立控制檔案
}
executing Memory Script


Starting backup at 08-MAR-11
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
copying standby control file
output file name=/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_orcl.f tag=TAG20110308T161152 RECID=4 STAMP=745258313
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 08-MAR-11


Starting restore at 08-MAR-11
using channel ORA_AUX_DISK_1


channel ORA_AUX_DISK_1: copied control file copy
Finished restore at 08-MAR-11


Starting restore at 08-MAR-11
using channel ORA_AUX_DISK_1


channel ORA_AUX_DISK_1: copied control file copy
Finished restore at 08-MAR-11


contents of Memory Script:
{
 sql clone 'alter database mount standby database';
--將備庫啟動到mount standby
}
executing Memory Script


sql statement: alter database mount standby database


contents of Memory Script:
{
 set newname for tempfile 1 to 
"/u01/app/oracle/oradata/dave/temp01.dbf";
 switch clone tempfile all;
 set newname for datafile 1 to 
"/u01/app/oracle/oradata/dave/system01.dbf";
 set newname for datafile 2 to 
"/u01/app/oracle/oradata/dave/sysaux01.dbf";
 set newname for datafile 3 to 
"/u01/app/oracle/oradata/dave/undotbs01.dbf";
 set newname for datafile 4 to 
"/u01/app/oracle/oradata/dave/users01.dbf";
 backup as copy reuse
 datafile 1 auxiliary format 
"/u01/app/oracle/oradata/dave/system01.dbf" datafile 
2 auxiliary format 
"/u01/app/oracle/oradata/dave/sysaux01.dbf" datafile 
3 auxiliary format 
"/u01/app/oracle/oradata/dave/undotbs01.dbf" datafile 
4 auxiliary format 
"/u01/app/oracle/oradata/dave/users01.dbf" ;
 sql 'alter system archive log current';
--將datafile convert 到其他目錄
}
executing Memory Script


executing command: SET NEWNAME


renamed tempfile 1 to /u01/app/oracle/oradata/dave/temp01.dbf in control file


executing command: SET NEWNAME


executing command: SET NEWNAME


executing command: SET NEWNAME


executing command: SET NEWNAME


Starting backup at 08-MAR-11
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
--開始copy datafile,如果資料檔案比較大,這個會比較慢
input datafile file number=00001 name=/u01/app/oracle/oradata/orcl/system01.dbf
output file name=/u01/app/oracle/oradata/dave/system01.dbf tag=TAG20110308T161204
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:55
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/orcl/sysaux01.dbf
output file name=/u01/app/oracle/oradata/dave/sysaux01.dbf tag=TAG20110308T161204
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/orcl/undotbs01.dbf
output file name=/u01/app/oracle/oradata/dave/undotbs01.dbf tag=TAG20110308T161204
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/orcl/users01.dbf
output file name=/u01/app/oracle/oradata/dave/users01.dbf tag=TAG20110308T161204
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 08-MAR-11


sql statement: alter system archive log current


contents of Memory Script:
{
 switch clone datafile all;
}
executing Memory Script


datafile 1 switched to datafile copy
input datafile copy RECID=4 STAMP=745258432 file name=/u01/app/oracle/oradata/dave/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=5 STAMP=745258432 file name=/u01/app/oracle/oradata/dave/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=6 STAMP=745258432 file name=/u01/app/oracle/oradata/dave/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=7 STAMP=745258432 file name=/u01/app/oracle/oradata/dave/users01.dbf
Finished Duplicate Db at 08-MAR-11


RMAN>


DG 複製到這一步已經操作完成了。 但是還有一些細節需要處理。


兩點注意事項:
(1)如果使用的是非catalog,在rman 連線時,加上nocatalog關鍵字,如:


DG2:/home/oracle> rman targetsys/oracle@DG_PD auxiliarysys/oracle@DG_ST nocatalog


Recovery Manager: Release 11.2.0.3.0 -Production on Fri Oct 28 18:46:46 2011


Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved.


connected to target database: DG(DBID=1679060044)
using target databasecontrol file instead of recovery catalog
connected to auxiliary database: DG (notmounted)


不然會報如下錯誤:


DBGSQL:TARGET> begin :fhdbi := dbms_rcvcat.getDbid; end;
DBGSQL: sqlcode = 6550
DBGSQL: B :fhdbi = 32767
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGESTACK FOLLOWS ===============
RMAN-00571:===========================================================
RMAN-03002: failure of Duplicate Db commandat 10/28/2011 17:53:04
RMAN-05501: aborting duplication of targetdatabase
RMAN-03015: error occurred in stored scriptMemory Script
ORA-06550: line 1, column 17:
PLS-00201: identifier'DBMS_RCVCAT.GETDBID' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


(2) 在執行duplicate的時候,如果源庫和目標庫目錄相同,那麼在duplicate 時,需要加上nofilenamecheck,如下:


RMAN> duplicate target database for standby from active database nofilenamecheck;


我在上面的示例中,目錄結構不同,所以沒有用該引數,如果目錄相同,而又沒有加該引數,那麼就會報如下錯誤:


RMAN> duplicate target database forstandby from active database nofilenamecheck;


RMAN-05501: aborting duplication of targetdatabase
RMAN-05001: auxiliary file name/u01/app/oracle/oradata/dg/users01.dbf conflicts with a file used by the targetdatabase
RMAN-05001: auxiliary file name/u01/app/oracle/oradata/dg/undotbs01.dbf conflicts with a file used by thetarget database
RMAN-05001: auxiliary file name/u01/app/oracle/oradata/dg/sysaux01.dbf conflicts with a file used by thetarget database
RMAN-05001: auxiliary file name/u01/app/oracle/oradata/dg/system01.dbf conflicts with a file used by thetarget database




三. 後續工作


1. 主庫已經使用了spfile,但是備庫用的還是之前的pfile:
Primary:
SQL> show parameter pfile
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
spfile string /u01/app/oracle/product/11.2.0


Standby:
SQL> show parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string


 pfile裡面都是我們設定的一些基本引數。 但是備庫有冗餘的作用,所以這裡還是建議用主庫的pfile copy過來,然後修改相關引數後,在建立spfile。 這樣即使切換了,對DB的影響也不大。


2. 只要備庫的監聽不重啟,重啟備庫後,主庫還是能識別的。 如果備庫的監聽重啟了。那麼主庫也就需要重啟。


3. 複製結束後的Standby 只啟動到mount standby 的狀態。 並沒有啟動MRP的應用歸檔程式。 所以這個時候查詢主備庫,歸檔是不同步的。需要手動的啟動MRP程式。
SQL> alter database recover managed standby database disconnect from session;


4. 備庫Standby redo log 問題:
 在duplicate 結束後,備庫沒有新增standby redo log file。 但是主庫採用的是:lgwr async傳送的日誌。 當備庫的RFS 程式接收到日誌後,發現備庫沒有standby redo log的時候,備庫會自動用ARCH將其寫入歸檔檔案。


以下是備庫的alert log:
Tue Mar 08 16:53:32 2011
Archived Log entry 9 added for thread 1 sequence 21 rlc 745174404 ID 0x4bdfd301 dest 2:
RFS[2]: Opened log for thread 1 sequence 22 dbid 1272955137 branch 745174404
Tue Mar 08 16:53:36 2011
Media Recovery Log /u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch1_21_745174404.dbf
Media Recovery Waiting for thread 1 sequence 22 (in transit) --傳輸中
Tue Mar 08 16:58:58 2011
Archived Log entry 10 added for thread 1 sequence 22 rlc 745174404 ID 0x4bdfd301 dest 2:
RFS[2]: Opened log for thread 1 sequence 23 dbid 1272955137 branch 745174404
Tue Mar 08 16:59:00 2011
Media Recovery Log /u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch1_22_745174404.dbf
Media Recovery Waiting for thread 1 sequence 23 (in transit)
-- 注意這裡歸檔檔案目錄,使用的是$ORACLE_HOME/dbs, 自動轉換為ARCH時,也是使用預設的歸檔目錄。


5. 在備庫新增standby redo log:
SQL> alter database add standby logfile '/u01/app/oracle/oradata/dave/stdbyredo01.log' size 50m;
alter database add standby logfile '/u01/app/oracle/oradata/dave/stdbyredo01.log' size 50m
*
ERROR at line 1:
ORA-01156: recovery or flashback in progress may need access to files
--在備庫新增standby redo log需要先停MRP
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database add standby logfile '/u01/app/oracle/oradata/dave/stdbyredo01.log' size 50m;
Database altered.
SQL> alter database add standby logfile '/u01/app/oracle/oradata/dave/stdbyredo02.log' size 50m;
Database altered.
SQL> alter database add standby logfile '/u01/app/oracle/oradata/dave/stdbyredo03.log' size 50m;
Database altered.
SQL> alter database add standby logfile '/u01/app/oracle/oradata/dave/stdbyredo04.log' size 50m;
Database altered.
SQL> alter database recover managed standby database disconnect from session;
Database altered.


在看一下日誌:
Tue Mar 08 17:47:39 2011
Archived Log entry 15 added for thread 1 sequence 27 ID 0x4bdfd301 dest 1:
RFS[2]: Selected log 4 for thread 1 sequence 28 dbid 1272955137 branch 745174404
Tue Mar 08 17:47:43 2011
Archived Log entry 16 added for thread 1 sequence 28 ID 0x4bdfd301 dest 1:
Media Recovery Log /u01/archivelog/1_27_745174404.dbf
RFS[2]: Selected log 4 for thread 1 sequence 29 dbid 1272955137 branch 745174404
Media Recovery Log /u01/archivelog/1_28_745174404.dbf
Media Recovery Waiting for thread 1 sequence 29 (in transit)
--我們新增standby redo log 之後,歸檔檔案變成了我們指定的Log_archive_dest_n 指定的引數。


6. 在主庫也新增一下standby redo log


SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/stdbyredo01.log' size 50m;
Database altered.
SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/stdbyredo02.log' size 50m;
Database altered.
SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/stdbyredo03.log' size 50m;
Database altered.
SQL> alter database add standby logfile '/u01/app/oracle/oradata/orcl/stdbyredo04.log' size 50m;
Database altered.


7. 啟用real-time apply,從而實現real-time query:


SQL> alter database recover managed standby database cancel;
Database altered.
SQL> ALTER DATABASE OPEN;
Database altered.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
Database altered.


8. 驗證real-time apply 和real-time query:


Primary:
SQL> create table dave(id number,name varchar2(20));
Table created.
SQL> insert into dave values(1,'tianlesoftware');
1 row created.
SQL> commit;
Commit complete.


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


SQL> select * from dave;


 ID NAME
---------- ---------------
 1 tianlesoftware




小結:
 11gR2 的物理Data Guard 功能很強大. 

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

相關文章