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

SQL Server 2008 清空交易記錄檔標準流程:切換復原模式 → SHRINKFILE → 切回完整模式

     編輯:關於SqlServer

SQL Server 2005 時代常用 BACKUP LOG ... WITH NO_LOG / DUMP TRANSACTION ... WITH NO_LOG 截斷記錄檔,但此語法在 SQL Server 2008 已移除。本文提供 2008 官方標準流程:切換至 SIMPLE 復原模式 → DBCC SHRINKFILE (TRUNCATEONLY) → 切回 FULL 模式,並補充附加資料庫唯讀錯誤的服務帳戶解法。

SQL Server 2008 標準清空記錄檔腳本

-- 1. 切換至簡單復原模式 (立即截斷非作用中 VLF)
USE [master];
GO
ALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAIT;
GO
ALTER DATABASE DNName SET RECOVERY SIMPLE;  -- 確認生效
GO

-- 2. 縮減記錄檔 (僅釋放檔案尾端未使用空間,不移動資料頁)
USE DNName;
GO
DBCC SHRINKFILE (N'DNName_Log', 11, TRUNCATEONLY);  -- 目標縮減至 11MB
GO

-- 3. 切回完整復原模式 (恢復記錄鏈,啟用點對點還原能力)
USE [master];
GO
ALTER DATABASE DNName SET RECOVERY FULL WITH NO_WAIT;
GO
ALTER DATABASE DNName SET RECOVERY FULL;
GO

關鍵參數說明

指令/選項作用
WITH NO_WAIT不等待鎖定,立即返回 (若資源忙碌則失敗,避免封鎖)
TRUNCATEONLY僅釋放檔案末端未配置空間,不移動資料頁,速度極快、無碎片風險
目標大小 (11)單位 MB,建議設為略大於實際使用量 (可用 DBCC SQLPERF(LOGSPACE) 查詢)

常見誤區與避坑指南

  • ❌ 直接 SHRINKFILE 不切 SIMPLE:FULL 模式下作用中 VLF 無法截斷,縮減無效。
  • ❌ 用 NOTRUNCATE 移動資料頁:產生大量 I/O、索引碎片,且仍受限於作用中 VLF 位置。
  • ❌ 縮減後忘記切回 FULL:斷開記錄備份鏈,災難復原能力歸零。
  • ✅ 縮減完成立即執行完整備份:重置差異/記錄備份基準,確保還原鏈完整。

附錄:附加資料庫提示「檔案唯讀」但屬性非唯讀 — 服務帳戶權限問題

現象:使用 sa 登入 SSMS 附加資料庫,報錯 File is read-only,但檔案屬性明顯非唯讀。

根因:SQL Server 服務啟動帳戶為 Network Service,僅有預設資料目錄 (DATA) 權限,無法存取其他路徑檔案。

解法 (二擇一):

  1. 將資料庫檔案放置於預設 DATA 目錄下附加。
  2. 或變更 SQL Server 服務登入身分為 Local System 或具備完整磁碟權限的網域帳號:
    「SQL Server Configuration Manager」→ 「SQL Server 服務」→ 右鍵執行個體 → 「屬性」→ 「登入」分頁 → 選「本機系統帳戶」或輸入網域帳號密碼 → 重啟服務。

進階場景:記錄檔極大且常規縮減失效

若上述流程仍報 Cannot shrink log file because of minimum log space required,參考「終極解法」:
Detach → 刪除/重命名 .ldf → Attach 僅加入 .mdf → SQL Server 自動重建記錄檔 → 立即完整備份。
詳細步驟見文章 ID 49117。

掌握標準流程,配合定期記錄檔備份與 MAXSIZE 限制,即可長期維持記錄檔健康體態,避免磁碟空間危機。

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