本文列出了 Azure SQL 托管实例的当前已知问题及其解决日期或可能的解决方法。 若要了解有关 Azure SQL 托管实例的详细信息,请参阅 Azure SQL 托管实例是什么?以及 Azure SQL 托管实例中的新增功能?
注意
Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。
已知问题
具有解决方法
由于等待“HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING”的时间过长,登录以读取次要副本失败
尝试连接到故障转移组的只读次要副本或使用托管实例链接复制的数据库时,你可能会看到此 Microsoft OLE DB Driver 19 for SQL Server 驱动程序的异常错误。
当辅助副本不可用于登录时,会发生此错误,因为辅助副本重启或回收辅助副本时或因故障转移而未完成的事务缺少行版本。 重启或故障转移实例时,将清除存储在 tempdb
中的版本控制数据,以便在故障转移或重启之前启动长时间运行的活动事务时中止次要读取查询。
若要解决此问题,请回滚或提交主副本上的活动事务。 若要避免此错误,请最大程度地减少主副本上长时间运行的写入事务。
在源自 SQL 托管实例的 SQL Server 数据库上运行 DBCC CHECKDB 时出现错误 8992
当您在 SQL Server 2022 数据库上运行 DBCC CHECKDB
命令时,如果该数据库源自 Azure SQL 托管实例(例如通过还原备份文件或通过SQL 托管实例链接功能),并且在此之前删除了一个索引或一个带有索引的表,您可能会看到以下错误:
Msg 8992, Level 16, State 1, Line <Line_Number>
Check Catalog Msg 3853, State 1: Attribute (%ls) of row (%ls) in sys.sysrowsetrefs does not have a matching row (%ls) in sys.indexes.
若要解决此问题,请先从 Azure SQL 托管实例中的源数据库中删除索引或具有索引的表,然后再次还原或链接数据库到 SQL Server 2022。 如果无法从源 Azure SQL 托管实例重新创建数据库,请联系 Azure 支持部门来帮助解决此问题。
谨慎
如果按照本方案的描述,在删除索引后对表创建分区索引,该表将变得不可访问。
Azure 门户中的长期备份列表显示活动数据库和具有相同名称的已删除数据库的备份文件
可以在“ 备份 ”选项卡上的 Azure SQL 托管实例的 Azure 门户页上列出和管理长期备份。该页列出了活动或已删除的数据库、有关其长期备份的基本信息,以及用于管理备份的链接。 选择“管理”链接时,将打开一个新的侧窗格,其中包含备份列表。 由于筛选逻辑出现问题,列表会显示活动数据库和具有相同名称的已删除数据库的备份。 选择要删除的备份时需要特别注意这一点,以避免删除错误数据库的备份。
解决方法:使用列表中显示的备份时间 (UTC) 信息来区分属于实例上不同时间段存在的同名数据库的备份。 或者,使用 PowerShell 命令 Get-AzSqlInstanceDatabaseLongTermRetentionBackup 和 Remove-AzSqlInstanceDatabaseLongTermRetentionBackup,或 CLI 命令 az sql midb ltr-backup list 和 az sql midb ltr-backup delete,通过 DatabaseState 参数和 DatabaseDeletionTime 返回值管理长期备份,以筛选数据库的备份。
更改连接类型不会影响通过故障转移组终结点建立的连接
如果某个实例加入故障转移组,则更改该实例的连接类型不会影响通过故障转移组侦听器终结点建立的连接。
解决方法:在更改连接类型后删除并重新创建故障转移组。
从服务器信任组中删除 SQL 托管实例后,可以执行分布式事务
服务器信任组用于在托管实例之间建立信任,这是执行分布式事务的先决条件。 从服务器信任组中删除 SQL 托管实例或删除组后,仍可以执行分布式事务。 有一种解决方法,您可以应用以确保分布式事务已禁用,那就是在 SQL 托管实例上执行由用户启动的手动故障转移。
无法创建与之前删除的逻辑服务器同名的 SQL 托管实例
当您在 Azure 中为 Azure SQL 数据库创建逻辑服务器或创建 SQL 托管实例时,会创建 <name>.database.chinacloudapi.cn
的 DNS 记录。 该 DNS 记录必须唯一。 因此,如果为 SQL 数据库创建逻辑服务器并随后删除它,其名称将在经过 7 天的等待期后从记录中释放。 在此期限内,无法使用与已删除逻辑服务器相同的名称创建 SQL 托管实例。 一种解决方法是为 SQL 托管实例使用不同的名称,或者创建支持票证来释放逻辑服务器名称。
服务主体无法访问 Microsoft Entra ID 和 AKV
在某些情况下,用于访问 Microsoft Entra ID(以前称为 Azure Active Directory)和 Azure 密钥保管库 (AKV) 服务的服务主体可能存在问题。 这个问题最终会对 Microsoft Entra 身份验证和 SQL 托管实例的透明数据加密 (TDE) 的使用产生影响。 这种情况可能会体现为间歇性的连接问题,或者是无法运行 CREATE LOGIN/USER FROM EXTERNAL PROVIDER
或 EXECUTE AS LOGIN/USER
之类的语句。 在某些情况下,在新的 Azure SQL 托管实例上使用客户托管密钥设置 TDE 也可能不起作用。
解决方法:如果要防止在执行任何更新命令之前 SQL 托管实例出现此问题,或者如果在执行更新命令后遇到了此问题,请转到 Azure 门户中 SQL 托管实例的概述页面。 在“设置”下,选择“Microsoft Entra ID”以访问 SQL 托管实例 Microsoft Entra ID 管理页面。 验证是否可以看到错误消息:
Managed Instance needs a Service Principal to access Microsoft Entra ID. Click here to create a Service Principal
。
如果看到此错误消息,请选择它,然后按照提供的分步说明操作,直到解决此错误为止。
尝试删除不为空的文件时,返回了错误的错误
SQL Server 和 SQL 托管实例不允许用户删除不为空的文件。 如果尝试使用 ALTER DATABASE REMOVE FILE
语句删除非空数据文件,系统不会立即返回 Msg 5042 - The file '<file_name>' cannot be removed because it is not empty
错误。 SQL 托管实例会继续尝试删除该文件,操作会在 30 分钟后失败并显示 Internal server error
。
更改服务层级和创建实例的操作会被正在进行的数据库还原操作阻止
正在进行的 RESTORE
语句、数据迁移服务的迁移过程,以及内置的时间点还原功能阻止更新服务层次或调整现有实例大小,并在还原过程完成之前阻止创建新实例。
还原过程会阻止其运行时所在的子网的托管实例和实例池中的这些操作。 实例池中的实例不受影响。 服务层级创建或更改的操作不会失败或超时。这些操作将在还原过程完成或取消后继续执行。
解决方法:请等待还原过程完成,或者,如果创建或更新服务层级的操作的优先级更高,可取消还原过程。
故障转移后,需要重新配置可读次要副本上的资源控制器
资源 管理器 功能能够限制分配给用户工作负载的资源,但在故障转移或用户发起的服务层变更(例如更改最大 vCore 或最大实例存储大小)后,可能会错误地对某些用户工作负载进行分类。
解决方法:如果您使用ALTER RESOURCE GOVERNOR RECONFIGURE
,请在可读的次要副本启动时定期运行,或将其作为执行 SQL 任务的 SQL Agent 作业的一部分。
升级服务层级后必须重新初始化跨数据库 Service Broker 对话
更改服务层作后,跨数据库 Service Broker 对话框停止将消息传送到其他数据库中的服务。 这些消息没有丢失,可以在发送方队列中找到它们。 在 SQL 托管实例中对 vCore 或实例存储大小进行任何更改都会导致 service_broke_guid
视图中所有数据库的 值发生更改。 使用 DIALOG
语句创建的、引用其他数据库中的 Service Broker 的任何 将停止向目标服务传递消息。
解决方法:先停止使用跨数据库 Service Broker 对话的任何活动,再更新服务层级,然后重新初始化这些活动。 如果在更改服务层级后存在任何未传递的剩余消息,请从源队列中读取消息,然后将其重新发送到目标队列。
小型数据库文件超出存储空间
CREATE DATABASE
、ALTER DATABASE ADD FILE
和 RESTORE DATABASE
语句可能会失败,因为实例可能会达到 Azure 存储限制。
每个 SQL 托管实例的常规用途实例都为 Azure 高级磁盘空间保留了最多 35 TB 存储空间。 每个数据库文件放置在单独的物理磁盘上。 磁盘大小可以为 128 GB、256 GB、512 GB、1 TB 或 4 TB。 磁盘上未使用的空间不收费,但 Azure 高级磁盘大小总计不能超过 35 TB。 在某些情况下,由于内部碎片,SQL 托管实例可能会超过 Azure 的 35 TB 存储大小限制,即使它总共并不需要 8 TB。
例如,SQL 托管实例的常规用途实例可将一个大小为 1.2 TB 的大文件放在 4 TB 的磁盘上。 它还可以将 248 个文件(每个大小为 1 GB)放在单独的 128 GB 磁盘上。 在本示例中:
- 分配的磁盘存储总大小为 1 x 4 TB + 248 x 128 GB = 35 TB。
- 实例上的数据库的总预留空间为 1 x 1.2 TB + 248 x 1 GB = 1.4 TB。
此示例演示在某些情况下,由于文件的具体分布,SQL 托管实例的实例可能会出乎意料地达到为附加的 Azure 高级磁盘预留的 35 TB 存储空间大小限制。
在此示例中,只要未添加新文件,现有数据库就会继续工作并且可以毫无问题地增长。 由于没有足够的空间用于新磁盘驱动器,因此无法创建或还原新数据库,即使所有数据库的总大小未达到实例大小限制也是如此。 这种情况下返回的错误并不明确。
可以使用系统视图识别剩余文件的数目。 如果达到此限制,请尝试使用 DBCC SHRINKFILE 语句来清空并删除一些较小的文件,或切换到没有此限制的业务关键层。
显示 GUID 值而不是数据库名称
多个系统视图、性能计数器、错误消息、XEvent 和错误日志条目显示了 GUID 数据库标识符而非实际的数据库名称。 不要依赖这些 GUID 标识符,因为它们将来会被替换为实际的数据库名称。
解决方法:使用视图 从物理数据库名称中解析出实际数据库名称,该名称以 GUID 数据库标识符的形式指定:
SELECT name AS ActualDatabaseName,
physical_database_name AS GUIDDatabaseIdentifier
FROM sys.databases
WHERE database_id > 4;
CLR 模块和链接的服务器有时无法引用本地 IP 地址
放在 SQL 托管实例中的 CLR 模块以及引用当前实例的链接服务器或分布式查询有时可能无法解析本地实例的 IP。 此错误是暂时性问题。
无解决方法
当实例链接到 SQL Server 时不会进行差异备份
在 SQL Server 和 Azure SQL 托管实例之间配置 链接 时,在 SQL 托管实例上执行自动完整备份和事务日志备份(无论它是否在主角色中)。 但是,目前不会进行差异备份,这可能会导致还原时间比预期的要长。
用于事务复制的系统登录名数量增加
Azure SQL 托管实例服务正在为事务复制创建系统登录名。 此登录名可以在 SSMS 中(在对象资源管理器的“安全性”-“登录名”下),或者在系统视图 sys.syslogins
中找到。 登录名的格式类似于 'DBxCy\WF-abcde01234QWERT'
,而且登录名具有公共服务器角色。 在某些情况下,会重新创建此登录名,并且由于系统故障,不会删除以前的登录名。 这可能会导致登录名的数量增加。 这些登录名并不代表安全威胁。 可放心忽略它们。 不应删除这些登录名,因为至少有一个登录名用于事务复制。
SSDT 不支持 Microsoft Entra 登录名和用户
SQL Server Data Tools 不完全支持 Microsoft Entra 登录名和用户。
不支持模拟 Microsoft Entra 登录类型
不支持使用以下 Microsoft Entra 主体的 EXECUTE AS USER
或 EXECUTE AS LOGIN
进行模拟:
- 带有别名 Microsoft Entra 用户。 在这种情况下,将返回以下错误:
15517
。 - 基于 Microsoft Entra 应用程序或服务主体的 Microsoft Entra 登录名和用户。 在这种情况下,将返回以下错误:
15517
和15406
。
异地故障转移之后,必须重新配置事务复制
如果对故障转移组中的数据库启用了事务复制,则 SQL 托管实例管理员必须清理旧的主节点上所有发布内容,然后在故障转移到另一个区域后,在新的主节点上重新配置这些发布内容。 有关详细信息,请参阅复制。
错误日志不会持续保存
SQL 托管实例中可用的错误日志不会持久保留,并且它们的大小不包括在最大存储限制中。 在发生故障转移时可能会自动清除错误日志。 错误日志历史记录中可能存在差距,因为 SQL 托管实例在多个虚拟机上转移了多次。
已解决
在缩放操作期间,使用故障转移组侦听器临时无法访问实例
(2025年4月解决)
有时,扩展 SQL 托管实例需要将实例移动到其他虚拟群集,连同相关的由服务维护的 DNS 记录一起移动。 如果 SQL 托管实例参与故障转移组,则对应于其关联的故障转移组侦听器的 DNS 记录(如果实例是当前异地主节点,则为读写侦听器;如果实例是当前异地辅助节点,则为只读侦听器)会被移动到新的虚拟群集。
在当前的缩放操作设计中,在 SQL 托管实例本身完全迁移到新的虚拟群集之前,会从原始虚拟群集中删除侦听器的 DNS 记录,这在某些情况下可能会导致实例的 IP 地址无法通过侦听器解析。 在此期间,尝试通过侦听器终结点访问正在缩放实例的 SQL 客户端程序预计会出现登录失败,并会看到以下错误消息:
Error 40532: Cannot open server "xxx.xxx.xxx.xxx" requested by the login. The login failed. (Microsoft SQL Server, Error: 40532).
此问题将通过对缩放操作进行重新设计来解决。
msdb 中用于手动备份的表不保留用户名
(已于 2023 年 8 月解决) 我们最近在 msdb
中引入了对自动备份的支持,但该表当前不包含用户名信息。
使用 SQL Server 身份验证时,不支持带有“@”的用户名
中间包含了“@”符号的用户名(例如 'abc@xy'
)无法使用 SQL Server 身份验证登录。
在没有 CHECKSUM 的情况下还原手动备份可能会失败
(2020年6月解决) 在某些情况下,在 SQL 托管实例上手动备份未进行 CHECKSUM 的数据库可能无法被恢复。 在这种情况下,请重试还原备份,直到成功为止。
解决方法: 在启用了 CHECKSUM 的 SQL 托管实例上手动备份数据库。
资源组上的权限不应用于 SQL 托管实例
将 SQL 托管实例参与者 Azure 角色应用于资源组 (RG) 时,该角色不应用于 SQL 托管实例,因此不起作用。
解决方法:在订阅级别为用户设置“SQL 托管实例参与者”角色。
有关 Azure 门户上建议重新创建服务主体的误导性错误消息
即使服务主体已存在,Azure SQL 托管实例 Azure 门户的“Active Directory 管理”页面也可能显示以下错误消息:
Managed Instance needs a Service Principal to access Microsoft Entra ID ([formerly Azure Active Directory](/entra/fundamentals/new-name)). Click here to create a Service Principal
如果 SQL 托管实例的服务主体已存在,并且/或Microsoft SQL 托管实例上的 Entra 身份验证有效,则可以忽略此错误消息。
若要检查服务主体是否存在,请导航到 Azure 门户上的“企业应用程序”页,从“应用程序类型”下拉列表中选择“托管标识”,选择“应用”,然后在搜索框中键入 SQL 托管实例的名称。 如果实例名称出现在结果列表中,则表示服务主体已存在,不需要进一步的操作。
如果您已按照错误消息中的说明进行了操作,并从错误消息中选择了链接,则 SQL 托管实例的服务主体已被重新创建。 在这种情况下,请为新建的服务主体分配 Microsoft Entra ID 读取权限,以便 Microsoft Entra 身份验证正常工作。 可以按照说明通过 Azure PowerShell 完成此操作。
无法访问 system_health 事件会话的 event_file 目标
(2025年5月解决)尝试读取事件会话目标event_file
的内容system_health
时,会收到错误 40538,“以”https:// 开头的有效 URL 是必需的“作为指定的任何文件路径的值。这发生在 SQL Server Management Studio 中,或使用 sys.fn_xe_file_target_read_file 函数读取会话数据时。
这种行为更改是由最近的必要安全修补造成的意外后果。 我们正在调查其他更改的可行性,使客户能够安全地继续在 Azure SQL 托管实例中使用 system_health
会话。 同时,客户可以通过在 Azure Blob 存储中以 system_health
为目标创建等效的 event_file
会话来解决此问题。 有关详细信息,包括用于创建 system_health
会话(可修改以创建等效 system_health
)的 T-SQL 脚本,请参阅 使用 system_health 会话。