Data Guard Broker配置

oracle Data Guard,以最低成本实现最高的数据保护。在硬件上没有特殊要求,普通PC机即可实现。
简单的来说,Data Guard,就是自动创建和维护生产数据库(或主数据库)的一个或多个事务一致的副本(备用数据库)。如果主数据库不可用(因为故障、维护或者灾难),那么可以激活一个备用数据库并使之承担主数据库的角色。
然而,在配置完成Data Guard后,若需要实现主备数据库间的切换,需要在主数据库及备用数据库上分别输入多个命令,切换步骤稍显麻烦。所以,一般情况下,DBA会将整个切换过程编辑成脚本,以便自动运行,进行状态切换。当然,oracle 也提供了工具Data Guard Broker,仅在控制端输入一个命令就能方便实现主备数据库间的切换。
在Data Guard Broker的基础上,配置并启用Fast-Start Failover,就能自动检测发现主机故障,实现主备切换,故障转移。
下面通过4个部分总结一下oracle 的 Data Guard 的相关配置:

  1. 基础知识准备。简单介绍一下在Data Guard配置过程中容易混淆的几个oracle基本概念,以及oracle 的网络配置
  2. 配置Data Guard
  3. 配置Data Guard Broker
  4. 配置及启用Fast-Start Failover
    现在说明下实际的配置环境。Data Guard的主备数据库分别位于2台服务器上。基本信息如下:
    primary server:
    操作系统:windows server 2003 32bit
    ip:192.168.0.225
    计算机名:sjzx-2
    standby server:
    操作系统:windows xp 32bit
    ip:192.168.0.212
    计算机名:20081208-1335

2台服务器上所用的oracle版本均为 oracle 10.2.0.3.0

  1. 基础知识准备:
    在进行Data Guard配置的时候,需要更改配置文件中的多项参数,涉及到多个oracle比较容易混淆的概念。所以在配置之前,单独把它们拿出来说明一下,以便配置过程避免一些不该发生的错误。
    对此部分内容熟悉的,可自行跳过。

a) oracle中的数据库和实例
这是oracle中最基本的2个概念。
先说数据库(database)。oracle中的数据库,是存储数据的一种媒介。常用的一般为2种形式,即文件和磁盘阵列。文件很好理解,就是在磁盘创建一批文件,然后在文件中存储数据信息。而磁盘阵列呢?所谓磁盘阵列,就是说数据不是存放在某个文件中的,而是把一个或多个磁盘格式化为oracle的一种格式,等于整个磁盘只能存放oracle数据库,不能作为其它用途。以我们最常用的文件格式来说,数据库就是那些所有数据文件、控制文件、REDO文件等等一系列文件的集合。即
数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件
实例(instance)是操作系统中一系列的进程以及为这些进程所分配的内存块。即
ORACLE实例 = 进程 + 进程所使用的内存(SGA)
由上可见,对数据库的应用,实例和数据库缺一不可。 仅有数据库,那么只表示数据存储在文件中,但是我们无法对它直接进行操作。仅有instance,表示我们可以进行操作,但是没有操作对象(不知道目标数据),也是没有什么意义的。
database是永久性的,instance是临时性的。当我们结束oracle的实例进程,它所占内存释放,那么instance也就不存在了。但是,各种数据库相关文件还是存在的,所以database仍然存在。
因此,也就不难理解了,oracle数据库服务器启动一般包含的3个步骤:1.创建并启动实例;2.装载数据库;3.打开数据库。每到一个阶段,都有相应的操作可以进行。例如,同一个SID,但是如果以不同的参数文件启动,那么我们可以装载和打开不同的数据库。同样的,一个数据库,也可以被不同的instance加载和打开。
那些oracle的各种启动命令,例如startup nomount、startup mount、startup open、startup(startup等同于startup open)分别对应于启动oracle数据库服务器到特定阶段。
一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库。
windows下,我们一般启动服务OracleServiceSID,就可以连接实例,对数据库进行操作,是因为安装oracle后,Windows的注册表中ORA_SID_AUTOSTART 默认设置为 true,数据库实例会随着服务的开启而开启。如果人为将其设置为false,那么即使OracleServiceSID启动,数据库实例也不会启动,需要我们手动startup。

b) oracle中的name,id
oracle中有多个name与id。有些需根据规则定义,有些可以随意指定。有些可以省略,有些不能省略。有些可以很方便的进行修改(一条sql,或者直接改参数文件),有些却不能修改,或者修改很麻烦。有些name之间有关系,有些却毫无关联。所以oracle中的各种name是最容易混淆的。以下内容都是目前自己的理解,难免有偏差,仅供参考。

db_name:数据库名。物理数据库的名字标识。数据库创建完成后,参数db_name被写入参数文件,格式如下:
db_name=orcl
数据名虽说可以修改,但是修改步骤比较麻烦。建议最好不要修改db_name。
在不同的服务器上创建数据库,可以使用同样的db_name
在DG环境中,主备服务器中的数据库有同样的db_name
可以利用下列sql查询db_name
select name from v$database;

db_domain:数据库域名。这个域同网络的域没有什么联系。个人理解是类似于把网络中的多个数据库分组管理。可以随意命名,可以为空。

global_name:全局数据库名。在windows操作系统中,利用Database Configuration Assistant创建数据库时,要求输入就是全局数据库名。通常,它的名字是由db_name.db_domain构成。

SID:实例标识。在windows操作系统中,利用Database Configuration Assistant创建数据库时,会要求输入SID。SID和instance_name的值是一致的。它是oracle的实例标识。在windows创建一个oracle实例后,会在操作系统中注册一个名称为OracleServiceSID的系统服务。由于在oracle中一个数据库可以对应多个实例,所以SID可以与db_name相同,也可以不相同。
简而言之,SID只与实例对应。
instance_name用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。
可以通过下列sql查询instance_name
select instance_name from v$instance;

db_unique_name:在Data Guard里,主从服务器中的数据库,都有一样的DB_NAME。然而它们和RAC环境下不一样,不代表同一个库(主备机中均有自己的数据库文件,不像RAC环境中通过多个实例通过磁盘阵列共享一个库)。但是它们的db_unique_name 是不一样的,用以标识不同的数据库。这个也是可以自己定义的。

service_name:服务名。service name是连接数据库的时候使用的别名。
需要注意的是,service_name主要用于数据库网络连接时,可以有多个,可以随意命名,可以通过系统初始化参数service_name设置。
一般情况下,service_name的缺省值为db_name.db_domain,同global_name相同。

Net service name:网络服务名,即连接描述符。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。网络服务名被记录在tnsnames.ora文件中,由自己随意命名。
下面是tnsname.ora中的一段配置:

TEST2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 20081208-1335)(PORT = 1521))
 	 )
	  (CONNECT_DATA =
		  (SERVER = DEDICATED)
		 (SERVICE_NAME = "TESTB_DGMGRL.DG")
	  )
  )

其中的TEST2就是 net service name。
c) oracle的网络配置文件
这里只介绍oracle最基本的网络结构。
首先是3个配置文件,listener.ora、sqlnet.ora、tnsnames.ora,均位于$ORACLE_HOME\network\admin目录下。

sqlnet.ora:
这是一个支持SQL*NET(oracle的网络组件,负责数据库服务的远程连接和登录)的基本配置文件,其中可以设定加密、连接限制、验证方式等等多种网络连接配置信息。其中,默认的,也是最常用的参数设置为以下2个。
SQLNET.AUTHENTICATION_SERVICES= (NTS,NONE)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
参数SQLNET.AUTHENTICATION_SERVICES配置了登录验证方式,操作系统验证,还是密码文件验证。
参数NAMES.DIRECTORY_PATH配置了以怎样的方式处理一个连接中出现的连接字符串。
例如,我们通过客户端sqlplus连接数据库,输入如下的命令
conn system/system@orcl
其中的orcl就是连接字符串。
现在NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)。其中TNSNAMES表示在tnsnames.ora文件中查找连接字符串(即Net service name);EZCONNECT表示以EZCONNECT的方式尝试连接。处理方式有先后区别,只有当前面方式失败时才会尝试后续方式。
NAMES.DIRECTORY_PATH还可以设置为其它值。

tnsnames.ora:
我自己把它理解为net service name的配置文件。
只有在sqlnet.ora中的NAMES.DIRECTORY_PATH值有TNSNAMES时,才有可能使用该文件。
当连接字符串同net service name相匹配时,就可以根据net service name的配置信息,得到连接信息,例如主机名(或者ip地址)、端口号、service_name(或者SID)。
获得连接信息后,客户端就向目标服务器发送连接请求。剩下的就由服务器来解决了。

listener.ora:
oracle的监听进程的配置文件。
服务器通过监听进程(listener)接受连接申请并转交给服务器进程。从连接信息中得到service_name或者sid,同已经注册的service_name或者已经启动的sid进行匹配,就可以把远程数据库服务进程交给相应instance。到此,listener进程的任务也已经完成了。所以,关闭listener,不会影响已经建立好的连接。

举个事例具体说明一下

serverA:
	sqlnet.ora:
	NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
	tnsnames.ora:
	TEST2 =
 	 (DESCRIPTION =
    		(ADDRESS_LIST =
     			(ADDRESS = (PROTOCOL = TCP)(HOST = serverB)(PORT = 1521))
 	 	)
	  		(CONNECT_DATA =
		  	(SERVER = DEDICATED)
		 	(SERVICE_NAME = "TESTB_DGMGRL.DG")
	  	)
  	)
serverB:
	listener.ora:
	SID_LIST_LISTENER =
		(SID_LIST =
	    	(SID_DESC =	
	      		(GLOBAL_DBNAME = TESTB_DGMGRL.DG)	
				(ORACLE_HOME = H:\oracle\product\10.2.0\db_2)
				(SID_NAME = TEST2)
			)
		)
	LISTENER =
		(DESCRIPTION_LIST =
			(DESCRIPTION =
				(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
				(ADDRESS = (PROTOCOL = TCP)(HOST = serverB)(PORT = 1521))
			)
		)

在serverA上输入命令sqlplus system/system@TEST2,其处理流程是这样的:
a). 分析sqlnet.ora文件,看看连接字符串的解析方式,首选是TNSNAMES
b). 分析tnsnames.ora文件,连接字符串是TEST2,目标是查找net service name是TEST2的配置信息。成功找到,得到连接信息HOST=serverB,PORT=1521,service_name=TESTB_DGMGRL.DG。发送连接信息到serverB
c). serverB中的监听器LISTENER得到连接请求,其中service_name是TESTB_DGMGRL.DG,于是查找service_name的注册信息,找到service_name=TESTB_DGMGRL.DG的实例为TEST2,将远程服务请求交给instance TEST2。这样,网络连接建立完成。

上述事例中,serverB中service_name的注册,用到了listener.ora的静态注册。listener.ora的静态注册,就是我们配置监听器时,显示的配置了GLOBAL_DBNAME以及SID_NAME。这样,监听进程启动后,就会静态的注册一个service_name同GLOBAL_DBNAME相同,instance的sid等于SID_NAME的service name。所以,我们在配置listener.ora和tnsnames.ora,需要确保服务器上listener.ora中配置的GLOBAL_DBNAME,与客户端上tnsnames.ora中配置的SERVICE_NAME一致。

  1. 配置Data Guard:
    在开始配置Data Guard之前,简单规划一下各种name
primary server standby server
IP 192.168.0.255 192.168.0.212
db_name test test
db_domain DG DG
global_name TEST.DG TEST.DG
SID TEST1 TEST2
db_unique_name TESTA TESTB

下面为Data Guard的详细配置步骤。

  1. primary server上创建数据库,全局数据库名为TEST.DG,SID为TEST1

  2. standby server上创建实例TEST2
    oradim -new -sid TEST2

  3. primary server上设置数据库force logging

--sqlplus,sys以sysdba登录数据库
--sqlplus /nolog
--conn / as sysdba
alter database force logging;
select force_logging from v$database;
  1. primar server上设置数据库archive log状态,并设置参数log_archive_dest_1(该参数表示archive log存放路径)
--sqlplus
shutdown immediate;
startup mount;
alter database archivelog;
archive log start;
alter database open;
alter system set log_archive_dest_1='location=H:\oracle\test\arch' scope=spfile;
archive log list;
show parameter log_archive_dest_1;
shutdown immediate;
startup;
show parameter log_archive_dest_1;
archive log list;
  1. primary server 上创建standby log,大小同联机日志大小一样,组数要比database中的的log file数大1
--sqlplus
alter database add standby logfile group 4 'H:\oracle\test\test\standbyredo04.log' size 50m;
alter database add standby logfile group 5 'H:\oracle\test\test\standbyredo05.log' size 50m;
alter database add standby logfile group 6 'H:\oracle\test\test\standbyredo06.log' size 50m;
alter database add standby logfile group 7 'H:\oracle\test\test\standbyredo07.log' size 50m;

–查询standby log

select group#,thread#,sequence#,archived, status from v$standby_log;
  1. primary server上创建数据库初始化参数文件,并设置参数
    create pfile=‘H:\oracle\test\tmp\initprimary.ora’ from spfile;
    编辑参数文件,参数设置如下:
    修改参数
*.log_archive_dest_1='location=H:\oracle\test\arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=TESTA'
增加参数
DB_UNIQUE_NAME=TESTA
LOG_ARCHIVE_CONFIG='DG_CONFIG=(TESTA,TESTB)'
LOG_ARCHIVE_DEST_2='SERVICE=TEST2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=TESTB'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_MAX_PROCESSES=4
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_CLIENT=TEST1
FAL_SERVER=TEST2
STANDBY_FILE_MANAGEMENT=AUTO

下面是参数值配置的一些注意事项,具体参数意义就不详细说明了:

FAL_SERVER specifies the FAL (fetch archive log) server for a standby database. The value is an Oracle Net service name, which is assumed to be configured properly on the standby database system to point to the desired FAL server;
FAL_CLIENT specifies the FAL (fetch archive log) client name that is used by the FAL service, configured through the FAL_SERVER parameter, to refer to the FAL client. The value is an Oracle Net service name, which is assumed to be configured properly on the FAL server system to point to the FAL client (standby database);
LOG_ARCHIVE_CONFIG enables or disables the sending of redo logs to remote destinations and the receipt of remote redo logs, and specifies the unique database names (DB_UNIQUE_NAME) for each database in the Data Guard configuration;
另外,还有2个可能用到的参数,DB_FILE_NAME_CONVERT以及LOG_FILE_NAME_CONVERT,分别用于当主备数据文件名称不相同,或者日志文件路径不一样时,进行文件名称转换。设置方法如下
DB_FILE_NAME_CONVERT=‘standby’,‘primary’
log_file_name_convert=‘D:\oracle\product\10.2.0\oradata\orcl’,‘D:\oracle\product\10.2.0\oradata\orcl’
这里配置的时候,主备机中数据文件名称相同,而且日志存放路径也相同,所以就不用设置这2个参数了

  1. primary server用修改后的pfile创建spfile。
shutdown immediate;
create spfile='H:\oracle\test\tmp\SPFILETEST1.ORA' from  pfile='H:\oracle\test\tmp\initprimary.ora';

以生成的SPFILE替换原SPFILETEST1.ORA,然后启动instance。可以查看参数值,验证是否以新生成的spfile文件启动

startup;
show parameter log_archive_dest_2;
  1. primary server上,主库用RMAN创建一个全备
--rman nocatalog target'sys/sysdba@test1 as sysdba'
run{
allocate channel c1 type disk;
backup format 'H:\oracle\test\backup\full%u_%s_%p' database include current controlfile;
sql 'alter system archive log current';
backup filesperset 10 archivelog all format='H:\oracle\test\backup\log%u_%s.bak';
release channel c1;
}
  1. primary server上创建standby的控制文件,
alter database create standby controlfile as 'H:\oracle\test\tmp\standby.ctl';

下面主要在standby server上重建数据库。standby server上的oracle instance已经在前面创建过了,SID=TEST2
10. 将primary server上的部分文件复制到standby server上,例如pfile,pwd file,备份文件、standby control文件

  1. standby server上建立各种相应的文件目录。数据文件目录要相同。
    standby control文件复制3份,分别命名为CONTROL01.CTL,CONTROL02.CTL,CONTROL03.CTL,放到对应目录。(注意控制文件的路径可以在SPFILE中设置control_files参数)
    pwd file放到对应的文件目录。(windows在ORACLE_HOME下的database目录下)。注意这个口令文件主要用于远程用户以sysdba登录,可以对实例进行启动、停止、数据库加载等操作。
    备份文件放在同primary sever一致的目录下

  2. 将primary server的pfile(initprimary.ora)重命名为initstandby.ora,然后修改参数。注意一些参数需要依据standby server上的实际文件路径修改。下面仅列出同Data Guard相关的部分参数

log_archive_dest_1='location=H:\oracle\test\arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=TESTB'
DB_UNIQUE_NAME=TESTB
LOG_ARCHIVE_CONFIG='DG_CONFIG=(TESTA,TESTB)'
LOG_ARCHIVE_DEST_2='SERVICE=TEST1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=TESTA'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_MAX_PROCESSES=4
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_CLIENT=TEST2
FAL_SERVER=TEST1
STANDBY_FILE_MANAGEMENT=AUTO
  1. 配置standby server上的tnsnames.ora、listener.ora文件。(如果primary server上的这2个文件没有进行配置,也可以在此时进行配置。)需要添加2个net service name,分别为TEST1(指向primary server的instance TEST1),TEST2(standby server的instance TEST2)。listener.ora配置完成后,需要重新启动监听器
    下面贴一段standby server的所增加的配置以便参考。
tnsnames.ora:
TEST2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 20081208-1335)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST.DG))
    )
  )
  
TEST1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = sjzx-2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TEST.DG))
    )
  )
listener.ora:
SID_DESC =
      (GLOBAL_DBNAME = TEST.DG)
      (ORACLE_HOME = H:\oracle\product\10.2.0\db_2)
      (SID_NAME = TEST2)
)
  1. standby server上还原数据库
--sqlplus
--conn / as sysdba
startup nomount pfile='H:\oracle\test\tmp\initstandby.ora';

–设置oracle_sid为TEST2

set oracle_sid=TEST2

–rman登录TEST2,开始还原

--rman nocatalog target/
show all;
alter database mount;
list backup;
restore database;
restore archivelog all;

还原成功后,dbf文件生成,此时还没有log文件

  1. standby server上创建备库的spfile
create spfile='H:\oracle\test\tmp\SPFILETEST2.ORA' from pfile='H:\oracle\test\tmp\initstandby.ora';

然后将所生成的spfile复制到ORACLE_HOME的database目录下,作为instance TEST2启动时的参数文件。

  1. 验证standby server上的参数文件是否正确
shutdown immediate;
startup mount;

然后可以通过show parameter查看参数是否正确

  1. 验证primary server以及standby server中的网络配置是否正确
    要求primary server,standby server上都能以TEST1连接主数据库,TEST2连接备数据库。
    在primary server上,sys能以sysdba身份登录standby server的instance TEST2
    在standby server上,sys能以sysdba身份登录primary server的instance TEST1
    如果sys用户以sysdba身份登录时,报用户名和密码错误,需要检查oracle是否配置了允许口令文件验证,

  2. 在standby server上建立备库的standby redo log以及online log
    a) primary server上进行一次日志切换
    –sqlplus
    alter system switch logfile;
    b) 稍等片刻,standby server上执行下列sql
    select * from v$standby_log;
    若结果集为空,则可以进行下一步操作。如果结果集一直不为空,那么就需要检查有关参数设置了。同时也可以查看日志信息,快速定位错误
    c) standby server上添加standby log

alter database add standby logfile group 4 'H:\oracle\test\test\standbyredo04.log' size 50m;
alter database add standby logfile group 5 'H:\oracle\test\test\standbyredo05.log' size 50m;
alter database add standby logfile group 6 'H:\oracle\test\test\standbyredo06.log' size 50m;
alter database add standby logfile group 7 'H:\oracle\test\test\standbyredo07.log' size 50m;
  1. standby server上启动redo apply
alter database recover managed standby database disconnect from session;
  1. 检查物理的standby

a) standby server上检查当前的archive log

select sequence#,first_time, next_time from v$archived_log order by sequence#;

b) primar server上create table,insert,然后进行日志切换

create table test(id int);
insert into test values(1);
commit;
alter system switch logfile;

c) 再次在standby server上检查当前的archive log

select sequence#,first_time, next_time from v$archived_log order by sequence#;

这时的结果记录应该比a)中的多一条记录,另外在standby server的归档目录上也可以看到primary server中由操作b)生成的归档日志
d) 在standby server上查询数据

alter database open;

–此时一般会报错,所以需要执行下面一个sql,进行恢复

alter database recover managed standby database cancel;
alter database open read only;
select * from test;

结果集为1,表明primar server到standby server的data guard配置正确。

  1. switchover

所谓switchover就是切换主备机状态,使原来的primary server工作在standby状态,standby server工作在primary状态。

可以通过下列sql查询服务器工作在何种状态

select database_role from v$database;

结果为primary表示为主数据库,standby表示为备用数据库
可以通过下列sql查询switchover_status

select switchover_status from v$database;

结果为to standby,表示可以直接切换到standby
结果为to primary,表示可以直接切换到primary

整个switchover流程大致如下:
a) 查看primary 的switchover_status

select switchover_status from v$database;

假设结果为to standby
b) 那么primary可以直接切换为standby,通过下列sql

alter database commit to switchover to physical standby;
shutdown immediate;
startup nomount;
alter database mount standby database;

c) 查看原standby的switchover_status

select switchover_status from v$database;

假设结果为to primary
d) 那么原standby可以直接切换为primary,通过下列sql

alter database commit to switchover to primary;
alter database open;

e) 原primary(现在的standby)置于恢复模式

alter database recover managed standby database disconnect from session;

如果切换时,查看primary的switchover_status为SESSIONS ACTIVE,那么需要检查standby是否接受到最新的日志。可以在primary上通过alter system switch logfile手动进行一次日志切换,然后在standby恢复alter database recover managed standby database cancel。接着需要检查primary是否有活动的sql serssion。如果有,可以将session kill。
在上述步骤执行完成后,再次查询primary的switchover_status,若还为SESSIONS ACTIVE,则在正常的switchover语句后面加上with session shutdown,如下

alter database commit to switchover to physical standby with session shutdown;

如果切换时,查看standby的switchover_status为SWITCHOVER PENDING,那么可以执行alter database recover managed standby database disconnect from session将standby置于恢复模式,然后再进行切换。

如果切换时,查看standby的switchover_status为SESSIONS ACTIVE,那么可以检查standby上是否有活动的sql session,有就kill。再次检查switchover_status,若仍然不为to primary,则在正常的switchover语句后面加上with session shutdown,如下:

alter database commit to switchover to primary with session shutdown;
  1. 配置Data Guard Broker:
    Data Guard配置完陈后,就可以Data Guard Broker了。
    首先简单介绍一下Data Guard Broker。
    Data Guard Broker是建立在Data Guard基础上的一个对Data Guard配置,集中管理操作的一个平台。Broker的推出是为了简化DG复杂的管理过程,它最大的作用就是集中化的统一管理。
    配置Data Guard Broker使用到的客户端工具是DGMGRL。它是一个命令行管理工具。

下面开始介绍Data Guard Broker的配置了。注意前提条件,Data Guard已经成功配置完成。

  1. 设置primary和standby启动时参数文件为spfile。
    oracle实例启动时,参数文件可以为spfile,也可以为pfile。为了确保修改数据库参数后能够保存下来,必须使用spfile启动。
    在前面配置Data Guard的过程中,我们已经为每个instance创建了spfile文件,并放置在了对应位置。所以创建spfile到相应位置的步骤我们可以跳过了。
    接下来,我们需要设置instance的pfile文件,即init.ora文件。在init.ora文件中设置参数如下:
    spfile=‘SPFILETEST1.ORA’
    即在init.ora文件中指定spfile文件,确保实例启动使用的参数文件是spfile。

  2. 配置DG_BROKER_CONFIG_FILEn
    DG_BROKER_CONFIG_FILEn代表2个参数,分别为DG_BROKER_CONFIG_FILE1,DG_BROKER_CONFIG_FILE2,它们是Data Guard Broker的配置文件名。它们都有默认值(windows下是在ORACLE_HOME/database目录下,linux下是在ORACLE_HOME/dbs目录下),所以一般我们可以不进行特别设置。
    需要注意的是,每个数据库只会维护一组配置文件。因此,RAC环境中,配置文件是有组成这个RAC的各个instance共享的,因此需要确保配置文件所处位置能被各个instance访问。
    在这次配置过程中,不涉及到RAC,所以这个参数使用默认值应该是没有问题的。可以通过show parameter命令查看参数值。

  3. 设置listener
    在Data Guard Broker环境中,需要在listener.ora静态添加一个service_name为db_unique_name_DGMGRL.db_domain的注册。这个service_name会在DGMGRL重启数据库的时候用到。通过DGMGRL重启数据库时DMON进程会先将数据库关闭,然后DGMGRL用此service_name通过listener连接到数据库,发出启动命令。
    primary server上的listener.ora添加如下设置:

(SID_DESC =
      (GLOBAL_DBNAME = TESTA_DGMGRL.DG)
      (ORACLE_HOME = F:\oracle\product\10.2.0\db_2)
      (SID_NAME = TEST1)
)
standby server上的listener.ora添加如下设置:
(SID_DESC =
      (GLOBAL_DBNAME = TESTB_DGMGRL.DG)
      (ORACLE_HOME = H:\oracle\product\10.2.0\db_2)
      (SID_NAME = TEST2)
)
此时primary server、standby server上的tnsnames.ora文件可以做如下改动:
TEST1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = sjzx-2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TESTA_DGMGRL.DG))
    )
  )

TEST2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 20081208-1335)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = TESTB_DGMGRL.DG))
    )
  )
  1. 设置DG_BROKER_START为TRUE
    这一步是启动Data Guard Broker monitor(DMON)进程,需要在2个数据库上面都运行下面的命令
alter system set dg_broker_start=true scope=both;

当以上准备工作完成后,就可以进行broker的配置了。
5. 配置broker(在DGMGRL中完成)
a) 使用DGMGRL连接到primary

dgmgrl sys/sysdba@test1

b) 查看配置信息

show configuration

–当前没有配置信息

c) 创建一个配置

create configuration 'FSF' as
primary database is 'TESTA'
connect identifier is TEST1;

d) 将standby加入配置中

add database 'TESTB' as
connect identifier is TEST2
maintained as physical;

e) 以上broker的基本配置完成。现在可以查看一下配置信息

show configuration

f) 在上一个步骤查看配置信息时会发现,配置是disable状态。我们需要将它enable

enable configuration

g) 此时我们在show configuration一下,会发现状态是enable,也能查看各个数据库的状态,配置状态。

  1. 在配置broker完成后,我们就可以利用broker完成switchover了。在DGMGRL中只需要简单的一个命令。
switchover to standby-database 

(standby-database: 此参数是db_unique_name,大小写敏感。如果名称是大写的,需要用引号。表示切换standby-database为主机,原主机转换为备机状态)
例如,现在,TESTA是primary,所以可以利用命令

switchover to "TESTB"

将TESTB切换为primary。
切换过程中,可以在DGMGRL中看到实际操作和操作进度。
如果在切换过程中,发现无法自动启动instance,可以检查listener是否配置正确。

至此,Data Guard Broker配置结束。
4. 配置及启用Fast-Start Failover:
Fast-Start Failover是建立在broker基础上的一个快速故障转换的机制,通过fast-start failover可以自动检测primary的故障,然后自动的failover到预先指定的standby上面,这样可以最大化的减少故障时间,提高数据库的可用性。
Fast-Start Failover是在broker的基础上再增加了一个单独的observer,用来监控primary和standby数据库的状态,一旦primary不可用,observer就会自动的切换到指定的standby上面。

下面介绍配置过程。

首先是一些配置准备。

  1. primary 与 standby 启用flashback database
--sqlplus
alter database flashback on;
select flashback_on,force_logging from v$database;
  1. 确保broker配置为运行在MAX Availability模式
    可以通过命令show configuration查看当前broker的运行模式。一般来说,根据上述步骤下来,broker应该运行在MaxPerformance模式。
--DGMGRL
show resource verbose 'TESTA' logxptmode on site 'TESTA';
show resource verbose 'TESTB' logxptmode on site 'TESTB';
alter resource 'TESTB' set property logxptmode='SYNC';
alter resource 'TESTA' set property logxptmode='SYNC';
edit configuration set protection mode as maxavailability;
  1. 选定第三台机器,安装DGMGRL,用于启动observer,这里命令为observer server

  2. 配置observer server的配置tnsnames.ora文件,保证observer能正常连接到 primary 和 standby 数据库。

下面开始配置Fast-Start Failover(均在DGMGRL中完成)
5. 配置每个数据库Failover的目标。这一步是决定当数据库出问题后会自动failover目标

edit database 'TESTA' set property 'FastStartFailoverTarget'='TESTB';
edit database 'TESTB' set property 'FastStartFailoverTarget'='TESTA';
  1. 设定FastStartFailoverThreshold值。这个设置是决定了primary坏了多长时间之后会执行自动的failover操作。这里设置的是30s
edit configuration set property FastStartFailoverThreshold=30;
  1. 启用Fast-Start Failover
ENABLE FAST_START FAILOVER;
  1. 在observer server上启动observer
start observer

注意启动observer后,DGMGRL就会阻塞在这个命令上。observer的操作信息以后会在这个窗口显示

  1. 可以另开一个DGMGRL,查看环境状态
show configuration verbose

这样,Fast-Start Failover的配置也完成了。我们可以通过拔掉primary的网线,或者kill掉primary上的oracle进程方式来测试是否可以自动切换。但是,将primary的oracle进行正常的shutdown操作,不会引起Fast-Start Failover。

发布了57 篇原创文章 · 获赞 85 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41944882/article/details/103068537