第三篇 Replication:事务复制-发布服务器

时间:2021-12-20 19:39:05

本篇文章是SQL Server Replication系列的第三篇,详细内容请参考原文


发布服务器是所有复制数据的源头。每一个发布服务器上可以定义多个发布。每一个发布包含一组项目(项目在同一个数据库下)。每一个项目对应一个数据库对象的全部或部分。一个数据库对象能够映射到多个发布中的项目。
配置发布
为了能够创建发布,你必须先把发布服务器与分发服务器联系起来。分发服务器可以是相同的SQL Server实例(Local Distributor)或者另一台机器上的单独实例(Remote Distributor).配置分发和创建发布与分发之间的链接可以参考第二篇文章。
谁能创建一个发布
只要sysadmin固定服务器角色成员为复制启用了数据库,数据库中任何db_owner固定数据库角色的成员可以定义一个发布。为复制启用数据库,对象资源管理器下连接到发布服务器,右击复制,选择"发布服务器属性",如图3.1所示
第三篇 Replication:事务复制-发布服务器
图3.1 发布服务器属性
对话框有两个页签,第一个页签(常规)允许你更改管理链接密码,用于连接到分发服务器。第二个页签(发布数据库),如图3.2所示,就是为发布启用数据库的地方。对于每一个数据库你可以选择事务复制和/或合并复制。
第三篇 Replication:事务复制-发布服务器
图3.2 启用发布数据库
新建发布
一旦你的发布服务器有一个关联分发服务器,并且你想发布的数据库已经被启用,对象资源管理器下连接到发布服务器。打开复制文件夹,右击本地发布,选择新建发布,如图3.3所示

--创建发布前修改测试数据
use [ReplA]
go
--更新表[Test]
alter table [dbo].[Test] add [data2] int
update [dbo].[Test] set [data2]=[data]/id
go
--存储过程
create proc [dbo].[proc1]
as
select * from dbo.Test
go
--视图
create view [dbo].[view1]
as
select * from dbo.Test
go
--索引视图
create view [dbo].[view2]
with schemabinding
as
select id,Data from dbo.Test
go
--函数
create function [dbo].[func1](@i int)
returns int
as
begin
declare @int bigint
select @int=@i*3
return @int
end
go

第三篇 Replication:事务复制-发布服务器
图3.3 新建发布
新建发布向导被打开,第一个需要做选择的是发布数据库页面(图3.4)
第三篇 Replication:事务复制-发布服务器
图3.4 选择发布数据库
选择你想要发布的数据库,然后到下一个页面。这里,如图3.5所示,你可以选择发布类型。正如我们刚才讨论的事务复制,选择"事务发布"
第三篇 Replication:事务复制-发布服务器
图3.5 选择发布类型
其他的选项是"快照发布","具有可更新订阅的事务发布/对等发布","合并发布"。在第一篇简单介绍了快照和合并复制。合并复制在后面章节会详细讲述。
具有可更新订阅的事务发布是一个高级主题,它允许订阅传播更改到发布服务器。这不是一个真正的双向设置,如果你的目标是双向复制,请选择合并复制。如果你的数据库是企业版,你也可以使用对等事务复制,它是真正双向的。更多关于高级主题参考Books Online.
项目
发布类型选好后,下一步定义复制的项目。一个项目通常是发布数据库中的一个单一对象。如图3.6所示,项目页面显示了所有可以复制的对象。列表中的对象包括表、存储过程、视图、索引视图和用户定义函数。
表项目默认复制表中数据的变更和表的结构变更。对于存储过程,你可以选择复制存储过程的定义或存储过程的执行。对于视图和函数,只能复制架构。索引视图类似复制表,包括架构和数据变更。完整的复制列表请参考Publishing Data and Database Objects in Books Online.
第三篇 Replication:事务复制-发布服务器
图3.6 项目
对于表,你可以选择发布所有的列或部分列。如果你点击图3.6中的表名前面的小+号,所有的列就会在它下面出现(图3.7)。筛选列的唯一要求是主键必须选上,其他列可以忽略(向导不允许所有的列都不选)。这种类型的筛选来选择特别的列叫做垂直筛选
第三篇 Replication:事务复制-发布服务器
图3.7 筛选列
项目属性(图3.6中)按钮可以为发布中的每个项目设置选项。部分选项如图3.8所示。你也可以为单一类型下的所有项目设置选项。根据你所选择的项目类型,可用选项的列表会有所不同。这里你可以定义目标对象的名称,如果目标对象已存在如何处理,设置你想只复制存储过程的定义或者是复制存储过程的执行等。详细信息参考Publishing Data and Database Objects in Books Online.
第三篇 Replication:事务复制-发布服务器
图3.8 项目属性
如果你为发布选择了至少一张表,向导接下来的页面将允许你定义行筛选。筛选类似于SELECT语句中定义一个WHERE子句。这种类型的筛选叫做水平筛选,如图3.9所示
第三篇 Replication:事务复制-发布服务器
图3.9 定义水平筛选
快照
在项目定义好之后,下一步就是设置源到目标用于初始化同步的快照的计划。快照代理用于创建对象定义和数据的副本,并将它们保存到分发上的快照文件夹。
你可以选择立即创建快照,或计划让它以后执行,如图3.10所示。如果你打算计划这个执行,你可以创建一个计划使用SQL代理作业计划中所有可用的选项。
对于一个发布只有一个订阅的情况下,最好是立即创建快照。如果你经常需要同步或重新同步订阅,定期更新快照能确保你获取最新的数据。记住,创建一个快照,尤其对于大表,是非常昂贵的。默认生成快照需要对所有参与的表加表锁直到整个快照生成过程完成。依赖表的大小和网络传输速率,这可能花费几小时。There are ways to make snapshot generation less intrusive, but the SSMS GUI does not give us access to those settings.
第三篇 Replication:事务复制-发布服务器
图3.10 快照计划
安全性
下一步是设置代理在哪个帐户下运行
第三篇 Replication:事务复制-发布服务器
图3.11 代理安全性
事务发布中有两个代理参与:快照代理和日志读取器代理。
对于快照代理,你可以提供一个Windos帐户或者你可以选择SQL Server代理服务帐户下运行。图3.12显示了这两个选项。参考资料警告后一个选择不是我们推荐的最佳安全配置。
第三篇 Replication:事务复制-发布服务器
图3.12 代理帐户
页面的第二部分显示如何连接到发布服务器。你可以为代理选择使用Windows认证或提供一个SQL登录名连接到发布服务器。
对于日志读取器代理,你有同样的选择。你也可以直接勾选使用快照代理的安全设置。
每一个发布都有一个快照代理,每一个发布数据库只有一个日志读取器代理。If you already have a publication defined you cannot change the log reader agent account at this point.但是对于新发布,你可以为日志读取器代理定义一个不同的SQL Server登录名连接到发布数据库。
快照代理负责从发布数据库移动数据到快照文件夹/共享,以及分发数据库。为了能够做这些,快照代理帐户需要是发布数据库和分发数据库中的db_owner固定数据库角色的成员。这个帐户还需要对快照文件夹/共享有写入权限。如果你选择使用SQL Server认证连接到发布服务器,这个SQL帐户需要是发布数据库中的db_owner固定数据库角色的成员。这种情况下,快照代理帐户就不需要有访问发布数据库的权限。
日志读取器代理同样会从发布数据库拷贝数据到分发数据库,但它不使用快照文件夹,因此日志读取器代理帐户需要是分发数据库中的db_owner固定数据库角色的成员。连接到发布服务器的帐户(不管是日志读取器代理帐户它自己还是SQL Server登录名)需要是发布数据库中的db_owner固定数据库角色的成员。
完成发布配置
在配置完代理帐户,还会有两个向导页面。第一个是向导操作,询问你在向导结束时是创建发布,还是生成包含创建发布的步骤和脚本文件。
第二个页面,如图3.13,显示总结并要求你为发布命名(MySecondPublication)。这个名称在每一个发布数据库下必须唯一。如果你是发布不同的数据库,你可以重新使用相同的名称。然后,如果你有多个发布,我强烈建议使用有含义并能够区分的名称。在每个复制设置中都有大量的移动部件。There is no need to cause additional confusion by choosing the same or similar names for multiple publications.
第三篇 Replication:事务复制-发布服务器
图3.13 设置发布名称
潜在问题
在配置发布时有许多步骤和选择,有可能复制进程的某些方面没有配置正确。最常见的问题是代理帐户没有合适的权限。
如果你遇到这样的问题,你应该检查所有的帐户确保已经授予正确的权限。这些错误信息通常不会指向正确的方向。例如,"远程服务器WORK\SQL08R2不存在,未被指定为有效的发布服务器…",意味着快照代理不能访问分发数据库。It is also not always straight forward to find the error messages in the first place.详细检查复制问题会在第九篇讲到。
如果你使用分发服务器上的一个快照共享,你需要给快照代理帐户对共享和底层文件夹的写入权限。
如果你为不同的代理使用Windows域用户,并且通过模拟进程用户连接到其他服务器,you might have to grant the Windows account that is executing the SQL Server Service read access to the Active Directory.
In general it is advisable to execute the replication wizards when connected using a SQL Server Login (e.g. SA), instead of a Windows login. 有很多缘由已经超出本系列的范畴。通常你会有更少的问题,如果你所处理的对象的所有者是SQL Server登录而不是Windows登录映射的用户。
使用SA运行向导,避免你陷入这样的困境。
总结
这一篇讲述了发布服务器。我们学习了谁可以创建发布,如何添加项目(什么类型的项目)到发布。我们查看如何计划快照生成,事务复制发布中不同代理需求什么权限。还指出可能会遇到的潜在问题。
类似分发服务器,在配置好发布服务器后也看不到很多东西。但是有两个很明显的迹象,一个是你可以在对象资源管理器的本地发发看到新发布,如图3.12所示
第三篇 Replication:事务复制-发布服务器
图3.14 本地发布
另一个不是那么直接可见的,但可能变得明显的问题。事实上发布项目上的所有变更现在都记录到分发数据库,只是没有人去读取它们而已。因此分发数据库会变大。