排查 SQL 数据同步的问题

适用于:Azure SQL 数据库

本文介绍如何排查 Azure 中 SQL 数据同步的已知问题。 如果某个问题有了解决方法,会在本文中提供。

有关 SQL 数据同步的概述,请参阅使用 Azure 中的 SQL 数据同步跨多个云和本地数据库同步数据

重要

目前,SQL 数据同步不支持 Azure SQL 托管实例。

同步问题

在门户 UI 中针对与客户端代理关联的本地数据库执行同步失败

SQL 数据同步门户 UI 中针对与客户端代理关联的本地数据库执行同步失败。 在运行代理的本地计算机上,事件日志中出现 System.IO.IOException 错误。 这些错误指出磁盘空间不足。

  • 原因。 驱动器空间不足。

  • 解决方法。 在 %TEMP% 目录所在的驱动器上腾出更多的空间。

我的同步组停留在“正在处理”状态

SQL 数据同步中的同步组长时间处于“正在处理”状态。 该同步组不响应 stop 命令,并且日志中未显示新条目。

以下任何条件均可导致同步组停滞在“正在处理”状态:

  • 原因。 客户端代理处于脱机状态

  • 解决方法。 请确保客户端代理处于联机状态,然后重试。

  • 原因。 客户端代理已卸载或缺失。

  • 解决方法。 客户端代理是否已卸载或缺失:

    1. 将代理 XML 文件(如果存在)从 SQL 数据同步安装文件夹中删除。
    2. 在某台本地计算机(可以是相同或不同的计算机)上安装代理。 然后,提交门户中针对显示为脱机的代理生成的代理密钥。
  • 原因。 SQL 数据同步服务已停止。

  • 解决方法。 重启 SQL 数据同步服务。

    1. 在“开始”菜单中,搜索“服务”。
    2. 在搜索结果中,选择“服务”。
    3. 找到“SQL 数据同步”服务。
    4. 如果服务状态为“已停止”,请右键单击服务名称,选择“启动”。

注意

如果上述信息无法使同步组摆脱“正在处理”状态,可让 Azure 支持部门重置该同步组的状态。 若要重置同步组状态,请在 Azure SQL 数据库论坛中发帖。 在贴子中,请包含自己的订阅 ID,以及需要重置的组的同步组 ID。 Azure 支持工程师将会回复帖子,并在重置状态后予以通知。

在表中发现错误数据

如果在同步操作中包含来自不同数据库架构的同名表,则同步后,表中会出现错误数据。

  • 原因。 SQL 数据同步预配过程针对不同架构中的同名表使用相同的跟踪表。 因此,这两个表中的更改会反映在同一个跟踪表中。 这会导致同步期间发生错误的数据更改。

  • 解决方法。 确保同步中涉及的表名称不同,即使这些表属于数据库中不同的架构。

同步成功后发现主键数据不一致

系统报告同步成功,且日志中未显示失败或跳过的行,但是,发现同步组中数据库间的主键数据不一致。

  • 原因。 此结果是设计使然。 任何主键列中的更改都会导致被更改主键所在行中的数据不一致。

  • 解决方法。 若要避免此问题,请确保主键列中的数据没有进行任何更改。 若要在发生此问题后予以解决,请从同步组中的所有终结点内删除包含不一致数据的行。 然后重新插入该行。

发现性能显著降低

性能显著降低,甚至达到了无法打开数据同步 UI 的程度。

  • 原因。 最可能的原因是同步循环。 当同步组 A 的同步触发了同步组 B 的同步,进而又触发了同步组 A 的同步时,就会出现同步循环。实际情况可能更为复杂,其中可能涉及循环中两个以上的同步组。 问题在于,存在因同步组彼此重叠而导致的同步循环触发。

  • 解决方法。 最佳解决方案就是预防。 确保同步组中没有循环引用。 由一个同步组同步的任何行都不能由其他同步组同步。

有一条错误消息指出“无法在列 <column> 中插入值 NULL。 列不允许 null。"这是什么意思?如何修复它?

此错误消息表示发生了两个以下问题之一:

  • 某个表没有主键。 若要解决此问题,请将主键添加到要同步的所有表。
  • CREATE INDEX 语句中可能存在 WHERE 子句。 数据同步不会处理这种情况。 若要解决此问题,请删除 WHERE 子句,或手动对所有数据库进行更改。

数据同步如何处理循环引用? 也就是说,如果在多个同步组中同步相同的数据,这些数据是否不断更改?

数据同步不会处理循环引用。 请务必避免循环引用。

客户端代理问题

若要排查客户端代理问题,请参阅排查 Data Sync Agent 问题

设置和维护问题

我收到“磁盘空间不足”的消息

  • 原因。 需要删除残留的文件时,可能会显示“磁盘空间不足”消息。 出现此消息的原因可能是使用了防病毒软件,或者在尝试执行删除操作时文件处于打开状态。

  • 解决方法。 手动删除 %temp% 文件夹中的同步文件 (del \*sync\* /s)。 然后,删除 %temp% 文件夹中的子目录。

重要

同步正在进行时,请不要删除任何文件。

无法删除同步组

尝试删除同步组失败。 以下任何情况都可能导致删除同步组失败:

  • 原因。 客户端代理处于脱机状态。

  • 解决方法。 确保客户端代理已联机,然后重试。

  • 原因。 客户端代理已卸载或缺失。

  • 解决方法。 客户端代理是否已卸载或缺失:
    a. 将代理 XML 文件(如果存在)从 SQL 数据同步安装文件夹中删除。
    b. 在某台本地计算机(可以是相同或不同的计算机)上安装代理。 然后,提交门户中针对显示为脱机的代理生成的代理密钥。

  • 原因。 数据库处于脱机状态。

  • 解决方法。 确保所有数据库都处于联机状态。

  • 原因。 同步组正在预配或同步。

  • 解决方法。 等待预配或同步过程完成,然后重试删除同步组。

无法注销 SQL Server 数据库

  • 原因。 很可能是因为正在尝试注销一个已被删除的数据库。

  • 解决方法。 若要注销某个 SQL Server 数据库,请选择该数据库,再选择“强制删除”。

    如果此操作无法从同步组中删除数据库:

    1. 请停止再重启客户端代理主机服务。
      a. 选择“开始”菜单。
      b. 在搜索框中输入 services.msc
      c. 在搜索结果窗格的“程序”部分,双击“服务”。
      d. 右键单击“SQL 数据同步”服务。
      e. 如果该服务正在运行,请将其停止。
      f. 右键单击该服务,并选择“启动”。
      g. 检查数据库是否仍已注册。 如果已不再注册数据库,则操作完成。 否则,请继续执行下一步。
    2. 打开客户端代理应用 (SqlAzureDataSyncAgent)。
    3. 选择“编辑凭据”,输入数据库的凭据。
    4. 继续执行注销。

没有足够的特权启动系统服务

  • 原因。 在两种情况下会发生此错误:

    • 用户名和/或密码不正确。
    • 指定的用户帐户没有足够的特权作为服务登录。
  • 解决方法。 向用户帐户授予“作为服务登录”凭据:

    1. 转到"开始控制面板管理工具本地安全策略本地策略用户Rights Management"
    2. 选择“作为服务登录”。
    3. 在“属性”对话框中添加用户帐户。
    4. 依次选择“应用”、“确定” 。
    5. 关闭所有窗口。

数据库具有“过期”状态

  • 原因。 SQL 数据同步会从服务中删除已脱机达 45 天或更长时间的数据库(从数据库脱机时算起)。 如果数据库已脱机达 45 天或更长时间,然后重新联机,则其状态会变为“过期”。

  • 解决方法。 确保所有数据库都不会脱机达 45 天或更长时间,即可避免“过期”状态。

    如果数据库的状态为“过期”:

    1. 从同步组中删除处于“过期”状态的数据库。
    2. 将数据库添加回同步组。

    警告

    在数据库脱机时,将丢失对该数据库所做的所有更改。

同步组具有“过期”状态

  • 原因。 如果在 45 天的整个保留期内未能应用一个或多个更改,则同步组可能会过期。

  • 解决方法。 若要避免“过期”状态,请定期在历史记录查看器中检查同步作业的结果。 调查并解决未能应用的任何更改。

    如果同步组的状态为“过期”,请删除同步组并重新创建。

在卸载或停止代理后的三分钟内无法删除同步组

在卸载或停止关联的 SQL 数据同步客户端代理后的三分钟内无法删除同步组。

  • 解决方法

    1. 在关联的同步代理处于联机状态时删除同步组(推荐)。
    2. 如果代理处于脱机状态但已安装,请在本地计算机上将其联机。 等待代理状态在 SQL 数据同步门户中显示为“联机”。 然后删除同步组。
    3. 如果代理因为被卸载而处于脱机状态:
      a. 将代理 XML 文件(如果存在)从 SQL 数据同步安装文件夹中删除。
      b. 在某台本地计算机(可以是相同或不同的计算机)上安装代理。 然后,提交门户中针对显示为脱机的代理生成的代理密钥。
      c. 尝试删除同步组。

还原丢失或损坏的数据库时,会发生什么情况?

如果从备份还原丢失或损坏的数据库,数据库所属的同步组中的数据可能不收敛。

后续步骤

有关 SQL 数据同步的详细信息,请参阅:

有关 SQL 数据库的详细信息,请参阅: