复制管理员常见问题解答

以下问题和解答提供有关复制数据库的管理员面临的各种任务的指导。

配置复制

将数据库发布时是否需要停止数据库上的操作活动?

否。 创建发布时,活动可以在数据库上继续。 请注意,生成快照可能占用大量资源,因此最好在数据库上较低的活动期间生成快照(默认情况下,在完成新建发布向导时会生成快照)。

表在快照生成期间是否锁定?

锁定时间取决于所使用的复制类型。

  • 对于合并发布,快照代理不锁定任何内容。

  • 对于事务发布,默认情况下,快照代理仅在快照生成的初始阶段进行锁定。

  • 对于快照发布,快照代理在整个快照生成过程中会锁定。

由于锁会阻止其他用户更新表,因此快照代理应被安排在数据库的低活动期,尤其是涉及快照发布时执行。

何时提供订阅;何时可以使用订阅数据库?

将快照应用到订阅数据库后,可以使用订阅。 即使订阅数据库在此之前是可访问的,但在应用快照之前,不应使用该数据库。 使用复制监视器检查快照生成和应用程序的状态:

  • 快照由快照代理生成。 在复制监视器中的发布“代理”选项卡上查看快照生成状态。 有关详细信息,请参阅 使用复制监视器查看信息和执行任务

  • 快照由分发代理或合并代理应用。 在复制监视器的 “分发代理 ”或 “合并代理 ”页中查看快照应用程序的状态。

如果分发或合并代理启动时快照代理尚未完成,会发生什么情况?

如果分发代理或合并代理与快照代理同时运行,则不会引发错误。 但是,必须注意以下事项:

  • 如果分发代理或合并代理被配置为连续运行,代理会在快照代理完成后自动应用快照。

  • 如果分发代理或合并代理配置为按计划或按需运行,并且代理运行时没有可用的快照,代理将关闭,并显示一条消息,指出快照尚不可用。 在快照代理完成后,您必须再次运行该代理以应用快照。 有关运行代理的详细信息,请参阅 同步推送订阅同步请求订阅复制代理可执行文件概念

我应该编写复制配置的脚本吗?

是的。 编写复制配置脚本是复制拓扑的任何灾难恢复计划的关键部分。 有关脚本编写的详细信息,请参阅 脚本复制

复制的数据库需要什么恢复模式?

复制功能能够在以下任一恢复模式下正常工作:简单模式、大容量记录模式或完整模式。 合并复制通过将信息存储在元数据表中来跟踪更改。 事务复制通过标记事务日志来跟踪更改,但此标记过程不受恢复模式的影响。

复制为何向复制表添加列;如果表未发布,是否会将其删除?

为了跟踪更改,合并复制和带有队列更新订阅的事务复制必须能够唯一标识每个已发布表中的每一行。 为实现这一点:

  • 合并复制会将列 rowguid 添加到每个表中,除非该表已经具有一个数据类型为 uniqueidentifier 且设置了 ROWGUIDCOL 属性的列,在这种情况下将使用该列。 如果表已从发布中删除,则删除 rowguid 列;如果现有列用于跟踪,则不会删除该列。

  • 如果事务发布支持排队更新订阅,复制会将列 msrepl_tran_version 添加到每个表。 如果从发布中删除该表,则不会删除 msrepl_tran_version 列。

  • 筛选器不能包含复制所用的 rowguidcol 来标识行。 默认情况下,这是在设置合并复制时添加的列,并命名为 rowguid

如何管理已发布表的约束?

关于已发布表的约束,有许多问题需要考虑:

  • 事务复制需要每个已发布表都必须具备主键约束。 合并复制不需要主键,但如果存在,则必须复制它。 快照复制不需要主键。

  • 默认情况下,主键约束、索引和检查约束将复制到订阅服务器。

  • 默认情况下为外键约束和检查约束指定 NOT FOR REPLICATION 选项;约束对用户操作强制使用,但不对代理操作强制使用。

有关设置控制是否复制约束的架构选项的信息,请参阅 “指定架构选项”。

如何管理标识列?

复制为包含订阅服务器上的更新的复制拓扑提供自动标识范围管理。 有关详细信息,请参阅 “复制标识列”。

是否可以在不同的出版物中发布相同的对象?

是的,但存在一些限制。 有关详细信息,请参阅主题发布数据和数据库对象中的“在多个发布中发布表”部分。

多个出版物是否可以使用相同的分发数据库?

是的。 对可以使用同一分发数据库的发布数量或类型没有限制。 来自给定发布服务器的所有发布都必须使用相同的分发服务器和分发数据库。

如果有多个发布,则可以在分发服务器上配置多个分发数据库,以确保流经每个分发数据库的数据来自单个发布。 使用 “分发服务器属性 ”对话框或 sp_adddistributiondb(Transact-SQL) 添加分发数据库。 有关访问对话框的详细信息,请参阅 “查看和修改分发服务器”和“发布服务器属性”。

如何查找有关分发者和发布者的信息,例如数据库中有哪些对象被发布?

此信息可通过 SQL Server Management Studio 和许多复制存储过程获得。 有关详细信息,请参阅 分发服务器和发布服务器信息脚本

复制是否加密数据?

否。 复制不会加密存储在数据库中或通过网络传输的数据。 有关详细信息,请参阅 SQL Server 复制安全性主题的“加密”部分。

如何通过 Internet 复制数据?

使用以下命令通过 Internet 复制数据:

所有类型的 Microsoft SQL Server 复制都可以通过 VPN 复制数据,但如果您使用合并复制,建议考虑使用 Web 同步。

如果连接断开,复制是否会恢复?

是的。 连接断开时,复制处理将在中断的位置继续进行。 如果通过不可靠的网络使用合并复制,请考虑使用逻辑记录,这可确保相关更改作为一个单元进行处理。 有关详细信息,请参阅 使用逻辑记录对相关行的组更改

复制是否适用于低带宽连接? 它是否使用压缩?

是的,复制确实适用于低带宽连接。 对于通过 TCP/IP 建立的连接,它使用协议提供的压缩,但不提供额外的压缩。 对于通过 HTTPS 的 Web 同步连接,它使用协议提供的压缩,以及用于复制更改的 XML 文件的其他压缩。

登录名和对象所有权

是否复制登录名和密码?

否。 可以创建 DTS 包,将登录名和密码从发布服务器传输到一个或多个订阅服务器。

什么是架构及其复制方式?

从 Microsoft SQL Server 2005 开始, 架构 具有两个含义:

  • 对象的定义,例如 CREATE TABLE 语句。 默认情况下,复制会将所有复制对象的定义复制到订阅服务器。

  • 在其中创建对象的命名空间: <Database>。<架构>。<对象>。 架构是使用 CREATE SCHEMA 语句定义的。

  • 对于架构和对象所有权,复制在新发布向导中具有以下默认行为:

  • 对于兼容级别为 90 或更高、快照发布和事务发布的合并发布中的项目:默认情况下,订阅服务器上的对象所有者与发布服务器上的相应对象的所有者相同。 如果拥有对象的架构在订阅服务器上不存在,则会自动创建它们。

  • 对于兼容级别低于 90 的合并发布中的文章:默认情况下,所有者字段将留空,在订阅者创建对象期间指定为 dbo

  • 对于 Oracle 发布中的项目:默认情况下,所有者指定为 dbo

  • 对于在出版物中使用字符模式快照(用于非 SQL Server 订阅服务器和 SQL Server Compact 订阅服务器)的文章,默认情况下,所有者字段留空。 所有者默认设置为与分发代理或合并代理用于连接订阅服务器的帐户相关联的所有者。

对象所有者可以通过 “项目属性 - <项目> ”对话框和以下存储过程进行更改: sp_addarticlesp_addmergearticlesp_changearticlesp_changemergearticle。 有关详细信息,请参阅 “查看和修改发布属性”、“ 定义项目”和 “查看和修改项目属性”。

如何将订阅数据库的授予配置为匹配发布数据库的授予?

默认情况下,复制不会对订阅数据库执行 GRANT 语句。 如果希望订阅数据库的权限与发布数据库的权限匹配,请使用以下方法之一:

如果重新初始化订阅,在订阅数据库中授予的权限会发生什么情况?

默认情况下,在重新初始化订阅时会删除和重新创建订阅中的对象,这会导致删除这些对象的所有已授予权限。 有两种方法可以处理此问题:

  • 重新初始化后,使用上一部分所述的技术再次申请补助。

  • 指定在重新初始化订阅时不应删除对象。 在重新初始化之前,请选择以下任一操作:

    • 执行 sp_changearticlesp_changemergearticle。 为参数@property指定“pre_creation_cmd”(sp_changearticle)或“pre_creation_command”(sp_changemergearticle),并为参数@value指定值为“none”、“delete”或“truncate”。

    • “文章属性 - <文章>”对话框的“目标对象”部分中,对于“名称正在使用时的操作”选项,选择一个值:“保留现有对象不变”“删除数据”。如果文章具有行筛选器,仅删除匹配筛选器的数据。“截断现有对象中的所有数据”。 有关访问此对话框的详细信息,请参阅 “查看和修改发布属性”。

数据库维护

为什么无法在已发布的表上运行 TRUNCATE TABLE?

TRUNCATE TABLE 是一种不记录的操作,不会触发触发器。 不允许进行复制,因为复制无法跟踪作导致的更改:事务复制通过事务日志跟踪更改;合并复制通过已发布表上的触发器跟踪更改。

对复制的数据库运行大容量插入命令有什么影响?

对于事务复制,批量插入的跟踪和复制方式与其他插入相同。 合并复制时,必须确保更改跟踪元数据得到正确更新。

备份和还原是否有任何复制考虑事项?

是的。 对于复制中涉及的数据库,有一些特殊注意事项。 有关详细信息,请参阅 备份和还原复制的数据库

复制是否会影响事务日志的大小?

合并复制和快照复制不会影响事务日志的大小,但事务复制可能会影响。 如果数据库包含一个或多个事务性发布,那么在将与这些发布相关的所有事务传递到分发数据库之前,日志不会被截断。 如果事务日志增长过大,并且日志读取器代理按计划运行,请考虑缩短运行间隔。 或者,将其设置为在连续模式下运行。 如果设置为在连续模式下运行(默认值),请确保它正在运行。 有关检查日志读取器代理状态的详细信息,请参阅 使用复制监视器查看信息和执行任务

此外,如果在发布数据库或分发数据库上设置了“与备份同步”选项,则在备份所有事务之前,不会截断事务日志。 如果事务日志增长过大,并且已设置此选项,请考虑缩短事务日志备份之间的间隔。 有关备份和还原事务复制中涉及的数据库的详细信息,请参阅 用于备份和还原快照和事务复制的策略

如何在复制的数据库中重新生成索引或表?

有多种机制可用于重新生成索引。 它们都可以在不需要任何特殊注意的情况下用于复制,但有以下例外:事务性发布的表需要主键,因此无法删除和重新创建这些表的主键。

如何在发布和订阅数据库上添加或更改索引?

在发布者或订阅者上可以添加索引,无需为复制做特殊考虑(请注意索引可能会影响性能)。 由于 CREATE INDEX 和 ALTER INDEX 不会被复制,因此如果您在发布服务器上添加或更改索引,您必须在订阅服务器上进行相同的添加或更改,以确保它在订阅服务器上得到反映。

如何移动或重命名复制中涉及的数据库的文件?

在 SQL Server 2005 之前的 SQL Server 版本中,移动或重命名数据库文件需要分离和重新附加数据库。 由于无法分离复制的数据库,因此必须先从这些数据库中删除复制。 从 SQL Server 2005 开始,可以在不分离和重新附加数据库的情况下移动或重命名文件,而不会影响复制。 有关移动和重命名文件的详细信息,请参阅 ALTER DATABASE (Transact-SQL)

如何删除正在复制的表?

首先使用 sp_droparticlesp_dropmergearticle“发布属性 - <发布>”对话框从发布中删除文章,然后从数据库中删除。 添加订阅后,无法从快照发布或事务发布中删除文章,必须先删除订阅。 有关详细信息,请参阅 “向现有发布添加项目”和“从现有发布中删除项目”。

如何在已发布的表上添加或删除列?

SQL Server 支持对已发布对象进行各种架构更改,包括添加和删除列。 例如,在发布服务器上执行 ALTER TABLE ... DROP COLUMN,该语句会复制到订阅服务器并执行,以删除该列。 在运行 SQL Server 2005 之前版本的 SQL Server 的订阅者支持通过存储过程 sp_repladdcolumnsp_repldropcolumn 添加和删除列。 有关详细信息,请参阅对发布数据库进行架构更改

复制维护

如何确定订阅服务器上的数据是否与发布服务器上的数据同步?

使用验证。 验证报告给定的订阅者是否与发布者同步。 有关详细信息,请参阅 “验证复制的数据”。 验证无法提供是否有行未正确同步的信息,但tablediff 实用工具可以提供这些信息。

如何将表添加到现有文件中?

无需停止发布或订阅数据库上的活动才能添加表(或其他对象)。 通过发布属性 - <发布>对话框或通过存储过程sp_addarticlesp_addmergearticle将表添加到发布中。 有关详细信息,请参阅 “向现有发布添加项目”和“从现有发布中删除项目”。

如何从发布中删除表?

使用 sp_droparticlesp_dropmergearticle“发布属性 - <发布> ”对话框从发布中删除表。 在添加订阅后,无法从快照发布或事务性发布中删除文章,必须先删除订阅。 有关详细信息,请参阅 “向现有发布添加项目”和“从现有发布中删除项目”。

哪些操作需要重新初始化订阅?

有许多文章和发布更改需要重新初始化订阅。 有关详细信息,请参阅 “更改发布”和“项目属性”。

哪些操作会导致快照失效?

有许多文章和出版物的变更导致快照失效,需要生成新的快照。 有关详细信息,请参阅 “更改发布”和“项目属性”。

如何删除复制?

从数据库中删除复制所需的作取决于数据库是作为发布数据库、订阅数据库还是两者兼有。

如何确定是否存在要复制的事务或行?

对于事务复制,请使用复制监视器中的存储过程或 “未分发的命令 ”选项卡。 有关详细信息,请参阅 “查看分发数据库中的复制命令和其他信息”(复制 Transact-SQL 编程), 以及 使用复制监视器查看信息和执行任务

对于合并复制,请使用存储过程 sp_showpendingchanges。 有关详细信息,请参阅sp_showpendingchanges(Transact-SQL)。

分发代理落后了多远? 我应该重新初始化吗?

使用复制监视器中的 sp_replmonitorsubscriptionpendingcmds 存储过程或 “未分发的命令 ”选项卡。 存储过程和选项卡显示:

  • 分发数据库中尚未传递到所选订阅服务器的命令数。 命令由一个 Transact-SQL 数据作语言(DML)语句或一个数据定义语言(DDL)语句组成。

  • 将命令传递到订阅服务器的估计时间。 如果此值大于生成快照并将快照应用到订阅服务器所需的时间,请考虑重新初始化订阅服务器。 有关详细信息,请参阅 重新初始化订阅

有关详细信息,请参阅 sp_replmonitorsubscriptionpendingcmds(Transact-SQL) 以及 使用复制监视器查看信息和执行任务

复制和其他数据库功能

复制是否与日志传送和数据库镜像结合使用?

是的。 有关详细信息,请参阅日志传送和复制(SQL Server)数据库镜像和复制(SQL Server)。

复制是否与群集配合使用?

是的。 不需要任何特殊注意事项,因为所有数据都存储在群集上的一组磁盘上。

另请参阅

复制管理常见问题解答
复制管理的最佳做法