我们在 SSAS 中使用表格模型。作为日常多维数据集处理(Process Full)的一部分,ETL中有一个步骤,它重新启动了多维数据集服务器上的分析服务(以清除内存)。在这里,我们面临一个间歇性问题。分析服务有时会停止但不会恢复(5 次中有 2 次)。我们收到的错误是
调用的目标已抛出异常
所以必须有人登录服务器并手动启动服务。正如我所提到的,此错误并非每天都会发生。
笔记
我们在多维数据集处理期间每天同步的两个 SSAS 节点(2 个物理负载平衡 SSAS 服务器)上有 NLB。上面的错误发生在其中任何一个上。
重新启动 SSAS 的代码
public void Main()
{
Process[] processArray = Process.GetProcessesByName("MSSQLServerOLAPService", Dts.Variables["ProcessServerName"].Value.ToString());
foreach (Process process in processArray) //kill all instances of the SSAS process
{
process.Kill();
process.WaitForExit(); //wait for the process to be killed
}
ServiceController service = new ServiceController("MSSQLServerOLAPService", Dts.Variables["ProcessServerName"].Value.ToString());
if (service.Status != ServiceControllerStatus.Stopped && service.Status != ServiceControllerStatus.StopPending) //check to make sure the killed process resulted in a stopped service
{
service.Stop();
}
service.WaitForStatus(ServiceControllerStatus.Stopped);
service.Start(); //restart the SSAS service
Thread.Sleep(Convert.ToInt32(Dts.Variables["ServiceRestartDurationSeconds"].Value.ToString()) * 500);
service.WaitForStatus(ServiceControllerStatus.Running);
ConnectionManager cm = Dts.Connections["AW Cube Process"];
string connectionString = cm.ConnectionString.ToString();
AdomdConnection adomdConn = new AdomdConnection(connectionString);
adomdConn.Open(); //this kick starts loading the Tabular Model data into memory
Thread.Sleep(Convert.ToInt32(Dts.Variables["ServiceRestartDurationSeconds"].Value.ToString()) * 500);
Dts.TaskResult = (int)ScriptResults.Success;
}
问题
1)这个错误的可能原因是什么?
2)重新启动分析服务的唯一原因是清除旧模型的内存并将表格模型重新加载到内存中。但这是我们希望尽可能避免的事情。是否存在可以替代重新启动分析服务的更好方法或解决方法?
如果您需要更多信息,请告诉我。
谢谢!