下列问题和解答就复制数据库管理员所面临的多种任务提供指导。
配置复制
在将数据库发布时,是否需要停止其中的活动?
否。 创建出版物时,活动仍可在数据库上继续进行。 注意,生成快照可能占用大量资源,因此最好在数据库活动较少的期间生成快照(默认情况下完成新建发布向导后就生成快照)。
快照生成期间是否锁定表?
锁定持续的时间取决于所使用的复制类型:
对于合并发布,快照代理不使用任何锁。
对于事务性发布,默认情况下,快照智能体仅在快照生成的初始阶段获取锁定。
在进行快照发布时,快照代理在整个快照生成过程中都会进行锁定。
由于锁会阻止其他用户更新表,所以应把快照代理安排在数据库活动较少的期间执行,对快照发布尤其如此。
订阅何时可用?何时可以使用订阅数据库?
将快照应用在订阅数据库后,订阅将可用。 尽管在此之前可以访问订阅数据库,但在快照应用完成之前不应使用该数据库。 使用复制监视器检查快照生成和应用的状态:
如果分发智能体或合并智能体启动时快照智能体尚未完成,会发生什么情况?
如果分发代理或合并代理和快照代理同时运行,不会引发错误。 但是,必须注意下列事项:
如果分发智能体或合并智能体配置为持续运行,则在快照智能体完成后,该智能体会自动应用快照。
如果将分发代理或合并代理配置为按计划运行或按需运行,而且在代理运行时不存在可用的快照,则代理将关闭,并显示一条快照尚不可用的消息。 在快照智能体完成任务后,您必须重新运行该智能体以应用快照。 有关运行代理的详细信息,请参阅同步推送订阅、同步请求订阅和复制代理可执行文件概念。
是否应为复制配置编写脚本?
是的。 为复制配置编写脚本是任何复制拓扑的灾难恢复计划的关键。 有关编写脚本的详细信息,请参阅 Scripting Replication。
复制数据库需要什么样的恢复模式?
无论使用哪种恢复模型(简单、批量日志或完整),复制都能正常运行。 合并复制通过在元数据表中存储信息来跟踪更改。 事务复制通过标记事务日志来跟踪更改,但此标记过程不受恢复模式影响。
复制为什么要向已复制的表添加一列;如果表并未发布,是否会删除该列?
为了跟踪更改,合并复制和具有队列更新订阅的事务复制必须能够唯一标识每个发布表中的每一行。 为实现这一点:
合并复制向每个表添加 rowguid 列,除非表中已包含一个具有 ROWGUIDCOL 属性集且数据类型为 uniqueidentifier 的列(这种情况下将使用此列)。 如果从发布中删除表,则删除 rowguid 列;如果将现有列用于跟踪,则不删除该列。
如果事务发布支持排队更新订阅,复制就会向每个表添加 msrepl_tran_version 列。 如果从发布中删除表,则不会删除 msrepl_tran_version 列。
筛选器不能包含复制所用的 rowguidcol 来标识行。 默认情况下,这是您设置合并复制时添加的列,命名为 rowguid。
如何管理已发布表的约束?
关于已发布表的约束,有以下几点需要考虑:
事务复制要求每个已发布表都有主键约束。 合并复制不需要主键,但如果存在一个主键,则必须复制该主键。 快照复制不需要主键。
默认情况下,主键约束、索引和检查约束都会复制到订阅服务器。
默认情况下为外键约束和检查约束指定 NOT FOR REPLICATION 选项;约束对用户操作强制使用,但不对代理操作强制使用。
有关设置控制是否复制约束的架构选项的信息,请参阅 Specify Schema Options。
如何管理标识列?
对于包含订阅方更新操作的复制拓扑,复制功能会提供自动标识符范围管理。 有关详细信息,请参阅复制标识列。
是否可以在不同的发布中发布相同的对象?
是,但有一些限制。 有关详细信息,请参阅发布数据和数据库对象主题中的“在多个发布中发布表”部分。
多个发布项是否可以使用同一个分发数据库?
是的。 对于可以使用同一分发数据库的发布的数量或类型没有任何限制。 来自给定发布服务器的所有发布都必须使用同一分发服务器和分发数据库。
如果有多个发布,则可以在分发服务器上配置多个分发数据库,以确保通过每个分发数据库的数据流都来自单个发布。 使用“分发服务器属性”对话框或 sp_adddistributiondb (Transact-SQL) 添加分发数据库。 有关访问该对话框的详细信息,请参阅查看和修改分发服务器和发布服务器属性。
如何查询发布服务器和分发服务器中的信息,例如数据库中哪些对象已发布?
此信息可通过 SQL Server Management Studio 和许多复制存储过程获得。 有关详细信息,请参阅 Distributor and Publisher Information Script。
复制是否加密数据?
否。 复制不对数据库中存储的数据或网络上传输的数据加密。 有关详细信息,请参阅主题查看和修改复制安全设置的“加密”部分。
如何在 Internet 上复制数据?
使用以下方式在 Internet 上复制数据:
虚拟专用网络 (VPN)。 有关详细信息,请参阅使用 VPN 通过 Internet 发布数据。
对于合并复制,使用 Web 同步选项。 有关详细信息,请参阅 Web Synchronization for Merge Replication。
所有类型的 Microsoft SQL Server 复制都可以通过 VPN 来复制数据。但如果使用的是合并复制,应考虑使用 Web 同步。
如果删除连接,复制是否可以继续
是的。 如果删除连接,复制处理可从停止处继续。 如果在不可靠的网络上使用合并复制,则请考虑使用逻辑记录,这可确保把相关更改作为一个单元来处理。 有关详细信息,请参阅使用逻辑记录对相关行进行分组更改。
复制是否可以在低带宽连接上工作? 它是否使用压缩?
是,复制的确可以在低带宽连接上工作。 对于通过 TCP/IP 的连接,它使用协议提供的压缩,但不提供额外的压缩。 对于通过 HTTPS 建立的 Web 同步连接,它会使用该协议提供的压缩功能,并对用于复制更改的 XML 文件进行额外压缩。
如果使用 IP 地址连接到服务器,是否可以配置复制?
否。只有使用实际的服务器名称时,复制才有效。 从 SQL Server Management Studio (SSMS) 18.0 (以及更高版本)开始,可以使用实际的服务器名称和端口号来配置复制。
登录名和对象所有权
是否复制登录名和密码?
否。 可以创建 SSIS 包,将登录名和密码从发布服务器传输到一个或多个订阅服务器。
什么是架构,如何复制架构?
从 Microsoft SQL Server 2005 (9.x) 版本开始,架构 具有两种含义:
对象的定义,如
CREATE TABLE语句。 默认情况下,复制把所有已复制对象的定义都复制到订阅服务器。在其中创建对象的命名空间:<数据库>.<架构>.<对象>。 架构使用
CREATE SCHEMA语句定义。在新建发布向导中,复制在架构和对象所有权方面具有以下默认行为:
对于兼容性级别为 90 或更高的合并发布、快照发布和事务发布中的项目:默认情况下,订阅服务器中的对象所有者与发布服务器中相应对象的所有者相同。 如果订阅服务器中不存在拥有对象的架构,将自动创建这些架构。
对于兼容性级别低于 90 的合并发布中的文章:默认情况下,所有者字段留空,并在订阅方创建对象时指定为 dbo。
对于 Oracle 发布中的项目:默认情况下,所有者指定为 dbo。
对于使用字母数字模式快照(用于非 SQL Server 订阅服务器以及 SQL Server Compact 订阅服务器)的发布中的项目:默认情况下,所有者保留为空。 所有者默认为与分发智能体或合并智能体用于连接订阅方的帐户相关联的所有者。
可通过“文章属性 - <文章”对话框,以及以下存储过程来更改对象所有者:sp_addarticle、>、sp_changearticle 和 sp_changemergearticle。 有关详细信息,请参阅查看和修改发布属性、定义项目和查看和修改项目属性。
如何配置订阅数据库上的授权,以使其与发布数据库上的授权相匹配?
默认情况下,复制不会对订阅数据库执行 GRANT 语句。 如果希望订阅数据库上的权限与发布数据库上的权限相匹配,请使用下列方法之一:
直接在订阅数据库中执行 GRANT 语句。
使用快照后脚本来执行这些语句。 有关详细信息,请参阅在应用快照之前和之后执行脚本。
使用存储过程 sp_addscriptexec 执行语句。
如果重新初始化订阅,订阅数据库中授予的权限会怎样?
默认情况下,当订阅被重新初始化时,订阅方的对象会被删除并重新创建,这将导致撤销为这些对象授予的所有权限。 有两种方法可以处理此种情况:
重新初始化后,请使用上一节中描述的方法重新应用授权。
指定重新初始化订阅时不应删除对象。 重新初始化之前,进行以下两项操作之一:
执行 sp_changearticle 或 sp_changemergearticle。 将参数 的值指定为“pre_creation_cmd”(sp_changearticle) 或“pre_creation_command”(sp_changemergearticle),并将参数 的值指定为“none”、“delete”或“truncate”
@property@value。在“目标对象”部分中的“项目属性 - <项目>”对话框中,选择一个值“保留现有对象不变”,“删除数据。如果项目具有行筛选器,请仅删除与筛选器匹配的数据。”或者为“名称已被使用时的操作”选择“截断现有对象中的所有数据”。 有关访问此对话框的详细信息,请参阅查看和修改发布属性。
数据库维护
为什么无法在已发布的表上运行 TRUNCATE TABLE?
TRUNCATE TABLE 是一个 DDL 语句,该语句不记录单个行删除,并且不触发 DML 触发器。 这是不允许的,因为复制无法跟踪该操作引起的更改:事务复制通过事务日志跟踪更改;合并复制通过发布表上的 DML 触发器跟踪更改。
在复制的数据库上运行大容量插入命令,会产生什么效果?
对于事务复制,批量插入与其它插入操作一样被跟踪和复制。 对于合并复制,必须确保更改跟踪元数据已正确更新。
对于备份和还原,是否存在复制注意事项?
是的。 对于复制所涉及数据库有许多特别注意事项。 有关详细信息,请参阅 备份和还原复制的数据库。
复制是否影响事务日志的大小?
合并复制和快照复制不影响事务日志的大小,但事务复制可能会影响。 如果数据库包含一个或多个事务性发布,则在与这些发布相关的所有事务都已传递到分发数据库之前,日志不会被截断。 如果事务日志增长得过大,而且日志读取器代理按计划运行,请考虑缩短运行间隔。 或者,将其设置为连续模式运行。 如果将其设置为以连续模式运行(默认值),请确保它正在运行。 有关检查日志读取器代理状态的详细信息,请参阅使用复制监视器查看信息和执行任务。
此外,如果在发布数据库或分发数据库上设置了“与备份同步”选项,则在所有事务都已备份之前,事务日志不会被截断。 如果事务日志增长过大,而且已设置了此选项,请考虑缩短事务日志备份间的间隔。 有关备份和还原涉及到事务复制的数据库的详细信息,请参阅快照复制和事务复制的备份和还原策略。
如何在复制的数据库中重新生成索引或表?
有许多用于重新生成索引的机制。 这些机制都可以使用,且对于复制并没有特别的注意事项,但下述情况例外:事务发布中的表必须具有主键,因此无法删除并重新创建这些表的主键。
如何在发布数据库和订阅数据库上添加或更改索引?
可以在发布者或订阅者中添加索引,并且无需针对复制进行特别考虑(需要注意,索引可能会影响性能)。
CREATE INDEX 和 ALTER INDEX 不会被复制,因此,如果您想要某个变更反映在订阅者那里,则在发布者处添加或更改索引时,必须在订阅者处执行相同的添加或更改。
如何对复制所涉及的数据库的文件进行移动和重命名?
在早于 SQL Server 2005 (9.x) 的 SQL Server 版本中,移动或重命名数据库文件需要分离并重新附加数据库。 因为无法分离复制的数据库,所以必须首先从这些数据库中删除复制。 从 SQL Server 2005 (9.x) 版本开始,无需分离并重新附加数据库便可移动或重命名文件,且不会影响复制。 有关移动和重命名文件的详细信息,请参阅 ALTER DATABASE (Transact-SQL)。
如何删除正在复制的表?
首先使用 sp_droparticle、sp_dropmergearticle 或“发布属性 - <发布>”对话框从发布中删除项目,然后使用 DROP <Object> 将其从数据库中删除。 在添加订阅后,您无法从快照发布或事务性发布中删除文章;必须先删除订阅。 有关详细信息,请参阅向现有出版物添加文章和删除文章。
如何在已发布的表中添加或删除列?
SQL Server 支持对已发布对象进行各种架构更改,包括添加和删除列。 例如,在发布服务器上执行 ALTER TABLE … DROP COLUMN,该语句将复制到订阅服务器,然后执行以删除列。 运行早于 SQL Server 2005 (9.x) 的 SQL Server 版本的订阅服务器支持通过存储过程 sp_repladdcolumn 和 sp_repldropcolumn 添加和删除列。 有关详细信息,请参阅对发布数据库进行架构更改。
数据复制维护
如何确定订阅服务器的数据是否与发布服务器的数据同步?
使用验证。 验证报告会检查给定的订阅者是否与发布者同步。 有关详细信息,请参阅验证已复制的数据。 验证不会提供与某些行是否未正确同步有关的信息,而 tablediff 实用工具 可以提供此信息。
如何向现有发布添加表?
不必为了添加表(或另一个对象)而停止发布数据库或订阅数据库上的活动。 通过“发布属性 - <发布>”对话框或存储过程 sp_addarticle 和 sp_addmergearticle 将表添加到发布。 有关详细信息,请参阅向现有出版物添加文章和删除文章。
如何从文档中删除表?
使用 sp_droparticle、sp_dropmergearticle 或“发布属性 - <发布>”对话框从发布中移除表。 在添加订阅后,您无法从快照发布或事务性发布中删除文章;必须先删除订阅。 有关详细信息,请参阅向现有出版物添加文章和删除文章。
哪些操作需要重新初始化订阅?
某些文章和发布变更会要求重新初始化订阅。 有关详细信息,请参阅更改发布和项目属性。
什么操作会导致快照失效?
某些文章和发布变更会导致快照失效,并需要生成新的快照。 有关详细信息,请参阅更改发布和项目属性。
如何删除复制?
从数据库删除复制所需的操作取决于数据库是作为发布数据库、订阅数据库使用,还是同时作为这两种数据库使用。
如何确定是否有待复制的事务或行?
对于事务复制,请使用存储过程或复制监视器中的 “未分发的命令” 选项卡。 有关详细信息,请参阅在分发数据库中查看复制的命令和其他信息(复制 Transact-SQL 编程)和使用复制监视器查看信息和执行任务。
对于合并复制,请使用 sp_showpendingchanges 存储过程。 有关详细信息,请参阅 sp_showpendingchanges (Transact-SQL)。
分发代理滞后多少? 是否应重新初始化?
使用 sp_replmonitorsubscriptionpendingcmds 存储过程或复制监视器中的 “未分发的命令” 选项卡。 存储过程和选项卡显示:
分发数据库中尚未传递给所选订阅者的命令数量。 一个命令由一个 Transact-SQL 数据操作语言 (DML) 语句或一个数据定义语言 (DDL) 语句组成。
将命令传递到订阅服务器所需的估计时间。 如果此值大于生成快照并将其应用于订阅服务器所需的时间,请考虑重新初始化订阅服务器。 有关详细信息,请参阅 重新初始化订阅。
有关详细信息,请参阅 sp_replmonitorsubscriptionpendingcmds (Transact-SQL) 和使用复制监视器查看信息并执行任务。
复制和其他数据库功能
复制是否可与日志传送和数据库镜像一起进行?
是的。 有关详细信息,请参阅日志传送和复制 (SQL Server) 和数据库镜像和复制 (SQL Server)。
复制是否可与聚类分析一起进行?
是的。 没有需要特别注意的事项,因为所有数据都存储在群集上的一组磁盘中。
如何基于 SQL 复制对第三方解决方案进行故障排除?
如有任何问题,建议联系第三方供应商以获得支持。 通常,如果供应商将问题隔离为 SQL Server 附带的核心复制问题,则 Microsoft 支持人员会提供进一步帮助。