首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

SQL Server 交易記錄檔被寫滿:常見原因與應對策略

     編輯:更多程式設計知識

錯誤訊息

Error 1105: Can't allocate space for object 'syslogs' in database 'dbname' 
because the 'logsegment' is full. If you ran out of space in syslogs, 
dump the transaction log. Otherwise use ALTER DATABASE or sp_extendsegment 
to increase the size of the segment.

五大常見原因

  1. 大量交易:批次更新/插入/刪除百萬列,單一交易產生大量記錄,超出記錄檔空間。
  2. 長時間未提交的交易:應用程式開啟交易後因邏輯錯誤或等待使用者輸入而不 Commit/Rollback,導致記錄檔無法截斷。
  3. 檢查點無法推進:`CHECKPOINT` 需要將髒頁寫入資料檔並截斷記錄檔,若 I/O 瓶頸或資料檔空間不足,檢查點延遲,記錄檔持續增長。
  4. 記錄檔自動成長觸發頻繁/達上限:`MAXSIZE` 限制或磁碟空間耗盡,自動成長失敗。
  5. 複寫/CDC/AlwaysOn 讀取延遲:記錄讀取器 (Log Reader) 落後,記錄檔無法截斷,需監控 `log_reuse_wait_desc`。

診斷查詢

-- 查看記錄檔空間使用
DBCC SQLPERF(LOGSPACE);

-- 查看無法截斷原因
SELECT name, log_reuse_wait_desc
FROM sys.databases
WHERE name = 'YourDB';

-- 查看作用中交易
DBCC OPENTRAN('YourDB');

緊急紓解步驟

  1. 確認磁碟剩餘空間,必要時擴充磁碟或移動記錄檔 (`ALTER DATABASE ... MODIFY FILE`)。
  2. 若為簡單復原模式:執行 `CHECKPOINT` 強制截斷。
  3. 若為完整復原模式:立即進行**記錄檔備份** (`BACKUP LOG ... TO DISK='...'`),釋放虛擬記錄檔 (VLF)。
  4. 找出並結束長時間開啟的交易 (`KILL spid`)。

長期預防

  • 設定合理的**初始大小**與**自動成長增量** (建議固定 MB,避免百分比)。
  • 啟用**記錄檔備份作業** (完整/大量記錄復原模式下),排程每 15-60 分鐘。
  • 監控 `log_reuse_wait_desc` 不為 `NOTHING` 的資料庫,設定警報。
  • 大量異動作業 (匯入、清理) 改用**分批提交**、**最小記錄操作** (`BULK INSERT`、`TRUNCATE TABLE`、關聯索引重建)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved