首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

解決「Microsoft OLE DB Provider for SQL Server 錯誤 '80040e31' 逾時已過期」:資料庫檔案自動成長導致的隱性阻塞

     編輯:關於SqlServer

現象與誤區

  • 錯誤訊息:`Microsoft OLE DB Provider for SQL Server 錯誤 '80040e31' 逾時已過期`。
  • 常被誤判為:「SQL 語句效能差」、「伺服器壓力大」、「鎖定/阻塞」。
  • **真相**:往往是**資料檔或記錄檔自動成長** 觸發同步 IO,導致所有連線在成長完成前**全部阻塞**。

根因分析

  1. 預設設定:檔案滿時**自動成長 10%** (或固定 1MB/10%)。
  2. 資料庫達 10GB+ 時,10% = **1GB+ 同步寫入零頁 (Zero Initialization)** (除非啟用瞬間檔案初始化)。
  3. 此期間資料庫引擎**暫停所有 IO 請求**,連線堆積 → 指令逾時 → 應用端回報 `80040e31`。
  4. 成長完成後阻塞自動釋放,事後查詢分析器執行同樣 SQL **極快**,無法複現。

解決方案 (按推薦順序)

1. 固定增量,拒絕百分比 (核心修正)

-- T-SQL
ALTER DATABASE MyDB MODIFY FILE (NAME = MyDB_Data, FILEGROWTH = 512MB);
ALTER DATABASE MyDB MODIFY FILE (NAME = MyDB_Log,  FILEGROWTH = 512MB);
-- SSMS:資料庫屬性 → 檔案 → 自動增長 → 變更 → 以 MB 為單位 → 512
  • 建議值:資料檔 512MB-1GB,記錄檔 512MB (視負載調整)。
  • **啟用瞬間檔案初始化 (IFI)**:服務帳號加入「執行數量維護工作」權限 (`SeManageVolumePrivilege`),資料檔成長**跳過零頁初始化**,速度提升 10-100 倍。記錄檔**不受益** (必須零頁)。

2. 預先手動擴展 (離峰操作)

ALTER DATABASE MyDB MODIFY FILE (NAME = MyDB_Data, SIZE = 50GB);
ALTER DATABASE MyDB MODIFY FILE (NAME = MyDB_Log,  SIZE = 20GB);
  • 在維護窗口一次性擴展至預估峰值 1.5 倍,避免尖峰期自動成長。

3. 調整用戶端指令逾時 (治標)

  • ADO.NET:`SqlCommand.CommandTimeout = 120;` (秒),預設 30 秒。
  • 連接字串:`Connect Timeout=30; CommandTimeout=120`。
  • 經典 ASP/ADO:`Command.CommandTimeout = 120` 或 `Connection.CommandTimeout = 120`。

4. 監控與告警 (預防)

  • 設定 SQL Agent 警示:`SQL Server:Databases -> Data File(s) Size (KB)` / `Log File(s) Size (KB)` 閾值觸發作業 (擴展/通知)。
  • 監控 `sys.dm_db_file_space_usage`、`autogrow` 事件 (Extended Events / Profiler)。

驗證步驟

  1. 尋找阻塞鏈頭:`sp_who2` / `sys.dm_exec_requests` 找 `wait_type = PREEMPTIVE_OS_WRITEFILEGATHER` 或 `LOG_GROWTH`。
  2. 錯誤日誌檢視:`EXEC sp_readerrorlog 0, 1, 'Autogrow'` 確認自動成長頻率與耗時。
  3. 調整後觀察:尖峰期無 `80040e31`、無 `PREEMPTIVE_OS_WRITEFILEGATHER` 等待。有即表示成長仍發生,需再調大固定增量或預先擴展。

總結

**資料庫檔案自動成長是隱形效能殺手**。**固定增量 + 瞬間檔案初始化 + 尖峰前預先擴展** 是徹底解決之道;調整指令逾時僅為緩兵之計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved