我们有一个每天午夜运行的 SSIS 包。它使用 ADSI 查询从 Active Directory 中提取数据,并将数据推送到 CRM。
它唯一一次“失败”是在周日晚上。问题就在这里:它成功了,并发送了一封电子邮件表示成功了,但我们从 SQL Sentry、SSRS 中的作业报告和 SQL 作业历史记录中收到了一条失败的错误消息。查询几乎总是在两分钟内完成,我们在 CRM 中看到了数据。
执行时没有其他作业正在运行,也没有更早开始并在午夜仍在运行的作业。这始于四周前,没有人做出任何改变。当我们联系我们的基础设施/系统团队询问是否有任何变化时,他们说没有,并建议这可能是来自备份。当时没有运行本机 SQL 备份作业。我怀疑是 Veeam 导致了这个问题,但我还是想提一下。
此 SQL Server 版本为 14.0.3465.1。
Windows Server 2016 标准版本 1607 已于上周三完成修补。
这是错误消息和查询:
select q1.employeeNumber, 'telephoneNumber'=CASE WHEN right(dbo.udf_GetNumeric(q1.telephoneNumber),10)='0' THEN null ELSE right(dbo.udf_GetNumeric(q1.telephoneNumber),10) END,
'mobile'=CASE WHEN right(dbo.udf_GetNumeric(q1.mobile),10)='0' THEN null ELSE right(dbo.udf_GetNumeric(q1.mobile),10) END,
q1.company, q1.Country, q2.[3DigitCode], q2.CountryCode
来自(SELECT 雇员编号、电话号码、手机、公司、'国家/地区'=CASE WHEN co 为空 THEN '美国' ELSE co END FROM OPENQUERY(ADSI,'SELECT 雇员编号、电话号码、手机、邮件、公司、co、c、countryCode FROM ''LDAP://MyServer/OU=MyCompany USERS,DC=MyCompany,DC=com'' WHERE objectCategory = ''Person'' 和 objectClass = ''User'' 和 employeeNumber>=0 和 employeeNumber<200000 和 userAccountControl<>''514'' 和 userAccountControl<>''66050'''))作为 q1 LEFT OUTER JOIN Map_AD_Codes q2 on q2.Country = q1.Country
经过大量挖掘和性能分析后,我们发现问题出在 I/O 过高。我们使用 SQL Sentry、DMV 和日志确定问题可能是由第三方备份(在本例中为 Veeam)引起的。
我们与基础设施/系统管理员团队合作,确定了这些完整备份,具体是在周日晚上。我们发现完整备份需要的时间越来越长,最终影响了 SSIS 作业。
我感谢任何花时间阅读该问题的人,即使没有给出任何答复。