Oracle最高可用性体系结构 (MAA)是Oracle 的最佳实践方案,它基于成熟的Oracle高可用性技术和建议。MAA 的目的是以最低的成本和复杂性获得最佳的高可用性体系结构。本文通过11gR2 RAC创建物理备库来实现高可用性,也是MAA的一种体现。
Oracle Maximum Availability Architecture
配置信息一览表

注意:阅读本文之前,需满足以下条件
对11g RAC和DataGuard有一定的了解
安装和配置过11gR2 RAC
对SCAN有一定了解(本文使用了DNS)
主库已经创建好
备库(ASM磁盘中已配置好,数据库软件已安装好)
/etc/hosts配置信息
10.0.2.10 od.ohsdba.cn #dns dhcp ntp server 10.0.2.21 ohs1.ohsdba.cn ohs1 # public address of node 1 10.0.2.22 ohs2.ohsdba.cn ohs2 # public address of node 2 10.0.2.23 ohs3.ohsdba.cn ohs3 # public address of node 3 10.0.2.24 ohs4.ohsdba.cn ohs4 # public address of node 4 10.0.2.31 ohs1-vip.ohsdba.cn ohs1-vip # virtual address of node 1 10.0.2.32 ohs2-vip.ohsdba.cn ohs2-vip # virtual address of node 2 10.0.2.33 ohs3-vip.ohsdba.cn ohs3-vip # virtual address of node 3 10.0.2.34 ohs4-vip.ohsdba.cn ohs4-vip # virtual address of node 4 172.16.0.21 ohs1-priv.ohsdba.cn ohs1-priv # private address of node 1 172.16.0.22 ohs2-priv.ohsdba.cn ohs2-priv # private address of node 2 172.16.0.23 ohs3-priv.ohsdba.cn ohs3-priv # private address of node 3 172.16.0.24 ohs4-priv.ohsdba.cn ohs4-priv # private address of node 4SCAN配置信息
[orgrid@ohs1 ~]$ nslookup prod-scan Server: 10.0.2.10 Address: 10.0.2.10#53 Name: prod-scan.ohsdba.cn Address: 10.0.2.112 Name: prod-scan.ohsdba.cn Address: 10.0.2.110 Name: prod-scan.ohsdba.cn Address: 10.0.2.111 [orgrid@ohs1 ~]$ nslookup stdby-scan Server: 10.0.2.10 Address: 10.0.2.10#53 Name: stdby-scan.ohsdba.cn Address: 10.0.2.211 Name: stdby-scan.ohsdba.cn Address: 10.0.2.212 Name: stdby-scan.ohsdba.cn Address: 10.0.2.210 [orgrid@ohs1 ~]$
主、备库TNS配置信息
PROD = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = prod-scan.ohsdba.cn)(PORT = 10010)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = prod) ) ) STDBY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = stdby-scan.ohsdba.cn)(PORT = 10015)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = stdby) ) )
在主库上的操作
1.设置初始化参数
alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile sid='*'; alter system set log_archive_dest_2='service=STDBY valid_for=(online_logfiles,primary_role) LGWR ASYNC=20480 OPTIONAL REOPEN=15 NET_TIMEOUT=30 db_unique_name=STDBY' scope=spfile sid='*'; alter system set log_archive_dest_state_1 = enable scope=spfile sid='*'; alter system set log_archive_dest_state_2 = enable scope=spfile sid='*'; alter system set log_archive_config='dg_config=(PROD,STDBY)' scope=spfile sid='*'; alter system set fal_server=PROD scope=spfile sid='*'; alter system set standby_file_management=auto scope=spfile sid='*'; #以下设置为磁盘组不一样做的设置,如果一样,以下参数可以不设置 alter system set db_file_name_convert ='+DATA_STDBY/stdby','+DATA_PROD/prod' scope=spfile sid='*'; alter system set log_file_name_convert ='+DATA_STDBY/stdby','+DATA_PROD/prod' scope=spfile sid='*'; alter system set db_create_online_log_dest_1='+DATA_PROD' scope=spfile sid='*'; alter system set db_create_file_dest='+DATA_PROD' scope=spfile sid='*'; alter system set db_recovery_file_dest='+FRA_PROD' scope=spfile sid='*'; SQL> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile sid='*'; System altered. SQL> alter system set log_archive_dest_2='service=STDBY valid_for=(online_logfiles,primary_role) LGWR ASYNC=20480 OPTIONAL REOPEN=15 NET_TIMEOUT=30 db_unique_name=STDBY' scope=spfile sid='*'; System altered. SQL> alter system set log_archive_dest_state_1 = enable scope=spfile sid='*'; System altered. SQL> alter system set log_archive_dest_state_2 = enable scope=spfile sid='*'; System altered. SQL> alter system set log_archive_config='dg_config=(PROD,STDBY)' scope=spfile sid='*'; System altered. SQL> alter system set fal_server=PROD scope=spfile sid='*'; System altered. SQL> alter system set standby_file_management=auto scope=spfile sid='*'; System altered. SQL> SQL> alter system set db_file_name_convert ='+DATA_STDBY/stdby','+DATA_PROD/prod' scope=spfile sid='*'; System altered. SQL> alter system set log_file_name_convert ='+DATA_STDBY/stdby','+DATA_PROD/prod' scope=spfile sid='*'; System altered. SQL> alter system set db_create_online_log_dest_1='+DATA_PROD' scope=spfile sid='*'; System altered. SQL> alter system set db_create_file_dest='+DATA_PROD' scope=spfile sid='*'; System altered. SQL> alter system set db_recovery_file_dest='+FRA_PROD' scope=spfile sid='*'; System altered. SQL>
2.在主库上增加standby logfile,设置force logging
SQL> alter database force logging; Database altered. SQL> SQL> select thread#,group#,bytes/1024/1024 from v$log; THREAD# GROUP# BYTES/1024/1024 ---------- ---------- --------------- 1 1 50 1 2 50 2 3 50 2 4 50 SQL> SQL> alter database add logfile thread 1 group 5 size 50M; Database altered. SQL> alter database add logfile thread 2 group 6 size 50M; Database altered. SQL> alter database add standby logfile thread 1 2 group 7 size 50M, 3 group 8 size 50M, 4 group 9 size 50M, 5 group 10 size 50M; Database altered. SQL> alter database add standby logfile thread 2 2 group 11 size 50M, 3 group 12 size 50M, 4 group 13 size 50M, 5 group 14 size 50M; Database altered. SQL>3.在主库上增加到备库的TNS信息
dup = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = ohs3.ohsdba.cn) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SID = stdby1) ) )
在备库上做以下操作
1.配置静态监听(在备库第一个节点增加下面的内容)
$GI_HOME/network/admin/listener.ora
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (ORACLE_HOME = /pgold/ordb/oracle/product/112) (SID_NAME = stdby1) ) )2.在ASM实例上创建目录
ASMCMD> pwd +DATA_STDBY ASMCMD> mkdir stdby ASMCMD> ls -l Type Redund Striped Time Sys Name N stdby/ ASMCMD>
3.创建审核文件存放目录(在所有备库节点执行)
[oracle@ohs3 ~]mkdir -p /pgold/ordb/oracle/product/admin/stdby/adump [oracle@ohs4 ~]mkdir -p /pgold/ordb/oracle/product/admin/stdby/adump
4.创建密码文件
[oracle@ohs3 dbs]$ orapwd file=orapwstdby1 password=oracle 在备库第一个节点创建密码文件,然后复制到其他节点,并修改文件名为orapw<ORACLE_SID>的格式。如果遇到ORA-16191的情况,最好把主库上的密码文件复制到备库,修改文件名为orapw<ORACLE_SID> 的格式。
5.用setasmgidwrap修改权限
[oracle@ohs3 112]$ ls -l /pgold/ordb/oracle/product/112/bin/oracle -rwsr-s--x. 1 oracle oinstall 239626641 Nov 26 09:54 /pgold/ordb/oracle/product/112/bin/oracle [oracle@ohs3 112]$ /pgold/orgrid/oracle/product/112/bin/setasmgidwrap -o=/pgold/ordb/oracle/product/112/bin/oracle [oracle@ohs3 112]$ ls -l /pgold/ordb/oracle/product/112/bin/oracle -rwsr-s--x. 1 oracle asmadmin 239626641 Nov 26 09:54 /pgold/ordb/oracle/product/112/bin/oracle [oracle@ohs3 112]$ [oracle@ohs4 log]$ ls -l /pgold/ordb/oracle/product/112/bin/oracle -rwsr-s--x. 1 oracle oinstall 239626641 Nov 26 09:58 /pgold/ordb/oracle/product/112/bin/oracle [oracle@ohs4 log]$ cd [oracle@ohs4 ~]$ /pgold/orgrid/oracle/product/112/bin/setasmgidwrap -o=/pgold/ordb/oracle/product/112/bin/oracle [oracle@ohs4 ~]$ ls -l /pgold/ordb/oracle/product/112/bin/oracle -rwsr-s--x. 1 oracle asmadmin 239626641 Nov 26 09:58 /pgold/ordb/oracle/product/112/bin/oracle [oracle@ohs4 ~]$
6.在备库第一个节点上编辑临时pfile
[oracle@ohs3 dbs]$ pwd /pgold/ordb/oracle/product/112/dbs [oracle@ohs3 dbs]$ cat pfile.ora *.db_name=prod *.sga_target=500M *.db_unique_name=stdby [oracle@ohs3 dbs]$
注意:这里的pfile只起临时作用,执行duplicate时会把主库的spfile clone到备库,然后以clone的spfile重新启动实例
通过rman duplicate创建physical standby
1.在备库的第一个实例上启动实例到nomount状态
[oracle@ohs3 dbs]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Sun Nov 27 10:19:55 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> startup nomount pfile='pfile.ora' ORACLE instance started. Total System Global Area 521936896 bytes Fixed Size 2254824 bytes Variable Size 159385624 bytes Database Buffers 356515840 bytes Redo Buffers 3780608 bytes SQL>2.在主库上执行
[oracle@ohs1 ~]$ rman target / auxiliary sys/oracle@dup |tee /tmp/rman1.log
run { allocate channel c1 device type disk ; allocate channel c2 device type disk ; allocate auxiliary channel aux1 device type disk ; duplicate target database for standby from active database spfile parameter_value_convert 'prod','stdby','PROD','STDBY' set cluster_database='false' set db_unique_name='stdby' set log_archive_dest_2='service=PROD valid_for=(online_logfiles,primary_role) LGWR ASYNC=20480 OPTIONAL REOPEN=15 NET_TIMEOUT=30 db_unique_name=PROD' set db_file_name_convert '+DATA_PROD/prod','+DATA_STDBY/stdby' set log_file_name_convert '+DATA_PROD/prod','+DATA_STDBY/stdby' set db_create_online_log_dest_1='+DATA_STDBY' set db_create_file_dest='+DATA_STDBY' set db_recovery_file_dest='+FRA_STDBY' set control_files='+DATA_STDBY/stdby/control01.ctl','+DATA_STDBY/stdby/control02.ctl' set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=ohs3-vip.ohsdba.cn)(PORT=1521))' set remote_listener='stdby-scan:10015' set audit_file_dest='/pgold/ordb/oracle/product/admin/stdby/adump'; }
[oracle@ohs1 admin]$ rman target / auxiliary sys/oracle@dup |tee /tmp/rman1.log Recovery Manager: Release 11.2.0.4.0 - Production on Tue Nov 29 03:05:35 2016 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: PROD (DBID=340761128) connected to auxiliary database: PROD (not mounted) RMAN> run { 2> allocate channel c1 device type disk ; 3> allocate channel c2 device type disk ; 4> allocate auxiliary channel aux1 device type disk ; 5> duplicate target database for standby from active database 6> spfile 7> parameter_value_convert 'prod','stdby','PROD','STDBY' 8> set cluster_database='false' 9> set db_unique_name='stdby' 10> set log_archive_dest_2='service=PROD valid_for=(online_logfiles,primary_role) LGWR ASYNC=20480 OPTIONAL REOPEN=15 NET_TIMEOUT=30 db_unique_name=PROD' 11> set db_file_name_convert '+DATA_PROD/prod','+DATA_STDBY/stdby' 12> set log_file_name_convert '+DATA_PROD/prod','+DATA_STDBY/stdby' 13> set db_create_online_log_dest_1='+DATA_STDBY' 14> set db_create_file_dest='+DATA_STDBY' 15> set db_recovery_file_dest='+FRA_STDBY' 16> set control_files='+DATA_STDBY/stdby/control01.ctl','+DATA_STDBY/stdby/control02.ctl' 17> set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=ohs3-vip.ohsdba.cn)(PORT=1521))' 18> set remote_listener='stdby-scan:10015' 19> set audit_file_dest='/pgold/ordb/oracle/product/admin/stdby/adump'; 20> } using target database control file instead of recovery catalog allocated channel: c1 channel c1: SID=56 instance=prod1 device type=DISK allocated channel: c2 channel c2: SID=55 instance=prod1 device type=DISK allocated channel: aux1 channel aux1: SID=26 device type=DISK Starting Duplicate Db at 29-NOV-16 contents of Memory Script: { backup as copy reuse targetfile '/pgold/ordb/oracle/product/112/dbs/orapwprod1' auxiliary format '/pgold/ordb/oracle/product/112/dbs/orapwstdby1' targetfile '+DATA_PROD/prod/spfileprod.ora' auxiliary format '/pgold/ordb/oracle/product/112/dbs/spfilestdby1.ora' ; sql clone "alter system set spfile= ''/pgold/ordb/oracle/product/112/dbs/spfilestdby1.ora''"; } executing Memory Script Starting backup at 29-NOV-16 Finished backup at 29-NOV-16 sql statement: alter system set spfile= ''/pgold/ordb/oracle/product/112/dbs/spfilestdby1.ora'' contents of Memory Script: { sql clone "alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=stdbyXDB)'' comment= '''' scope=spfile"; sql clone "alter system set cluster_database = false comment= '''' scope=spfile"; sql clone "alter system set db_unique_name = ''stdby'' comment= '''' scope=spfile"; sql clone "alter system set log_archive_dest_2 = ''service=PROD valid_for=(online_logfiles,primary_role) LGWR ASYNC=20480 OPTIONAL REOPEN=15 NET_TIMEOUT=30 db_unique_name=PROD'' comment= '''' scope=spfile"; sql clone "alter system set db_file_name_convert = ''+DATA_PROD/prod'', ''+DATA_STDBY/stdby'' comment= '''' scope=spfile"; sql clone "alter system set log_file_name_convert = ''+DATA_PROD/prod'', ''+DATA_STDBY/stdby'' comment= '''' scope=spfile"; sql clone "alter system set db_create_online_log_dest_1 = ''+DATA_STDBY'' comment= '''' scope=spfile"; sql clone "alter system set db_create_file_dest = ''+DATA_STDBY'' comment= '''' scope=spfile"; sql clone "alter system set db_recovery_file_dest = ''+FRA_STDBY'' comment= '''' scope=spfile"; sql clone "alter system set control_files = ''+DATA_STDBY/stdby/control01.ctl'', ''+DATA_STDBY/stdby/control02.ctl'' comment= '''' scope=spfile"; sql clone "alter system set local_listener = ''(ADDRESS=(PROTOCOL=tcp)(HOST=ohs3-vip.ohsdba.cn)(PORT=1521))'' comment= '''' scope=spfile"; sql clone "alter system set remote_listener = ''stdby-scan:10015'' comment= '''' scope=spfile"; sql clone "alter system set audit_file_dest = ''/pgold/ordb/oracle/product/admin/stdby/adump'' comment= '''' scope=spfile"; shutdown clone immediate; startup clone nomount; } executing Memory Script sql statement: alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=stdbyXDB)'' comment= '''' scope=spfile sql statement: alter system set cluster_database = false comment= '''' scope=spfile sql statement: alter system set db_unique_name = ''stdby'' comment= '''' scope=spfile sql statement: alter system set log_archive_dest_2 = ''service=PROD valid_for=(online_logfiles,primary_role) LGWR ASYNC=20480 OPTIONAL REOPEN=15 NET_TIMEOUT=30 db_unique_name=PROD'' comment= '''' scope=spfile sql statement: alter system set db_file_name_convert = ''+DATA_PROD/prod'', ''+DATA_STDBY/stdby'' comment= '''' scope=spfile sql statement: alter system set log_file_name_convert = ''+DATA_PROD/prod'', ''+DATA_STDBY/stdby'' comment= '''' scope=spfile sql statement: alter system set db_create_online_log_dest_1 = ''+DATA_STDBY'' comment= '''' scope=spfile sql statement: alter system set db_create_file_dest = ''+DATA_STDBY'' comment= '''' scope=spfile sql statement: alter system set db_recovery_file_dest = ''+FRA_STDBY'' comment= '''' scope=spfile sql statement: alter system set control_files = ''+DATA_STDBY/stdby/control01.ctl'', ''+DATA_STDBY/stdby/control02.ctl'' comment= '''' scope=spfile sql statement: alter system set local_listener = ''(ADDRESS=(PROTOCOL=tcp)(HOST=ohs3-vip.ohsdba.cn)(PORT=1521))'' comment= '''' scope=spfile sql statement: alter system set remote_listener = ''stdby-scan:10015'' comment= '''' scope=spfile sql statement: alter system set audit_file_dest = ''/pgold/ordb/oracle/product/admin/stdby/adump'' comment= '''' scope=spfile Oracle instance shut down connected to auxiliary database (not started) Oracle instance started Total System Global Area 784998400 bytes Fixed Size 2257352 bytes Variable Size 272633400 bytes Database Buffers 507510784 bytes Redo Buffers 2596864 bytes allocated channel: aux1 channel aux1: SID=1 device type=DISK contents of Memory Script: { backup as copy current controlfile for standby auxiliary format '+DATA_STDBY/stdby/control01.ctl'; restore clone controlfile to '+DATA_STDBY/stdby/control02.ctl' from '+DATA_STDBY/stdby/control01.ctl'; } executing Memory Script Starting backup at 29-NOV-16 channel c1: starting datafile copy copying standby control file output file name=/pgold/ordb/oracle/product/112/dbs/snapcf_prod1.f tag=TAG20161129T030611 RECID=23 STAMP=929156772 channel c1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 29-NOV-16 Starting restore at 29-NOV-16 channel aux1: copied control file copy Finished restore at 29-NOV-16 contents of Memory Script: { sql clone 'alter database mount standby database'; } executing Memory Script sql statement: alter database mount standby database contents of Memory Script: { set newname for tempfile 1 to "+DATA_STDBY/stdby/temp01.dbf"; switch clone tempfile all; set newname for datafile 1 to "+DATA_STDBY/stdby/system01.dbf"; set newname for datafile 2 to "+DATA_STDBY/stdby/sysaux01.dbf"; set newname for datafile 3 to "+DATA_STDBY/stdby/undotbs01.dbf"; set newname for datafile 4 to "+DATA_STDBY/stdby/users01.dbf"; set newname for datafile 5 to "+DATA_STDBY/stdby/undotbs02.dbf"; backup as copy reuse datafile 1 auxiliary format "+DATA_STDBY/stdby/system01.dbf" datafile 2 auxiliary format "+DATA_STDBY/stdby/sysaux01.dbf" datafile 3 auxiliary format "+DATA_STDBY/stdby/undotbs01.dbf" datafile 4 auxiliary format "+DATA_STDBY/stdby/users01.dbf" datafile 5 auxiliary format "+DATA_STDBY/stdby/undotbs02.dbf" ; sql 'alter system archive log current'; } executing Memory Script executing command: SET NEWNAME renamed tempfile 1 to +DATA_STDBY/stdby/temp01.dbf in control file executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting backup at 29-NOV-16 channel c1: starting datafile copy input datafile file number=00001 name=+DATA_PROD/prod/system01.dbf channel c2: starting datafile copy input datafile file number=00002 name=+DATA_PROD/prod/sysaux01.dbf output file name=+DATA_STDBY/stdby/system01.dbf tag=TAG20161129T030620 channel c1: datafile copy complete, elapsed time: 00:00:15 channel c1: starting datafile copy input datafile file number=00003 name=+DATA_PROD/prod/undotbs01.dbf output file name=+DATA_STDBY/stdby/sysaux01.dbf tag=TAG20161129T030620 channel c2: datafile copy complete, elapsed time: 00:00:15 channel c2: starting datafile copy input datafile file number=00005 name=+DATA_PROD/prod/undotbs02.dbf output file name=+DATA_STDBY/stdby/undotbs01.dbf tag=TAG20161129T030620 channel c1: datafile copy complete, elapsed time: 00:00:02 channel c1: starting datafile copy input datafile file number=00004 name=+DATA_PROD/prod/users01.dbf output file name=+DATA_STDBY/stdby/undotbs02.dbf tag=TAG20161129T030620 channel c2: datafile copy complete, elapsed time: 00:00:01 output file name=+DATA_STDBY/stdby/users01.dbf tag=TAG20161129T030620 channel c1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 29-NOV-16 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=23 STAMP=929156803 file name=+DATA_STDBY/stdby/system01.dbf datafile 2 switched to datafile copy input datafile copy RECID=24 STAMP=929156803 file name=+DATA_STDBY/stdby/sysaux01.dbf datafile 3 switched to datafile copy input datafile copy RECID=25 STAMP=929156803 file name=+DATA_STDBY/stdby/undotbs01.dbf datafile 4 switched to datafile copy input datafile copy RECID=26 STAMP=929156803 file name=+DATA_STDBY/stdby/users01.dbf datafile 5 switched to datafile copy input datafile copy RECID=27 STAMP=929156803 file name=+DATA_STDBY/stdby/undotbs02.dbf Finished Duplicate Db at 29-NOV-16 released channel: c1 released channel: c2 released channel: aux1 RMAN>
注意:如果主库节点上log_archive_format的值不一样,需要在rman的run块(set log_archive_format='stdby1_%t_%s_%r.arc')中加入修改log_archive_format的选项,否则会失败。这个参数对于使用'LOCATION=USE_DB_RECOVERY_FILE_DEST'的选项无效。
SQL> show parameter log_archive_dest_3 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_3 string log_archive_dest_30 string log_archive_dest_31 string SQL> alter system set log_archive_dest_3='location=/pgold/ordb/arch'; System altered. SQL> alter system archive log current; System altered. SQL> !ls -l /pgold/ordb/arch total 23356 -rw-r-----. 1 oracle asmadmin 23915520 Nov 30 03:09 prod1_1_108_928922794.arc SQL>
3.创建pfile并编辑pfile
SQL> show parameter spf NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string /pgold/ordb/oracle/product/112 /dbs/spfilestdby1.ora SQL> create pfile='/tmp/p.ora' from spfile; File created. SQL>新pfile内容如下
/tmp/p.ora *.audit_file_dest='/pgold/ordb/oracle/product/admin/stdby/adump' *.audit_trail='db' *.cluster_database=true *.compatible='11.2.0.4.0' *.control_files='+DATA_STDBY/stdby/control01.ctl','+DATA_STDBY/stdby/control02.ctl' *.db_block_size=8192 *.db_create_file_dest='+DATA_STDBY' *.db_create_online_log_dest_1='+DATA_STDBY' *.db_domain='' *.db_file_name_convert='+DATA_PROD/prod','+DATA_STDBY/stdby' *.db_name='prod' *.db_recovery_file_dest_size=8388608000 *.db_recovery_file_dest='+FRA_STDBY' *.db_unique_name='stdby' *.dg_broker_config_file1='/pgold/ordb/oracle/dr1stdby.dat' *.dg_broker_config_file2='/pgold/ordb/oracle/dr2stdby.dat' *.diagnostic_dest='/pgold/ordb/log' *.dispatchers='(PROTOCOL=TCP) (SERVICE=stdbyXDB)' *.fal_server='PROD' stdby1.instance_number=1 stdby2.instance_number=2 stdby1.local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=ohs3-vip.ohsdba.cn)(PORT=1521))' stdby2.local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=ohs4-vip.ohsdba.cn)(PORT=1521))' *.log_archive_config='dg_config=(PROD,STDBY)' *.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST' *.log_archive_dest_2='service=PROD valid_for=(online_logfiles,primary_role) LGWR ASYNC=20480 OPTIONAL REOPEN=15 NET_TIMEOUT=30 db_unique_name=PROD' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' stdby1.log_archive_format='%t_%s_%r.arc' stdby2.log_archive_format='%t_%s_%r.arc' *.log_file_name_convert='+DATA_PROD/prod','+DATA_STDBY/stdby' *.open_cursors=300 *.pga_aggregate_target=262144000 *.processes=150 *.remote_listener='stdby-scan:10015' *.remote_login_passwordfile='exclusive' *.sga_target=786432000 *.standby_file_management='AUTO' stdby2.thread=2 stdby1.thread=1 stdby2.undo_tablespace='UNDOTBS2' stdby1.undo_tablespace='UNDOTBS1'
4.创建新的spfile,并编辑initstdby1.ora
SQL> create spfile='+DATA_STDBY/stdby/spfilestdby.ora' from pfile='/tmp/p.ora'; File created. SQL> [oracle@ohs3 dbs]$ cat initstdby1.ora spfile='+DATA_STDBY/stdby/spfilestdby.ora' [oracle@ohs3 dbs]$ sqlplus / as sysdba SQL> shut immediate5.通过srvctl增加数据库配置信息
[oracle@ohs3 ~]$ srvctl add database -d stdby -o /pgold/ordb/oracle/product/112 [oracle@ohs3 ~]$ srvctl add instance -d stdby -i stdby1 -n ohs3 [oracle@ohs3 ~]$ srvctl add instance -d stdby -i stdby2 -n ohs4 [oracle@ohs3 ~]$ srvctl config database -d stdby Database unique name: stdby Database name: Oracle home: /pgold/ordb/oracle/product/112 Oracle user: oracle Spfile: Domain: Start options: open Stop options: immediate Database role: PRIMARY Management policy: AUTOMATIC Server pools: stdby Database instances: stdby1,stdby2 Disk Groups: Mount point paths: Services: Type: RAC Database is administrator managed [oracle@ohs3 ~]$
6.修改数据库配置信息
[oracle@ohs3 ~]$ srvctl modify database -d stdby -r physical_standby -p +DATA_STDBY/stdby/spfilestdby.ora -n prod -a DATA_STDBY,FRA_STDBY
[oracle@ohs3 ~]$ srvctl config database -d stdby Database unique name: stdby Database name: prod Oracle home: /pgold/ordb/oracle/product/112 Oracle user: oracle Spfile: +DATA_STDBY/stdby/spfilestdby.ora Domain: Start options: open Stop options: immediate Database role: PHYSICAL_STANDBY Management policy: AUTOMATIC Server pools: stdby Database instances: stdby1,stdby2 Disk Groups: DATA_STDBY,FRA_STDBY Mount point paths: Services: Type: RAC Database is administrator managed [oracle@ohs3 ~]$7.启动备库,并启用real time apply
[oracle@ohs3 dbs]$ ls hc_stdby1.dat init.ora initstdby1.ora orapwstdby1 s.ora spfilestdby1.ora [oracle@ohs3 dbs]$ rm spfilestdby1.ora [oracle@ohs4 ~]$ srvctl start database -d stdby -o 'read only' [oracle@ohs4 ~]$ SQL> select open_mode from gv$database; OPEN_MODE -------------------- READ ONLY READ ONLY SQL> recover managed standby database using current logfile disconnect from session; Media recovery complete. SQL> select open_mode from gv$database; OPEN_MODE -------------------- READ ONLY WITH APPLY READ ONLY WITH APPLY SQL>
8.测试
在主库上创建用户和表
SQL> create user ohsdba identified by oracle; User created. SQL> grant create session,connect,resource to ohsdba; Grant succeeded. SQL> create table ohsdba.t1(name varchar2(20),age number); Table created. SQL> insert into ohsdba.t1 values('ohsdba',100); 1 row created. SQL> commit; Commit complete. SQL> SQL>在备库上查看
[oracle@ohs4 ~]$ sqlplus system/oracle@stdby SQL*Plus: Release 11.2.0.4.0 Production on Sun Nov 27 11:50:28 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SQL> desc ohsdba.t1 Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(20) AGE NUMBER SQL>
注意:duplicate from active database实际上使用的是image copy。在生产环境中要考虑网络带宽,数据库的大小,宕机时间等因素,一般使用备份集的居多。本文仅供参考
Reference
http://docs.oracle.com/cd/E11882_01/server.112/e41134/toc.htm
http://docs.oracle.com/cd/E11882_01/server.112/e10803/toc.htm
http://www.oracle.com/technetwork/database/features/availability/maa-096107.html
http://www.oracle.com/technetwork/cn/database/maa-088017-zhs.html