Sql-Server

SQL Server 在索引重建時掛起,在 SQL 服務重新啟動後執行良好

  • November 12, 2020

我們有一個 SQL Server 2014 企業集群。伺服器 1 和伺服器 2。SQL Server 的記憶體限制為 64GB。

我們每週使用 Ola Hallengren 腳本對所有數據庫進行一次索引重建和優化。

每次腳本觸發時,有時會掛在同一個索引上

ALTER INDEX [SecretId] ON [someDB].[dbo].[Articles] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON)

這是數據庫中的唯一標識符欄位。表有大約 150 萬條記錄。

當索引重建掛起時,我們將故障轉移到另一個 SQL 伺服器,在第一個伺服器上重新啟動服務,然後故障轉移回實例一個。之後,我們重新執行腳本進行索引重建,幾分鐘就順利通過了。

為什麼我們需要重新啟動服務才能成功重建索引?

我最近遇到了這個問題。就我而言,Paul Williams的評論很到位,這與nvarchar(max)我擁有的儲存 JSON 和 HTML 的複雜列有關:

這是一個大的varbinary還是nvarchar(max)列的表?我已經看到這些表格的異常維護行為。

我使用以下查詢將其縮小到有問題的表,這與https://ola.hallengren.com/scripts/misc/CommandLogSelect.sql上的 Ola 腳本略有不同

帶有 null 的索引EndTime是發生崩潰的地方,很可能在返回的最後一行中。

use [master];
SELECT DatabaseName,
      SchemaName,
      ObjectName,
      CASE WHEN ObjectType = 'U' THEN 'USER_TABLE' WHEN ObjectType = 'V' THEN 'VIEW' END AS ObjectType,
      IndexName,
      CASE WHEN IndexType = 1 THEN 'CLUSTERED' WHEN IndexType = 2 THEN 'NONCLUSTERED' WHEN IndexType = 3 THEN 'XML' WHEN IndexType = 4 THEN 'SPATIAL' END AS IndexType,
      PartitionNumber,
      ExtendedInfo.value('(ExtendedInfo/PageCount)[1]','int') AS [PageCount],
      ExtendedInfo.value('(ExtendedInfo/Fragmentation)[1]','float') AS Fragmentation,
      CommandType,
      Command,
      StartTime,
      EndTime,
      DATEDIFF(ss,StartTime, (CASE WHEN EndTime IS NULL THEN StartTime ELSE EndTime END)) AS Duration,
      ErrorNumber,
      ErrorMessage
FROM dbo.CommandLog
WHERE CommandType = 'ALTER_INDEX'
ORDER BY StartTime ASC;

檢查dbo.CommandLog表以查看錯誤是什麼(對於 IndexOptimize)?

如果它是鎖定超時(來自阻塞),那麼顯然故障轉移會解決它,因為重啟後不應該阻塞

您還可以執行sp_whoisactive來查找 Head 阻止程序

在我的工作中,有時甚至在 1 分鐘或 10 分鐘後重試(無需故障轉移),因為 BLOCKING 會話已清除/釋放鎖定

但有時重試一個小時後它仍然會失敗(在 SQL 作業內)

讓我們知道結果如何

祝你好運

引用自:https://dba.stackexchange.com/questions/221742