Sql-Server
SQL Server 在索引重建時掛起,在 SQL 服務重新啟動後執行良好
我們有一個 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 作業內)
讓我們知道結果如何
祝你好運