排查 SQL 数据同步的问题
适用于:Azure SQL 数据库
本文介绍如何排查 Azure 中 SQL 数据同步的已知问题。 如果某个问题有了解决方法,会在本文中提供。
有关 SQL 数据同步的概述,请参阅使用 Azure 中的 SQL 数据同步跨多个云和本地数据库同步数据。
重要
目前,SQL 数据同步不支持 Azure SQL 托管实例。
同步问题
在门户 UI 中针对与客户端代理关联的本地数据库执行同步失败
SQL 数据同步门户 UI 中针对与客户端代理关联的本地数据库执行同步失败。 在运行代理的本地计算机上,事件日志中出现 System.IO.IOException
错误。 这些错误指出磁盘空间不足。
原因。 驱动器空间不足。
解决方法。 在 %TEMP% 目录所在的驱动器上腾出更多的空间。
我的同步组停留在正在处理状态
SQL 数据同步中的同步组长时间处于“正在处理”状态。 该同步组不响应 stop 命令,并且日志中未显示新条目。
以下任何条件均可导致同步组停滞在“正在处理”状态:
原因。 客户端代理处于脱机状态
解决方法。 请确保客户端代理处于联机状态,然后重试。
原因。 客户端代理已卸载或缺失。
解决方法。 客户端代理是否已卸载或缺失:
- 将代理 XML 文件(如果存在)从 SQL 数据同步安装文件夹中删除。
- 在某台本地计算机(可以是相同或不同的计算机)上安装代理。 然后,提交门户中针对显示为脱机的代理生成的代理密钥。
原因。 SQL 数据同步服务已停止。
解决方法。 重启 SQL 数据同步服务。
- 在“开始”菜单中,搜索“服务”。
- 在搜索结果中,选择“服务”。
- 找到“SQL 数据同步”服务。
- 如果服务状态为“已停止”,请右键单击服务名称,选择“启动”。
注意
如果上述信息无法使同步组摆脱“正在处理”状态,可让 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 数据库,请选择该数据库,再选择“强制删除”。
如果此操作无法从同步组中删除数据库:
- 请停止再重启客户端代理主机服务。
a. 选择“开始”菜单。
b. 在搜索框中输入 services.msc。
c. 在搜索结果窗格的“程序”部分,双击“服务”。
d. 右键单击“SQL 数据同步”服务。
e. 如果该服务正在运行,请将其停止。
f. 右键单击该服务,并选择“启动”。
g. 检查数据库是否仍已注册。 如果已不再注册数据库,则操作完成。 否则,请继续执行下一步。 - 打开客户端代理应用 (SqlAzureDataSyncAgent)。
- 选择“编辑凭据”,输入数据库的凭据。
- 继续执行注销。
- 请停止再重启客户端代理主机服务。
没有足够的特权启动系统服务
原因。 在两种情况下会发生此错误:
- 用户名和/或密码不正确。
- 指定的用户帐户没有足够的特权作为服务登录。
解决方法。 向用户帐户授予“作为服务登录”凭据:
- 转到“开始”>“控制面板”>“管理工具”>“本地安全策略”>“本地策略”>“用户权限管理”。
- 选择“作为服务登录”。
- 在“属性”对话框中添加用户帐户。
- 依次选择“应用”、“确定” 。
- 关闭所有窗口。
数据库具有“过期”状态
原因。 SQL 数据同步会从服务中删除已脱机达 45 天或更长时间的数据库(从数据库脱机时算起)。 如果数据库已脱机达 45 天或更长时间,然后重新联机,则其状态会变为“过期”。
解决方法。 确保所有数据库都不会脱机达 45 天或更长时间,即可避免“过期”状态。
如果数据库的状态为“过期”:
- 从同步组中删除处于“过期”状态的数据库。
- 将数据库添加回同步组。
警告
在数据库脱机时,将丢失对该数据库所做的所有更改。
同步组具有“过期”状态
原因。 如果在 45 天的整个保留期内未能应用一个或多个更改,则同步组可能会过期。
解决方法。 若要避免“过期”状态,请定期在历史记录查看器中检查同步作业的结果。 调查并解决未能应用的任何更改。
如果同步组的状态为“过期”,请删除同步组并重新创建。
在卸载或停止代理后的三分钟内无法删除同步组
在卸载或停止关联的 SQL 数据同步客户端代理后的三分钟内无法删除同步组。
解决方法。
- 在关联的同步代理处于联机状态时删除同步组(推荐)。
- 如果代理处于脱机状态但已安装,请在本地计算机上将其联机。 等待代理状态在 SQL 数据同步门户中显示为“联机”。 然后删除同步组。
- 如果代理因为被卸载而处于脱机状态:
a. 将代理 XML 文件(如果存在)从 SQL 数据同步安装文件夹中删除。
b. 在某台本地计算机(可以是相同或不同的计算机)上安装代理。 然后,提交门户中针对显示为脱机的代理生成的代理密钥。
c. 尝试删除同步组。
还原丢失或损坏的数据库时,会发生什么情况?
如果从备份还原丢失或损坏的数据库,数据库所属的同步组中的数据可能不收敛。
错误消息“Sync0022 客户无权执行 syncGroupOperationResults/read 操作”
如果收到错误消息 Sync0022 Customer does not have authorization to perform action 'syncGroupOperationResults/read'
,则表示尝试执行该操作的帐户没有足够的订阅级权限。 添加:
- Microsoft.Sql/locations/syncMemberOperationResults/read
- “Microsoft.Sql/locations/syncAgentOperationResults/read”
- Microsoft.Sql/locations/syncGroupOperationResults/read
有关详细信息,请参阅资源提供程序操作 RBAC 和 具有最低所需权限的 SQL 数据同步数据库帐户。
后续步骤
有关 SQL 数据同步的详细信息,请参阅:
- 概述 - 使用 Azure 中的 SQL 数据同步跨多个云和本地数据库同步数据
- 设置数据同步
- Data Sync Agent - Azure 中 SQL 数据同步的 Data Sync Agent
- 最佳做法 - Azure 中 SQL 数据同步的最佳做法
- 监视 - 使用 Azure Monitor 日志监视 SQL 数据同步
- 更新同步架构
- 使用 Transact-SQL - 在 Azure 中的 SQL 数据同步中自动复制架构更改
- 使用 PowerShell - 使用 PowerShell 更新现有同步组中的同步架构
有关 SQL 数据库的详细信息,请参阅: