您的位置:首页 > 其它

事务复制和镜像共存性的测试

2015-01-31 14:48 239 查看
事务复制的发布库同时也是镜像的主库,测试的目的是当镜像发生故障转移时,事务复制关系是否能同时自动转移。
环境:JOEPC\SQLJOEC,DB_TEST1,DB_TEST2_VM三台机都是Win2008_R2_SP1+SQLServer2008_R2_SP1.
JOEPC,DB_TEST1都是物理机,DB_TEST2_VM是建立在DB_TEST1上的虚拟机。
关系说明:JOEPC\SQLJOEC是镜像关系的主体,是事务复制关系的发布者,
DB_TEST1是镜像关系的见证者,是事务复制的分发者和订阅者,
DB_TEST2_VM是镜像关系的镜像端。
1. 首先在JOEPC\SQLJOE上创建测试库和表。
USE TEST


GO


CREATE TABLE dbo.tb_Test


(


ID INT NOT NULL,


VAL NVARCHAR(20)


)


GO


ALTER TABLE [dbo].[tb_Test] ADD CONSTRAINT PK_tbTest_ID PRIMARY KEY  CLUSTERED


(


[ID] ASC


)


GO


INSERT INTO dbo.tb_Test


        ( ID, VAL)


VALUES  (1,N'A'),(2,N'B'),(3,N'C'),(4,N'D')


,(5,N'E'),(6,N'F'),(7,N'G'),(8,N'H');


GO


2. 参考工作组模式下SQL Server 2008 R2 事务复制建立JOEPC\SQLJOE与DB_TEST1事务复制关系。

3. 参考工作组模式下SQL Server 2008 R2 数据库镜像建立JOEPC\SQLJOE为主体,DB_TEST2_VM为镜像,DB_TEST1为见证的镜像关系。

在这里我遇到一个问题见证机总是连接不上,最后放弃用代码来实现,用镜像配置向导重新配置,成功

4. 在分发服务器DB_TEST1上把镜像服务器DB_TEST2_VM加入到发布者。

这一步的目的:1.将镜像添加为发布者。2. 镜像成为发布者后与镜像主体使用同一个快照文件夹,同一个发布服务器。





5. 在分发服务器上执行以下代码。profile_id代表不同的配置文件,下面列出几个对应关系。

--查看代理配置文件


-- 1 = Snapshot Agent; 2 = Log Reader Agent; 3 = Distribution Agent; 4 = Merge Agent; 9 = Queue Reader Agent.


exec sp_help_agent_profile


--因为测试做的是事务复制,所以需要修改配置文件只包括Snapshot Agent,Log Reader Agent.


exec sp_add_agent_parameter @profile_id = 1, @parameter_name = N'-PublisherFailoverPartner',


@parameter_value = N'DB_TEST2_VM';


exec sp_add_agent_parameter @profile_id = 2, @parameter_name = N'-PublisherFailoverPartner',


@parameter_value = N'DB_TEST2_VM';


6.基本配置完成。测试验证一下,把JOEPC\SQLJOE的SQLSERVER服务停掉,看一下镜像和复制关系能否转移。

6.1 镜像关系成功转移过来了。





6.2 事务复制关系开始时遇到一个错误:“进程无法在“DB_TEST2_VM”上执行“sp_replcmds”。 (源: MSSQL_REPL,错误号: MSSQL_REPL20011)”。

这个错误是个权限问题,执行sp_replcmds需要sysAdmin权限,于是把TEST库的所有者改成SA。在DB_TEST2_VM上执行:

USE TEST


GO


EXEC sp_changedbowner 'SA','dbowner'


GO


OK,事务复制也正常了。不过还是插入两条数据看一下,能否同步到DB_TEST1下的订阅库TEST_Subscriber。

INSERT INTO dbo.tb_Test(ID,VAL) VALUES(9,N'I'),(10,N'J')


在DB_TEST1的订阅库TEST_Subscriber查询,发现数据没有同步过来。在日志读取代理的作业历史中找到“复制的事务正等待下一次日志备份或等待镜像伙伴更新”

在MSDN上找到:





这个测试中镜像用的正是“具有自动故障转移的高安全性模式”,并且“步骤6”中把JOEPC\SQLJOE的SQLSERVER停掉了。

所以只有当JOEPC\SQLJOE的SQLSERVER联机,重新构成镜像关系后,所做的修改才会从分发库传播到订阅库。

于是启动JOEPC\SQLJOE的SQLSERVER,果不其然,数据同步过去了。

总结:

1. 镜像主体库,可以同时做事务复制的发布库,并且能实现故障自动转移。

2. 我想要给一个7*24的关键库,用事务复制做读写分离,并且用“具有自动故障转移的高安全性模式”做热备。测试的结果有些鸡肋。

当镜像关系中,有一个伙伴离线,故障自动转移后所做数据修改不会传播到订阅端。那么读写分离的只读库的数据也严重滞后,而不可用。

--Add@20150113

3. 启用TF1448:事务复制和镜像共用时,改变LogReader的读取限,当镜像故障时仍然可以从Principle读取日志。

-------------------------------------

作者:Joe.TJ
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  虚拟机 三台