Technorati 标签: dataguard, broker, failover, observer

配置好dataguard后,可以演练主库崩溃后的操作。一般有两种方式,一种是用oracle的dataguard broker,启用fast_start failover,自动切换;一种是用failover手工进行切换。下面就两种方式,分别做介绍。

dataguard broker的配置:

相关的理论知识,可以到如下链接,这里不作赘述

http://www.oracle.com/pls/db112/to_toc?pathname=server.112%2Fe17023%2Ftoc.htm&remark=docindex

1。主备库做如下修改

主库:

SQL>alter system set log_archive_dest_2='SERVICE=dbstandby LGWR SYNC AFFIRM NET_TIMEOUT=120  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db249'   SCOPE=BOTH;

备库:

SQL>alter system set log_archive_dest_2='SERVICE=dbstandby LGWR SYNC AFFIRM NET_TIMEOUT=120  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db248'   SCOPE=BOTH;

其中,LGWR,SYNC,AFFIRM,NET_TIMEOUT为必要设置

2。主备库做如下修改

主库:

SQL>alter system set local_listener=dbprimary

值为tnsnames中配置的主库的链接标志

备库:

SQL>alter system set local_listener=dbstandby

值为tnsnames中配置的备库的链接标志

3。查看并修改dg模式,保证主备库处于最大可用状态

主备库同样操作:

SQL>select protection_mode,protection_level from v$database;

切换模式,需要在mount状态下,所以主库应想关闭,然后启动到mount状态

SQL>shutdown immediate;

SQL>startup mount;

切换模式:

SQL>alter database set standby database to maximize availability;

查看修改结果:

SQL>select protection_mode,protection_level from v$database;

4。启动flashback,数据库缺省状态为关闭

开启flashback需要在mount状态下

查看是否开启:

SQL>show parameter db_recover_file_dest

SQL>select flashback_on from v$database;

主库:

SQL>shutdown immediate

SQL>startup mount

SQL>alter database flashback on;

备库:

SQL>alter database recover managed standby  database cancel;

SQL>alter database flashback on;

SQL> select flashback_on from v$database;

SQL>alter database recover managed standby database disconnect from session;

5。安装dgmgrl

一般推荐dataguard broker配置在主备库以外的机器上,以保证主备库的崩溃,不会影响dataguard broker,否则,就没有意义了。这里作为测试,配置在备库机器上。

安装dgmgrl,就是安装oracle的客户端,最好是相同版本。

6。配置broker参数

主备库同样操作

SQL>show parameter dg_broker_start

SQL>alter system set dg_broker_start=true scope=both;

7。配置监听

主备库同样操作,在listener.ora文件中,添加如下行

(SID_DESC =
  (GLOBAL_NAME = db248_DGMGRL.node248.gewara)
  (ORACLE_HOME = /u01/app/oracle/products/11.2/db_1)
  (SID_NAME = dbtest)
)

其中,global_name必须按照固定格式<db_unique_name>_DGMGRL.<domain>,db_unique_name为本机dg中数据库的唯一名称,dbtest为数据库名,主备一致。

添加完毕后,保存,用命令

$lsnrctl reload

重新加载配置。

8。设置fast_start failover

进入dgmgrl命令行模式

$dgmgrl

DGMGRL&gt;connect sys/oracle@dbprimary  #链接主库

DGMGRL&gt;help create

DGMGRL&gt;create configuration ‘db248’ as primary database is ‘dbprimary’ connect identifier is dbprimary;

DGMGRL&gt;help add

DGMGRL&gt;add database ‘db249’ as connect identifier is dbstandby maintained as physical;

DGMGRL&gt;show configuration;

db248,db249分别是主备库的db_unique_name,dbprimary,dbstandby是tnsnames配置中的主备库的链接标识

之后,可以用sql命令查看生成的配置文件

SQL&gt;show parameter dg_broker_config_file;

启用configuration

DGMGRL&gt;enable configuration;

DGMGRL&gt;show database verbose ‘db248’;

DGMGRL&gt;show database verbose ‘db249’;

在启用fast_start failover之前,主备库日志传输的模式必须为sync,不可以是aync,可以用如下语句修改:

DGMGRL&gt;edit database dbprimary set property logxptmode=sync;

启用FSFO

DGMGRL&gt;enable fast_start failover;

9。启动observer

DGMGRL&gt;start observer;

10。验证

查看FSFO的状态,在主库执行如下SQL语句:

SQL&gt;select fs_failover_observer_present,fs_failover_server_host,fs_failover_threshold from v$database;

在如下情况发生时,会触发failover

1》主库实例崩溃

2》书库shutdown abort

3》由于io错误,数据库离线

4》网络故障

配置TAF,关于TAF,可以参照如下内容:

http://blog.csdn.net/tianlesoftware/archive/2010/12/13/6072294.aspx

在tnsnames中添加如下内容:

TAFTEST =
  (DESCRIPTION =
     (LOAD_BALANCE = on)
     (FAILOVER = on)
     (ADDRESS =
         (PROTOCOL = tcp)
         (HOST = 192.168.2.248)
         (PORT = 1521)
     )
     (ADDRESS =
         (PROTOCOL = tcp)
          (HOST = 192.168.2.249)
          (PORT = 1521)
     )
     (CONNECT_DATA =
     (SERVICE_NAME = dbtest)
     (FAILOVER_MODE =
        (TYPE = select)
        (METHOD = basic)
         )
      )
  )

可以用这个TAF实例,来查看dg主库的信息

$sqlplus /nolog

SQL&gt;conn sys/oracle@taftest

SQL&gt;select name,db_unique_name from v$database;

灾难模拟:

主库

SQL&gt;shutdown abort;

2分钟后,可以查看dgmgrl日志,查看切换结果。

SQL&gt;conn sys/oracle@taftest

SQL&gt;select name,db_unique_name from v$database;

在原来的备库:

SQL&gt;select database_role from v$database;

在dgmgrl中查看:

DGMGRL&gt;show database verbose db248;

DGMGRL&gt;show database verbose db249;

如果broker有sysdba权限,broker会尝试重启并恢复原主库,使之变成备库。若不行,则需要手工进行恢复。

确定原主库需要恢复到的目标scn

SQL&gt;select to_char(standby_became_primary_scn) from v$database;

原主库启动到mount状态:

flashback database to scn *******;

转换数据库,以生成备库用的controlfile

SQL&gt;alter database convert to physical standby;

SQL&gt;shutdown immediate

SQL&gt;startup mount

重启redo传输:

查看log_archive_dest状态:

SQL&gt;select dest_id,dest_name,status,protection_mode,destination,error,srl from v$archive_dest_status;

如果需要,特别是dest1和dest2,执行如下语句:

SQL&gt;alter system set log_archive_dest_state_n=enable;

新的主库上执行:

SQL&gt;alter system switch logfile;

成功则说明日志传输正常。

应用redolog

SQL&gt;alter database recover managed standby database disconnect from session;

SQL&gt;alter database recover managed standby database using current logfile disconnect from session;

 

手工failover:

先将备库切换到最大性能:

SQL&gt;alter database set standby database maximize performance;

查看备库归档是否连续:

SQL&gt;select thread#,low_sequence#,high_sequence# from v$archive_gap;

若有返回,则应拷贝相应的归档日志,到备库,并用如下命令注册:

SQL&gt;alter database register physical logfile ‘。。。'

查看归档是否完整

SQL&gt;select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;

拷贝相应文件,如下操作

SQL&gt;alter database register physical logfile ‘。。。'

反复执行,知道上面两步返回值为空。

备库上执行:

SQL&gt;alter database recover managed standby database finish force;

角色装换:

SQL&gt;select database_role from v$database;

SQL&gt;alter database commit to switchover to primary;

SQL&gt;select database_role from v$database;

SQL&gt;select open_mode from v$database;

若为mount,则直接打开。

SQL&gt;alter database open;

SQL&gt;select open_mode from v$database;

若为readonly,再关闭,再重启

SQL&gt;shutdown immediate

SQL&gt;startup

后面的,如果需要,在主备切换一下。