故障转移
dataugard的配置参考:http://blog.csdn.net/asdewq380303318/article/details/8865138
dataguard的主从切换:http://blog.csdn.net/asdewq380303318/article/details/8865306
1. 故障转移一般是主库发生故障之后需要恢复服务,在这个时候,将备库转换成为主库,但是不把主库转换成为备库,也就是说备库来充当主库对外提供服务直到主库的恢复工作完成,
2. 故障转移的准备工作:
a)首先我们要创建一个故障转移的服务,客户端直接通过这个服务连接到主库,但是客户端并不知道现在哪个是一主库,真正确定连接连接到主库是通过这个服务,执行下面的sql语句来创建这个服务:
begin
DBMS_SERVICE.CREATE_SERVICE (
service_name => 'JED_RW',
network_name => 'JED_RW',
aq_ha_notifications => TRUE,
failover_method => 'BASIC',
failover_type => 'SELECT',
failover_retries => 30,
failover_delay => 5);
end;
/
b)创建了这个服务之后,我们还要确保这个服务在库上启动,并且确定它只能在主库上启动,执行下面的sql语句来创建一个存储过程:
create or replace procedurecmc_taf_service_proc
is
v_role VARCHAR(30);
begin
select DATABASE_ROLE into v_role from V$DATABASE;
ifv_role = 'PRIMARY' then
DBMS_SERVICE.START_SERVICE('JED_RW');
else
DBMS_SERVICE.STOP_SERVICE('JED_RW');
endif;
end;
/
c)然后我们创建两个触发器,让数据库杂启动和角色转换的时候运行此存储过程:
create or replace TRIGGERcmc_taf_service_trg_startup
after startup on database
begin
cmc_taf_service_proc;
end;
/
create or replace TRIGGER cmc_taf_manage_trg_rolechange
after db_role_change on database
begin
cmc_taf_service_proc;
end;
/
d)我们执行一次存储过程,确定服务正在运行,然后归档当前日志,让以上更改同步到备库。
SQL> exec cmc_taf_service_proc;
SQL> alter systemarchive log current;
使用show parameter service_names就可以查看到我们刚才创建的服务了
e)最后我们配置客户端的tns名去连接它,客户端的tns明配置如下:
JED_RW =
(DESCRIPTION =
(ADDRESS_LIST=
(ADDRESS = (PROTOCOL = TCP)(HOST = dev-db1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = dev-db2)(PORT = 1521))
)
(CONNECT_DATA = (SERVICE_NAME = JED_RW)
(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=30)(DELAY=5))
)
)
到此,故障转移的准备工作就做完了。
3. 现在我们可以来测试下我们的故障转移是否成功
a)新开一个终端,使用下面的命令连接数据库,并查询现在连接数据库的唯一名:
SQL> connect system@JED_RW
SQL> select db_unique_name from v$database;
显示的结果就是我们现在连接的数据库
b)然后我们做一次主备切换,在备库转换成主库alter database commit to switchover to primarywith session shutdown;这一步的时候,我们在来查询一次数据库的唯一名
SQL> selectdb_unique_name from v$database;
这时,这一个查询应该就会挂住,这是因为客户端在尝试连接主机,但是有没有可以连接的主机,我们继续完成切换,最后这个条语句就可以返回数据, 这是返回来的唯一就是现在的主库。