ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle 11g Data Guard

Oracle 11g Data Guard

原创 Linux操作系统 作者:tom_xieym 时间:2011-08-03 11:33:39 0 删除 编辑

 

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<*test11g*/data>$mkdir backup
dbtest<*test11g*/data>$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<*teststby*/u01>$rman target  sys/oracle@test11g  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<*teststby*/data/test11g/arch>$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/25850100/viewspace-703938/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-05-20

  • 博文量
    77
  • 访问量
    98313