Azure Analysis Service数据库冻结:无法执行XMLA或终止特定会话
Azure Analysis Service多维数据集冻结及会话无法终止问题
环境与配置
我有一个Azure Analysis Service(AAS)实例,部署了多个多维数据集(数据库),其数据源配置如下(连接SQL Server 2022实例):
"dataSources": [ { "name": "SQL asazure://{location}/ServerName;ABC", "connectionString": "server=10.0.0.1;user=ABC;database=ABC", "impersonationMode": "impersonateServiceAccount", "account": "ABC", "provider": "System.Data.SqlClient" } ]
问题现象
每周会随机出现单个多维数据集“冻结”:针对该数据库的任何XMLA命令都会无限期运行。例如执行删除命令:
<Delete xmlns="http://schemas.microsoft.com/analysisservices/2003/engine"> <Object> <DatabaseID>ABC</DatabaseID> </Object> </Delete>
(注:ABC是数据量极小的多维数据集)
通过以下XMLA查询可定位到阻塞命令:
SELECT * FROM $SYSTEM.DISCOVER_COMMANDS ORDER BY COMMAND_ELAPSED_TIME_MS
发现的阻塞命令是一个带事务的Batch刷新操作:
<Batch Transaction="true" xmlns="http://schemas.microsoft.com/analysisservices/2003/engine"> <Refresh xmlns="http://schemas.microsoft.com/analysisservices/2014/engine"> <DatabaseID>ABC</DatabaseID> <Model> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <xs:element> <xs:complexType> <xs:sequence> <xs:element type="row"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="row"> <xs:sequence> <xs:element name="RefreshType" type="xs:long" sql:field="RefreshType" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema> <row xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"> <RefreshType>1</RefreshType> </row> </Model> </Refresh> <SequencePoint xmlns="http://schemas.microsoft.com/analysisservices/2014/engine"> <DatabaseID>ABC</DatabaseID> </SequencePoint> </Batch>
尝试用Cancel命令终止该会话(SPID示例为123456):
<Cancel xmlns="http://schemas.microsoft.com/analysisservices/2003/engine"> <SPID>123456</SPID> <CancelAssociated>1</CancelAssociated> </Cancel>
命令返回成功:
<return xmlns="urn:schemas-microsoft-com:xml-analysis"> <root xmlns="urn:schemas-microsoft-com:xml-analysis:empty" /> </return>
但该会话并未终止(其他SPID可正常终止),最终只能通过暂停并重启AAS实例解决,每次导致全实例10-20分钟停机,每周一次,无法接受。
疑问解答
1. 为何无法终止持续运行的会话?
- 当命令处于不可中断的执行阶段时,Cancel命令无法生效。比如刷新操作正在执行底层I/O、持有关键锁或处于事务提交/回滚的核心步骤,AAS无法强制中断,否则可能引发数据损坏或实例不稳定。
- 带
Transaction="true"的Batch操作会持有跨对象锁,若操作卡在SQL Server数据源的阻塞状态(如SQL端锁等待),AAS的Cancel命令无法穿透到SQL层面终止底层查询,导致会话看似仍在运行。 - AAS内部进程或资源死锁,会导致会话无法响应Cancel信号,属于实例级资源异常。
2. 该会话为何会随机无限期运行?
- 数据源层面阻塞:SQL Server 2022实例可能存在锁等待、查询超时未正确传递,或数据源连接池异常,导致AAS刷新操作卡在数据拉取阶段。
- AAS内部事务死锁:带事务的Batch刷新操作(
Transaction="true")执行时,可能与其他并发操作(如元数据修改、其他刷新)产生内部死锁,导致操作无限期挂起。 - 资源瓶颈:AAS实例的CPU、内存或存储IO达到阈值,刷新操作无法分配足够资源完成执行,进而挂起。
- 全量刷新隐性问题:RefreshType=1(全量刷新)会重新处理整个模型数据,若模型存在隐藏计算逻辑、分区依赖或数据源视图异常,可能导致操作卡在某个阶段。
3. 如何避免此类无限期运行的情况?
- 修改刷新事务模式:将Batch的
Transaction="true"改为Transaction="false",或拆分刷新操作到多个无事务Batch中,减少锁持有时间和死锁风险。 - 优化数据源连接与查询:
- 在SQL Server端监控并优化刷新对应查询,确保无锁等待或慢查询;
- 调整数据源连接字符串的超时参数(如添加
Connect Timeout=30;Command Timeout=300),避免无限期等待SQL端响应; - 检查数据源 impersonation 设置,确保服务账号权限充足且无身份验证异常。
- 调整刷新策略:
- 避免全量刷新,改用增量刷新(RefreshType=2),减少数据处理量;
- 错开多个多维数据集的刷新时间,避免并发操作引发的资源竞争;
- 添加刷新操作超时监控,通过自动化工具(如Azure Logic Apps、PowerShell)检测长时间运行的刷新任务,提前干预;
- 使用分区刷新代替全库刷新,降低单操作的资源占用。
- 监控与告警:
- 配置AAS诊断日志,监控
DISCOVER_COMMANDS和DISCOVER_SESSIONS视图,及时发现长时间运行的命令; - 设置实例资源告警(CPU、内存、IO),避免资源耗尽;
- 监控SQL Server端查询性能,确保AAS数据源查询能正常完成。
- 配置AAS诊断日志,监控
- 升级与补丁:检查AAS实例版本,确保使用最新服务更新,微软可能已修复导致会话无法终止或挂起的已知bug。
- 紧急处理优化:若Cancel命令无效,可尝试使用AAS PowerShell模块
Invoke-ProcessASDatabase的强制终止参数,或通过Azure门户的“终止会话”功能(部分场景比手动XMLA Cancel更有效),减少重启实例的频率。
内容的提问来源于stack exchange,提问作者Dave R
相关产品推荐
相关产品推荐

