SQL Server Analysis Services多维数据集处理失败,操作取消的 HY008 错误

您所在的位置:网站首页 数据库登陆超时已过期什么意思 SQL Server Analysis Services多维数据集处理失败,操作取消的 HY008 错误

SQL Server Analysis Services多维数据集处理失败,操作取消的 HY008 错误

2024-07-01 21:04| 来源: 网络整理| 查看: 265

排查 Analysis Services 错误“OLE DB 错误:OLE DB 或 ODBC 错误:操作已取消;HY008” 项目 05/08/2023

本文介绍在处理多维模型时使用SQL Server Analysis Services时可能发生的一个错误的背景故障排除信息和特定步骤。

注意

本文派生自 2012 年 6 月 11 日发布的博客,可能包含日期材料。

处理过程中的错误

Analysis Services 处理可能会失败,并出现此错误: OLE DB error: OLE DB or ODBC error: Operation canceled; HY008.

在 SQL OLE DB 术语中, HY008 表示 DB_E_CANCELED调用方有意取消查询。 有时,可以从 SQL Server Management Studio 中更好地看到此错误:

Internal error: The operation terminated unsuccessfully. OLE DB error: OLE DB or ODBC error: Query timeout expired;HYT00. Errors in the OLAP storage engine: An error occurred while the dimension, with the ID of '', Name of '' was being processed.

HYT00 表示 DB_E_ABORTLIMITREACHED (0x80040E31) 或超时已过期。 由于SQL_QUERY_TIMEOUT设置,超时已过期。 命令超时或查询超时已启动,以终止正在运行的查询并取消工作。

XMLA 等效命令和错误

如果使用 XMLA 命令来处理 Analysis Services 对象,则语法可能类似于以下示例:

AdventureWorksDW2012Multidimensional-EE ProcessFull UseExisting

出现超时时,系统会显示长字符串中追加的不同错误列表。 一个或多个数据库连接有超时,但你可能没有注意到。 由于多个连接从取消通知中获取,错误中存在重大干扰。 Analysis Services 报告由于处理实现的多线程性质而出现看似随机顺序的错误。 超时指示器很难看到。

Internal error: The operation terminated unsuccessfully. Internal error: The operation terminated unsuccessfully. Server: The current operation was cancelled because another operation in the transaction failed. Internal error: The operation terminated unsuccessfully. OLE DB error: OLE DB or ODBC error: **Communication link failure; 08S01; Shared Memory Provider: No process is on the other end of the pipe. ; 08S01.** Errors in the OLAP storage engine: An error occurred while the dimension, with the ID of 'Dim Time', Name of 'Date' was being processed. Errors in the OLAP storage engine: An error occurred while the 'Fiscal Year' attribute of the 'Date' dimension from the 'AdventureWorksDW2012Multidimensional-EE' database was being processed. OLE DB error: OLE DB or ODBC error: Communication link failure; 08S01; Shared Memory Provider: No process is on the other end of the pipe.

若要了解此输出,08S01请从提供程序获取。DB_E_CANNOTCONNECT 此 HResult 有点误用。 如果查询被取消,则系统可能无法连接,或者提供程序或服务器已断开连接或取消。

OLAP\Log\Msmdsrv.log检查文件。 如果应用程序未记录,可能会收到错误消息。

(6/12/2012 4:52:21 PM) Message:  (Source: [\\?\C:\OLAP\Log\msmdsrv.log](file://\\?\C:\OLAP\Log\msmdsrv.log), Type: 3, Category: 289, Event ID: 0xC1210003) (6/12/2012 4:52:21 PM) Message: OLE DB error: OLE DB or ODBC error: Operation canceled; HY008. (Source: [\\?\C:\OLAP\Log\msmdsrv.log](file://\\?\C:\OLAP\Log\msmdsrv.log), Type: 3, Category: 289, Event ID: 0xC1210003) (6/12/2012 4:52:22 PM) Message: OLE DB error: OLE DB or ODBC error: Operation canceled; HY008. (Source: [\\?\C:\OLAP\Log\msmdsrv.log](file://\\?\C:\OLAP\Log\msmdsrv.log), Type: 3, Category: 289, Event ID: 0xC1210003) (6/12/2012 4:52:24 PM) Message: OLE DB error: OLE DB or ODBC error: Operation canceled; HY008. (Source: [\\?\C:\OLAP\Log\msmdsrv.log](file://\\?\C:\OLAP\Log\msmdsrv.log), Type: 3, Category: 289, Event ID: 0xC1210003) (6/12/2012 4:45:33 AM) Message: OLE DB error: OLE DB or ODBC error: Operation canceled; HY008. (Source: [\\?\C:\OLAP\Log\msmdsrv.log](file://\\?\C:\OLAP\Log\msmdsrv.log), Type: 3, Category: 289, Event ID: 0xC1210003)

前面的日志输出指示 OLE DB 提供程序报告了错误十六进制代码 0xC1210003。

尝试简化错误

如果无法确定导致问题的特定对象和属性,请通过限制与关系数据库的连接数来简化处理并行度。

在解决方案资源管理器中,选择数据源属性。 将 最大连接数 从值 10 调整为 1。 下次处理对象时,任何失败都可能会更好地显示问题属性和更确切的错误说明。

多维数据集处理的背景

当 Analysis Services 处理多维数据集或较低级别的对象(如维度或度量值组)时,它会通过 OLE DB 提供程序将许多大型 SQL 查询发送到关系数据库引擎。 例如,SELECT * FROM DimTABLE1, SELECT * FROM FactTable1。

这些处理查询可能需要数分钟到数小时才能运行。 时间长度取决于有多少联接以及表和分区的大小。 联接数完全取决于多维数据集设计,以及设计中的维度和度量值组关系。

若要连接到关系数据源,多维数据集设计中存储了一些连接字符串,用于指向数据库服务器中的数据仓库。

这是保存到 Analysis Services 数据库设计的连接字符串。 它可以指向 SQL Server,也可以指向其他第三方关系数据库,例如 Teradata 和 Oracle。 在以下屏幕截图中,将显示名为 SQLNCLI11.1 的 SQL Server 2012 OLE DB 提供程序。

命令和连接超时的背景

每当在 SQL Server 中向数据源发出 T-SQL 查询等命令时,命令超时属性由 Analysis Services 调用方设置。

以下示例演示 ADO 伪代码,演示如何通过内部运行 Analysis Services 的代码设置命令超时:

conn1.Open(); command = conn1.CreateCommand(); command.CommandText = "Select * from DimTable"; command.CommandTimeout = 15;

在前面的示例中,如果传递了 15 秒并且查询尚未完成,则 OLE DB 提供程序代表调用方取消查询。 调用方不必保留任何计时器,因为超时是在提供程序层中设置的。 但是,如果查询失败,调用方并不真正知道它花费的时间,以及它是否是超时时间。

在 OLE DB 术语中,此属性在 DBPROPSET_ROWSET 对象上称为 DBPROP_COMMANDTIMEOUT 。 此属性允许你运行查询一定的时间。 如果命令未完成,则会取消该命令。 在 SQL Server 中,可以在探查器跟踪中看到具有“注意”事件的此类超时。 在该探查器跟踪中,事件持续时间与命令超时的持续时间完全匹配。

命令超时设置未在连接或连接字符串本身上设置。 必须在建立连接后设置它,因为使用了每个命令对象。 对象DBPROPSET_DBINIT上有类似的连接超时DBPROP_INIT_TIMEOUT。 在 Analysis Services 中,连接超时是单独的属性 ExternalConnectionTimeout。 此设置适用于与服务器进行初始联系,并检查帐户的身份验证和授权。 此设置通常不会影响长时间运行的查询,因为初始连接成功且未失败。

可以在 Analysis Services 中控制 OLE DB 命令超时。 Analysis Services 实例上的高级选项中有 一个 ExternalCommandTimeout 设置。 默认值为 60 分钟, (一小时) 。  该超时值可能不够长。 此默认配置允许任何一个 T-SQL 查询关系数据库持续一小时或多小时。 在该点之后,OLE DB 访问接口取消了用于连接到该系统的命令,Analysis Services 处理命令将失败。

ExternalCommandTimeout 整数属性为向外部服务器发出的命令定义超时(以秒为单位),其中包括关系数据源和外部 Analysis Services 服务器。 此属性的默认值为 3,600 秒。

如果预期处理查询需要一个多小时,请提高超时时间超过一小时。 在一个示例中,处理联接查询大约需要 9 个小时才能在具有一些大型复杂联接的 2 TB 数据库上完成。

右键单击 ManagementStudioProperties> 中的服务器名称。 选中“ 显示高级 (所有) 属性 ”复选框。 然后调整 ExternalCommandTimeout 设置,如下图所示:

现在,当服务器运行外部查询以与关系数据库通信时,它会将命令超时设置为指定的值,以便它可以长时间运行,而不会失败。

长时间处理持续时间可能导致超时

如果处理查询需要一个多小时,则可能有一些方法可以优化系统以更快地执行:

优化 Analysis Services 代表你在后台运行所有这些处理查询时执行的联接。 对度量组进行分区,以便通过处理完成的工作单位是较小的数据区块,而不是一次性所有数据。 分区需要仔细思考和多维数据集设计工作。 如果数据在表中的行数超过 2000 万行,并且你会看到处理性能问题,请考虑分区。 优化关系数据库系统

运行多维数据集处理一次或两次后,在关系数据库或数据仓库系统中查找缺少的索引。 花几分钟时间优化数据库。 将一些索引添加到关系数据仓库表,以帮助优化联接条件以处理多维数据集。

以下 T-SQL 代码是从支持工具 PSSDiag 中借来的。 它标识最有用的缺失索引,适用于 SQL Server 2005 及更高版本。 查找事实和维度表上的索引,以帮助提高性能。 请记住,虽然添加索引可能有助于读取多维数据集处理等性能,但它可能会降低某些插入和更新性能,例如提取、转换、加载 (ETL) 活动。

PRINT 'Missing Indexes: ' PRINT 'The "improvement_measure" column is an indicator of the (estimated) improvement that might ' PRINT 'be seen if the index was created. This is a unitless number, and has meaning only relative ' PRINT 'the same number for other indexes. The measure is a combination of the avg_total_user_cost, ' PRINT 'avg_user_impact, user_seeks, and user_scans columns in sys.dm_db_missing_index_group_stats.' PRINT '' PRINT '-- Missing Indexes --' SELECT CONVERT (varchar, getdate(), 126) AS runtime, mig.index_group_handle, mid.index_handle, CONVERT (decimal (28,1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) AS improvement_measure, 'CREATE INDEX missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns,'') + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement, migs.*, mid.database_id, mid.[object_id] FROM sys.dm_db_missing_index_groups mig INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle WHERE CONVERT (decimal (28,1), migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)) > 10 ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC PRINT '' GO 内存竞争对超时的影响

出现超时的原因有多种,许多原因包括非超时方案。 处理 T-SQL 查询取消的第二个最常见原因是内存不足故障。

SQL Server 数据库引擎 (SQLServr.exe) 、Analysis Services (MsMdsrv.exe) 、Integration Services 包 (DTExec.exe 或 ISServerExec.exe) 之间的内存竞争,以及在同一台计算机上运行的Reporting Services。 可能需要限制其他服务或平衡内存分配。 最常见的调整是限制 SQL Server 最大服务器内存 设置。

多维数据集处理就像用作数据仓库的 SQL Server 最密集的处理时间,因为 Analysis Services 同时将具有复杂联接的多个大型查询推送到 SQL 关系数据库引擎。

exec sp_configure 'show advanced',1; reconfigure; exec sp_configure 'min server memory'; exec sp_configure 'max server memory'; -- look at config_value in the results for the current MB setting configured

通常运行的 ETL 进程很少受益于 SQL Server 数据库引擎缓冲池的正常缓冲。 请考虑 SQL Server Integration Services (SSIS) 包,这些包将事务系统中的大量数据导入数据仓库系统。 ETL 操作通常使用内存中不需要太多暖数据的 BULK INSERT 命令。

在生成数据仓库的 ETL 阶段,其他 ETL 操作受益于 SQL 的大型缓冲池。 读取 (SELECT) 和 ETL 处理的 UPDATE 和 JOIN 部分(例如查找和缓慢更改维度更新)在内存中使用缓存的暖数据(如果可用)。 降低 SQL Server 数据库引擎的内存可能会对通常发生在多维数据集处理前的 ETL 导入的那些部分产生副作用。

从 RAM 读取数据比从平均旋转磁盘驱动器读取快 1000-100 万倍,因此收缩 SQL 缓冲池意味着更多的磁盘读取。 除非有高端固态磁盘 (SSD) 或高端 SAN,否则可能会稍等一会儿。

测量系统中的内存消耗量

如果内存是罪魁祸首,请收集探查器跟踪和这些性能计数器,以更好地调查原因:

设置 Windows 性能监视器以生成资源消耗的跟踪。 选择 StartRunPerfmon>>。

右键单击性能日志下的树中的“计数器日志”图标,然后开始新的计数器日志。 将日志命名。

为以下对象添加计数器:每个对象的 所有 计数器,以及每个对象的 所有 实例。

内存 MSAS* --- Analysis Services 默认实例的所有对象 () MSOLAP$InstanceName* --- Analysis Services 命名实例的所有对象 () MSSQL* --- SQL Server 数据库引擎) 的所有对象 ( 分页文件 过程 处理器 系统 线程

每 15 秒采样一次。

在 “日志 ”选项卡上,将目录和文件名策略指定为 二进制文件。

若要获取一天一次要滚动到新文件的性能监视器,请在“计划”选项卡上选择:

在:1 天后停止日志 日志文件关闭时:启动新日志文件 查看性能监视器结果

查看 SQL Server 引擎的计数器,看看 SQL MemoryTotalServer 内存>是否正在失控。

查看 MemoryAvailable> MBytes 计数器,查看 Windows 中运行的进程可用的可用内存量。

查看各种可执行进程的 ProcessPrivate> 字节数,了解每个进程之间的比较量。

查看 MSAS 和 MSOLAP 计数器。 如果使用量超出 高 KB 量,Analysis Services 必须剪裁内存中的一些缓冲区。

Memory Usage KB Memory Limit High KB Memory Limit Low KB Memory Limit Hard KB

如果 内存使用量 KB 量超过 硬 KB 限制,Analysis Services 可能会取消所有当前工作并进入 恐慌模式 ,以终止内存使用者。 恐慌模式可能以类似的错误的形式出现,但通常错误更具描述性,例如 The Operation Has been Cancelled 或 The session was canceled because it exceeded a timeout setting (session orphaned timeout or session idle timeout) or it exceeded the session memory limit.

对超时的并行处理影响

Analysis Services 处理命令可以并行或按顺序运行。 在处理命令语法中,检查是否指定按顺序运行或并行运行。 检查运行处理的 SSIS 包或 XMLA 作业。

此图显示了 SSIS Analysis Services 处理任务的设置:

此示例演示一个 XMLA 命令,该命令最多并行运行 8 个任务:

AdventureWorksDW2012Multidimensional-EE ProcessFull UseExisting

如果系统超时,可能需要缩减并行任务的数量,尤其是在手动替代默认设置时, 让服务器决定。

通过减少 MaxThreads 配置并重新处理对象,以便一次运行更少的线程,可以更好地限制系统。

在最坏的情况下,在 顺序 模式下运行处理,以查看错误是否消失。 系统一次运行一个任务序列的内存更少,而不是一次运行多个任务。 权衡可能是它运行的时间更长,因为无法将系统硬件推送到相同的吞吐量限制。

若要了解有关处理最佳做法的详细信息,请参阅 SQL Server 最佳做法。

有关多维数据集处理体系结构的详细信息,请参阅 Analysis Services 2005 处理体系结构。

对超时的聚合内存影响

AggregationMemoryLimitMax 有一个高级设置。 有关详细信息,请参阅 此博客文章

SQL Server Analysis Services使用内存配额来控制并发作业数。 每个作业计算完成作业所需的内存量,并根据其估计请求内存配额。 仅当授予内存配额时,作业才会继续。 我们估计聚合作业的配额。 控制内存使用情况估计的配置设置是 AggregationMemoryLimitMin 和 AggregationMemoryLimitMax。

若要实现更并行的处理,请优化设置。

其他超时设置

查询超时 是数据源上的另一个设置。 此设置似乎不适用于处理。 此设置适用于连接池,有助于使不再需要的空闲连接过期。 此设置不适用于在处理期间运行的命令或 ROLAP 命令。

Analysis Services 中存在许多其他超时,例如:

如果 MDX 查询保留阻止处理提交操作的锁,则 ForceCommitTimeout 用于处理以终止用户查询。 如果提交阶段被阻止,则用于处理要放弃的 CommitTimeout。 ServerTimeout 用于在一段时间后超时的查询。 连接池设置,例如 IdleConnectionTimeout、 IdleOrphanSessionTimeout、 MaxIdleSessionTimeout、 MinIdleSessionTimeout 和 DatabaseConnectionPoolConnectTimeout,以及前面讨论过的, ExternalConnectionTimeout 和 ExternalCommandTimeout。 特殊字符

在某些情况下,处理超时错误是由于维度表之一列中存在的一些特殊字符导致的。 即使是维度列中的 null 值 也可能导致处理失败。

通过一次处理每个对象,可以更好地隔离问题,直到发现问题。

例如,在处理维度表时,它会引发错误 OLE DB error: OLE DB or ODBC error: Operation canceled; HY008.

用户删除特殊字符后,处理将按预期工作。

隔离到分区

可以进一步将错误隔离到特定的分区。 如果对多维数据集进行了分区,则其中一个分区下可能存在性能不佳的查询。

试验分区查询。 改为从数据源视图中的直接命名查询表更改为基础 SQL 查询。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3