http://www.cnblogs.com/fygh/archive/2012/05/25/2518416.html
目标:
主机做了Mirror和Replication,当主机出现问题时,Replication和Mirror实现自动的故障转移(Mirror 和Replication都切换到备机,而当主机
重新启动后,自动充当备机的角色)。
环境:
五台虚拟机,配置均为Windows2008 Enterprise + SQLServer2008R2 Enterprise
08R201:Mirror 见证机(WITNESS) IP:192.168.56.101
08R202:主机(Rep+Mirror) IP:192.168.56.102
08R203:Rep分发机 IP:192.168.56.103
08R204:Rep订阅机 IP:192.168.56.104
08R205:镜像机(Mirror) IP:192.168.56.105
步骤:
配置有见证服务器的镜像
- 创建证书和Endpoint
08R202(Master) 上运行下面的脚本:
--主机执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456abc';
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
START_DATE = '11/08/2010',EXPIRY_DATE = '10/31/2099';
--主机执行:
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
--主机执行:
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:HOST_A_cert.cer';
08R205(Mirror) 上运行下面的脚本:
--备机执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456abc';
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
START_DATE = '11/08/2010',EXPIRY_DATE = '10/31/2099';
--备机执行:
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
--备机执行:
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:HOST_B_cert.cer';
08R201(WITNESS) 上运行下面的脚本:
--见证机执行
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456abc';
CREATE CERTIFICATE HOST_W_cert WITH SUBJECT = 'HOST_W certificate',
START_DATE = '11/08/2010',EXPIRY_DATE = '10/31/2099';
--见证机执行
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_W_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
--见证机执行
BACKUP CERTIFICATE HOST_W_cert TO FILE = 'D:HOST_W_cert.cer';
- 交换证书
将HOST_B_cert.cer和HOST_W_cert.cer拷贝到 08R202 机器的”D:Cert“目录;
将HOST_A_cert.cer和HOST_W_cert.cer拷贝到 08R205 机器的”D:Cert“目录;
将HOST_A_cert.cer和HOST_B_cert.cer拷贝到 08R201 机器的”D:Cert“目录;
08R202(Master) 上运行下面的脚本:
--Master
CREATE LOGIN HOST_B_login WITH PASSWORD = '123abc!@#';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:CertHOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
CREATE LOGIN HOST_W_login WITH PASSWORD = '123abc!@#';
CREATE USER HOST_W_user FOR LOGIN HOST_W_login;
CREATE CERTIFICATE HOST_W_cert AUTHORIZATION HOST_W_user FROM FILE = 'D:CertHOST_W_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_W_login];
08R205(Mirror) 上运行下面的脚本:
--Mirror
CREATE LOGIN HOST_A_login WITH PASSWORD = '123abc!@#';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:CertHOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
CREATE LOGIN HOST_W_login WITH PASSWORD = '123abc!@#';
CREATE USER HOST_W_user FOR LOGIN HOST_W_login;
CREATE CERTIFICATE HOST_W_cert AUTHORIZATION HOST_W_user FROM FILE = 'D:CertHOST_W_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_W_login];
08R201(WITNESS) 上运行下面的脚本:
--WITNESS
CREATE LOGIN HOST_A_login WITH PASSWORD = '123abc!@#';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:CertHOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
CREATE LOGIN HOST_B_login WITH PASSWORD = '123abc!@#';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:CertHOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
- 备份还原数据库
08R202(Master) 上备份数据库:
BACKUP DATABASE RepTest TO DISK='D: empRepTest.bak'
BACKUP LOG RepTest TO DISK='D: empRepTest.trn'
将备份文件拷贝到 08R205(Mirror) 上做还原(最好以SA帐号登录,使得数据库所有者为”SA“):
--RESTORE
RESTORE DATABASE RepTest FROM DISK = N'D:RepTest.bak'
WITH FILE = 1,
MOVE N'RepTest' TO N'D:DataRepTest.mdf',
MOVE N'RepTest_log' TO N'D:DataRepTest_log.ldf',
NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG RepTest FROM DISK ='D:RepTest.trn' WITH NORECOVERY
- 建立镜像
在08R205(Mirror) 上执行:
--Mirror
ALTER DATABASE RepTest SET PARTNER = 'TCP://192.168.56.102:5022';
在 08R202(Master)上执行:
ALTER DATABASE RepTest SET PARTNER = 'TCP://192.168.56.105:5022';
ALTER DATABASE RepTest SET WITNESS = 'TCP://192.168.56.101:5022';
ALTER DATABASE RepTest SET SAFETY FULL
到此,镜像已经建立完成。
配置Replication(事务型复制)
Replicaiton不做具体的搭建过程,只做几点说明:
1. 08R202和08R205都需要搭建到08R203的Distribution;
2. 08R202和08R205上的发布库的所有者必须为“SA”,否则切换会出现如下错误:The process could not execute 'sp_replcmds' on 'WIN-08R205'.
3. 08R203分发机上配置文件需要做如下修改(配置故障转移Partner):
--配置复制故障转移参数
--查看代理配置,在分发服务器运行
exec sp_help_agent_profile
--Agent_Type含义
--1 = Snapshot Agent; 2 = Log Reader Agent; 3 = Distribution Agent;
--4 = Merge Agent; 9 = Queue Reader Agent.
--对于事务复制,需查看Agent_Type=1,2的Profile_id
--对于事务复制,需要配置快照代理(Snapshot Agent)和日志读取代理(Log Reader Agent)
exec sp_add_agent_parameter @profile_id = 1,
@parameter_name = N'-PublisherFailoverPartner',
@parameter_value = N'WIN-08R205'--镜像服务器名称
exec sp_add_agent_parameter @profile_id = 2,
@parameter_name = N'-PublisherFailoverPartner',
@parameter_value = N'WIN-08R205'--镜像服务器名称
修改完成后,记得重启Agent服务,使之生效。
4. 从08R202创建到08R204的同步链。
模拟故障转移并观察结果
1. 暂停08R202的SQLServer服务;
2. 到08R205上观察镜像和同步链是否转移过去了;
3. 如果同步链正常,修改某个表中的数据,看是否能同步到08R204上;
4. 重新启动08R202的SQLServer服务,看其是否成为了镜像机;
5. 如果一起都正常,那恭喜啦,我们的测试成功。