Oracle 11g 使用duplicate from active database 建立物理ADG
1、概述:
之前使用冷備的方式搭建了一個物理ADG環境,但是由於冷備需要停庫。因此在一些大型庫上使用這種技術就不怎麼實用了,而使用duplicatefrom active database則必免了這種情況,它只需要短暫的重啟庫讓主庫引數檔案生效,就能完成ADG的搭建。
2、環境說明
Oracle:11.2.0.1.0
OS:redhat 5.7
Primary IP:192.168.2.111/24
Hostname:dba1.test.com
DB_NAME=ora11g
Standby IP:192.168.2.112/24
Hostname:dba2.test.com
DB_NAME=ora11g
3、操作步驟:
SQL> archive log list;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> archive log list;
SQL> alterdatabase force logging;
SQL> selectforce_logging from v$database;
FORCE_LOG
---------
YES
3.1.3. 配置Oracle Net(主、從上修改)
注意:在Primary庫和Standby都需要修改,可以將primary的listener.ora\tnsname.ora拷貝到standby上在做相應修改,如IP地址。修改完後重啟listener。
主庫:
Listener.ora
[[email protected]]$ cat listener.ora
# listener.oraNetwork Configuration File:/u01/oracle/product/11.2.0/network/admin/listener.ora
# Generated byOracle configuration tools.
-- 配置靜態註冊
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(ORACLE_HOME =/u01/oracle/product/11.2.0)
(SID_NAME = ora11g)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.2.111)(PORT = 1521))
)
)
ADR_BASE_LISTENER= /u01/oracle
tnsname.ora
[[email protected]]$ cat tnsnames.ora
# tnsnames.oraNetwork Configuration File:/u01/oracle/product/11.2.0/network/admin/tnsnames.ora
# Generated byOracle configuration tools.
ORA11G_DBA1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
ORA11G_DBA2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.2.112)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
[[email protected]]$ tnsping ora11g_dba2
[[email protected]]$ tnsping ora11g_dba1
3.1.4. 新增data guard 引數
建立pfile
[[email protected]~]$ sqlplus / as sysdba
[email protected]>create pfile from spfile;
[[email protected]~]$ cd $ORACLE_HOME/dbs
修改引數檔案
[[email protected]]$ vim initora11g.ora
ora11g.__db_cache_size=75497472
ora11g.__java_pool_size=4194304
ora11g.__large_pool_size=4194304
ora11g.__oracle_base='/u01/oracle'#ORACLE_BASEset from environment
ora11g.__db_cache_size=75497472
ora11g.__java_pool_size=4194304
ora11g.__large_pool_size=4194304
ora11g.__oracle_base='/u01/oracle'#ORACLE_BASEset from environment
ora11g.__pga_aggregate_target=146800640
ora11g.__sga_target=222298112
ora11g.__shared_io_pool_size=0
ora11g.__shared_pool_size=125829120
ora11g.__streams_pool_size=4194304
*.audit_file_dest='/u01/oracle/admin/ora11g/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/oradata/ora11g/control01.ctl','/u01/oracle/flash_recovery_area/ora11g/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_recovery_file_dest='/u01/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4039114752
*.diagnostic_dest='/u01/oracle'
*.dispatchers='(PROTOCOL=TCP)(SERVICE=ora11gXDB)'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=367001600
*.nls_language='SIMPLIFIEDCHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=170
*.undo_tablespace='UNDOTBS1'
--新增如下引數,上面如有重複的引數刪除
*.db_name='ora11g'
*.db_unique_name='primary'
*.log_archive_config='dg_config=(primary,standby)'
*.log_archive_dest_1='location=/orachivelogvalid_for=(all_logfiles,all_roles) db_unique_name=primary'
--注意:ora11g_db1/ora11g_db2為TNS檔案中的network service name
*.log_archive_dest_2='service=ora11g_dba2reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=standby'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.standby_file_management='auto'
--注意:如果將這個檔案拷貝到standby庫,要改成fal_server=’ora11g_dba1’,fal_client=’ora11g_dba2’,這兩個值寫錯了將導致不能傳輸日誌。
*.fal_server='ora11g_dba2'
*.fal_client='ora11g_dba1'
注意:
在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.所以只要設定了本地的歸檔位置,遠端的歸檔檔案也會放到這個目錄下面。
3.1.5. 用新pfile重啟主庫
[email protected]>shut immediate;
Database closed.
Databasedismounted.
ORACLE instanceshut down.
[email protected]>create spfile from pfile='?/dbs/initora11g.ora';
--這裡建立的目錄和primary庫相同,如不同要在引數檔案裡轉換一下。
--如果沒有建立以下目錄,在使用sqlplus / as sysdba時會報錯:
[[email protected]]$ sqlplus / as sysdba
SQL*Plus:Release 11.2.0.1.0 Production on Fri Feb 22 13:12:17 2013
Copyright(c) 1982, 2009, Oracle. All rightsreserved.
ERROR:
ORA-09925:??????????
LinuxError: 2: No such file or directory
Additionalinformation: 9925
ORA-01075:??????
[[email protected]]$ pwd
/u01/oracle/admin
[[email protected]]$ mkdir ora11g/adump ora11g/dpdump ora11g/pfile -p
[[email protected] /]$chown oracle.oinstall /oradata -R
[[email protected]_recovery_area]$ pwd
/u01/oracle/flash_recovery_area
[[email protected]_recovery_area]$ mkdir ora11g
3.2.1. 建立standby的口令檔案
注意:主從庫的sys口令相同
[[email protected] /]$orapwd file=?/dbs/orapwora11g password=oracle entries=10 force=y ignorecase=Y
3.2.3. 建立standby的初始化引數:
從主庫上拷貝引數檔案到備庫
[[email protected] dbs]$scp initora11g.ora 192.168.2.112:$ORACLE_HOME/dbs/
在備庫上進行修改:
[[email protected] dbs]$vim initora11g.ora
ora11g.__java_pool_size=4194304
ora11g.__large_pool_size=4194304
ora11g.__oracle_base='/u01/oracle'#ORACLE_BASEset from environment
ora11g.__pga_aggregate_target=146800640
ora11g.__sga_target=222298112
ora11g.__streams_pool_size=4194304
*.audit_file_dest='/u01/oracle/admin/ora11g/adump'
--將audit_trail的值由db改成none,不然在alter日誌中會報“AUDIT_TRAIL initializationparameter is changed to OS, as DB is NOT compatible for database opened with read-onlyaccess”
*.audit_trail='none'
*.compatible='11.2.0.0.0'
*.control_files='/oradata/ora11g/control01.ctl','/u01/oracle/flash_recovery_area/ora11g/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_recovery_file_dest='/u01/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4039114752
*.diagnostic_dest='/u01/oracle'
*.dispatchers='(PROTOCOL=TCP)(SERVICE=ora11gXDB)'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=367001600
*.nls_language='SIMPLIFIEDCHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=170
*.undo_tablespace='UNDOTBS1'
--新增如下引數,ora11g_dba1為tnsname.ora中的網路名,上面如有重複的引數刪除
*.db_name='ora11g'
*.db_unique_name='standby'
*.log_archive_config='dg_config=(primary,standby)'
*.log_archive_dest_1='location=/orachivelogvalid_for=(all_logfiles,all_roles) db_unique_name=standby'
*.log_archive_dest_2='service=ora11g_dba1reopen=120 lgwr async valid_for=(online_logfiles,primary_role)
*.db_unique_name=primary'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.standby_file_management='auto'
--備庫上的fal_server、fal_client的引數千萬不要寫錯,它的值是tnsname.ora檔案中的網路名,不然備庫不能接收日誌,而且在啟動備庫到open時會報:ORA-01152: file 1 was not restoredfrom a sufficiently old backup
*.fal_server='ora11g_dba1'
*.fal_client='ora11g_dba2'
注意:如果主從資料目錄結構不同需要加以下引數
*.log_file_name_convert=’primary路徑’,’standby路徑’
*.db_file_name_convert=’primary路徑’,’standby路徑’
3.2.4. 用pfile 將standby 啟動到nomount狀態:
[[email protected]]$ sqlplus / as sysdba
idle> startupnomount pfile='?/dbs/initora11g.ora';
3.2.5. 開始duplicate
[[email protected]]$ rman target sys/[email protected]_dba1 auxiliarysys/[email protected]_dba2
Recovery Manager:Release 11.2.0.1.0 - Production on Fri Feb 22 13:38:00 2013
Copyright (c)1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected totarget database: ORA11G (DBID=4173278619)
connected toauxiliary database: ORA11G (not mounted)
--執行duplicate的時候,如果源庫和目標庫目錄相同,那麼在duplicate時,需要加上nofilenamecheck,不同則不需要加nofilenamecheck,否則會報:RMAN-05501: aborting duplication of targetdatabase
RMAN> duplicate target database for standby from active databasenofilenamecheck;
StartingDuplicate Db at 22-FEB-13
using targetdatabase control file instead of recovery catalog
allocatedchannel: ORA_AUX_DISK_1
channelORA_AUX_DISK_1: SID=20 device type=DISK
contents ofMemory Script:
{
backup as copy reuse
--用duplicate建立standby會複製口令檔案
targetfile '/u01/oracle/product/11.2.0/dbs/orapwora11g' auxiliary format
'/u01/oracle/product/11.2.0/dbs/orapwora11g' ;
}
executing MemoryScript
Starting backupat 22-FEB-13
allocatedchannel: ORA_DISK_1
channel ORA_DISK_1:SID=41 device type=DISK
Finished backupat 22-FEB-13
--建立控制檔案
contents ofMemory Script:
{
backup as copy current controlfile forstandby auxiliary format '/oradata/ora11g/control01.ctl';
restore clone controlfile to '/u01/oracle/flash_recovery_area/ora11g/control02.ctl'from
'/oradata/ora11g/control01.ctl';
}
executing MemoryScript
Starting backupat 22-FEB-13
using channelORA_DISK_1
channelORA_DISK_1: starting datafile copy
copying standbycontrol file
output filename=/u01/oracle/product/11.2.0/dbs/snapcf_ora11g.f tag=TAG20130222T133953RECID=1 STAMP=808061996
channelORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
Finished backup at22-FEB-13
Starting restoreat 22-FEB-13
using channelORA_AUX_DISK_1
channelORA_AUX_DISK_1: copied control file copy
Finished restoreat 22-FEB-13
--將備庫啟動到mount standby standby database
contents ofMemory Script:
{
sql clone 'alter database mount standbydatabase';
}
executing MemoryScript
sql statement:alter database mount standby database
--轉換資料檔案目錄
contents ofMemory Script:
{
set newname for tempfile 1 to
"/oradata/ora11g/temp01.dbf";
switch clone tempfile all;
set newname for datafile 1 to
"/oradata/ora11g/system01.dbf";
set newname for datafile 2 to
"/oradata/ora11g/sysaux01.dbf";
set newname for datafile 3 to
"/oradata/ora11g/undotbs01.dbf";
set newname for datafile 4 to
"/oradata/ora11g/users01.dbf";
backup as copy reuse
datafile 1 auxiliary format
"/oradata/ora11g/system01.dbf" datafile
2 auxiliary format
"/oradata/ora11g/sysaux01.dbf" datafile
3 auxiliary format
"/oradata/ora11g/undotbs01.dbf" datafile
4 auxiliary format
"/oradata/ora11g/users01.dbf" ;
sql 'alter system archive log current';
}
executing MemoryScript
executingcommand: SET NEWNAME
renamed tempfile1 to /oradata/ora11g/temp01.dbf in control file
executingcommand: SET NEWNAME
executingcommand: SET NEWNAME
executingcommand: SET NEWNAME
executingcommand: SET NEWNAME
Starting backupat 22-FEB-13
using channelORA_DISK_1
--開始copy datafile,如果資料檔案比較大,這裡會比較慢
channelORA_DISK_1: starting datafile copy
input datafilefile number=00001 name=/oradata/ora11g/system01.dbf
output filename=/oradata/ora11g/system01.dbf tag=TAG20130222T134011
channelORA_DISK_1: datafile copy complete, elapsed time: 00:02:10
channelORA_DISK_1: starting datafile copy
input datafilefile number=00002 name=/oradata/ora11g/sysaux01.dbf
output filename=/oradata/ora11g/sysaux01.dbf tag=TAG20130222T134011
channelORA_DISK_1: datafile copy complete, elapsed time: 00:01:38
channelORA_DISK_1: starting datafile copy
input datafilefile number=00003 name=/oradata/ora11g/undotbs01.dbf
output filename=/oradata/ora11g/undotbs01.dbf tag=TAG20130222T134011
channel ORA_DISK_1:datafile copy complete, elapsed time: 00:00:27
channelORA_DISK_1: starting datafile copy
input datafilefile number=00004 name=/oradata/ora11g/users01.dbf
output filename=/oradata/ora11g/users01.dbf tag=TAG20130222T134011
channelORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backupat 22-FEB-13
sql statement:alter system archive log current
contents ofMemory Script:
{
switch clone datafile all;
}
executing MemoryScript
datafile 1switched to datafile copy
input datafilecopy RECID=1 STAMP=808062273 file name=/oradata/ora11g/system01.dbf
datafile 2switched to datafile copy
input datafilecopy RECID=2 STAMP=808062273 file name=/oradata/ora11g/sysaux01.dbf
datafile 3switched to datafile copy
input datafilecopy RECID=3 STAMP=808062273 file name=/oradata/ora11g/undotbs01.dbf
datafile 4switched to datafile copy
input datafilecopy RECID=4 STAMP=808062273 file name=/oradata/ora11g/users01.dbf
--到這裡完成
FinishedDuplicate Db at 22-FEB-13
RMAN>
注意:
Duplicate不會將primary上的temp表空間複製到standby庫上,但是在將standby庫啟動到open時會自動建立,standby庫上的redo log oracle也將會重新建立。
[email protected]>host ls -l /oradata/ora11g/temp01.dbf
ls:/oradata/ora11g/temp01.dbf: 沒有那個檔案或目錄
[email protected]>select * from v$logfile;
GROUP#STATUS TYPE MEMBER IS_REC
-------------------- -------------- --------------------------------------------- ------
3 ONLINE /u01/oracle/flash_recovery_area/STANDBY/onlin YES
elog/o1_mf_3_8lg1g8sw_.log
2 ONLINE /u01/oracle/flash_recovery_area/STANDBY/onlin YES
elog/o1_mf_2_8lg1g676_.log
1 ONLINE /u01/oracle/flash_recovery_area/STANDBY/onlin YES
elog/o1_mf_1_8lg1g2ok_.log
3.2.6 注意事項
如果使用的是非catalog,在rman 連線時,加上nocatalog關鍵字,如:
[[email protected] dbs]$ rman targetsys/[email protected]_dba1 auxiliary sys/[email protected]_dba2 nocatalog
connectedto target database: DG(DBID=1679060044)
usingtarget databasecontrol file instead of recovery catalog
connectedto auxiliary database: DG (notmounted)
不然會報如下錯誤:
RMAN-05501:aborting duplication of targetdatabase
3.3. 建立完adg後續 工作
3.3.1. 建立備庫spfile,並用spfile啟庫:
[email protected]> create spfile from pfile;
[email protected]> shut immediate;
[email protected]> startup nomount;
[email protected]> alter database mount standby database;
注: 除了adg 功能需要的相關引數,其它引數和主庫引數檔案最好一致。
複製結束後的Standby 只啟動到mount standby 的狀態。並沒有啟動MRP的應用歸檔程式。所以這個時候查詢主備庫,歸檔是不同步的。需要手動的啟動MRP程序。
SQL> alterdatabase recover managed standby database disconnect from session;
3.3.4. 備庫Standby redo log 問題:
在duplicate結束後,備庫沒有新增standbyredo log file。 但是主庫採用的是:lgwrasync傳送的日誌。 當備庫的RFS 程序接收到日誌後,發現備庫沒有standbyredo log的時候,備庫會自動用ARCH將其寫入歸檔檔案。
--沒有standby redo log ,啟用時實應用日誌會報以下錯
[email protected]>alter database recover managed standby database using current logfiledisconnect from session;
alter databaserecover managed standby database using current logfile disconnect from session
*
ERROR at line 1:
ORA-38500: USINGCURRENT LOGFILE option not available without standby redo logs
3.3.5 如何計算standby redo log數量
Standby redo log日誌檔案組的個數依照下面的原則進行計算
Standby redo log組數公式>=(每個instance日誌組個數+1)*instance個數
例如在環境中,只有2個節點,這個節點有三組redo,所以
Standby redo log組數公式>=(3+1)*2 = 8
所以需要建立8組Standbyredo log
3.3.6. 在備庫新增standby redo log:
[email protected]>alter database add standby logfile
2 group 4 ('/oradata/ora11g/dglog04.log') size 50m,
3 group 5 ('/oradata/ora11g/dglog05.log') size 50m,
4 group 6 ('/oradata/ora11g/dglog06.log') size 50m,
5 group 7 ('/oradata/ora11g/dglog07.log') size 50m,
6 group 8 ('/oradata/ora11g/dglog08.log') size 50m,
7 group 9 ('/oradata/ora11g/dglog09.log') size 50m,
8 group 10 ('/oradata/ora11g/dglog10.log') size 50m,
9 group 11 ('/oradata/ora11g/dglog11.log') size 50m;
alter databaseadd standby logfile
*
ERROR at line 1:
ORA-01156:recovery or flashback in progress may need access to files*
--在備庫新增standby redo log需要先停MRP
alterdatabase add standby logfile
group 4('/oradata/ora11g/dglog04.log') size 50m,
group 5('/oradata/ora11g/dglog05.log') size 50m,
group 6('/oradata/ora11g/dglog06.log') size 50m,
group 7('/oradata/ora11g/dglog07.log') size 50m,
group 8('/oradata/ora11g/dglog08.log') size 50m,
group 9('/oradata/ora11g/dglog09.log') size 50m,
group 10('/oradata/ora11g/dglog10.log') size 50m,
group 11('/oradata/ora11g/dglog11.log') size 50m;
3.3.7. 在主庫也新增一下standby redo log
alterdatabase add standby logfile
group 4('/oradata/ora11g/dglog04.log') size 50m,
group 5('/oradata/ora11g/dglog05.log') size 50m,
group 6('/oradata/ora11g/dglog06.log') size 50m,
group 7('/oradata/ora11g/dglog07.log') size 50m,
group 8('/oradata/ora11g/dglog08.log') size 50m,
group 9('/oradata/ora11g/dglog09.log') size 50m,
group 10('/oradata/ora11g/dglog10.log') size 50m,
group 11('/oradata/ora11g/dglog11.log') size 50m;
3.3.8. 啟用real-time apply,從而實現real-timequery:
SQL> alterdatabase recover managed standby database cancel;
[email protected]> alterdatabase open;
[email protected]>alter database recover managed standby database using current logfile disconnect from session;
3.3.9. 驗證real-time apply 和real-timequery:
Primary:
SQL> createtable fengg(id number,name varchar2(30));
SQL> insertinto fengg values(1,'fengg');
SQL> commit;
Standby:
SQL> selectopen_mode from v$database;
OPEN_MODE
--------------------
READ ONLY WITHAPPLY
[email protected]> select * from fengg;
ID NAME
------------------------------------------------------------
1 fengg
Primary:
[email protected]> select sequence#,applied from v$archived_log;
14NO --線上redo日誌是否被應用
14YES --備庫上的standbyredo log是否被應用
15NO
15YES
4、小結:
通過幾天反覆的實驗,終於完成了整個實驗,也遇到一些問題在這裡總結一下:
1),Vmware的快照功能為了省了不少時間,不然搭建實驗環境很浪費時間。
2),網路連線檔案listener.ora/tnsname.ora非常的敏感,因此最好少改動這個檔案,並做好備份,在需要時直接複製備份檔案。
3),ADG的引數檔案中的引數一定要嚴格按照官方文件操作並瞭解相關引數的用途。
4),備庫上的fal_server、fal_client的引數千萬不要寫錯,否則備庫不能接收日誌。
5),主從庫的sys口令必須完全相同。
6),使用tnsping命令測試主從庫網路連通性。
7),切記,經常觀察alter 報警日誌的相關操作資訊。
=======================================================================
版權所有,文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任! 謝謝合作!
QQ:[email protected]
Sina:weibo.com/kaijunfeng
Yahoo:[email protected]