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

SQL Server 資料庫進入疑似狀態的修復全攻略

     編輯:關於SqlServer

問題成因

當 SQL Server 因磁碟空間不足無法完成資料庫復原時,會返回錯誤 1105,並將 sysdatabases 中的 status 設為「疑似」。錯誤訊息典型如下:

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.

觸發情境包含:大量批次作業、未提交交易、檢查點截斷頻寬不足、截斷閾值超標、發布標記交易未被日誌讀取器讀走等,甚至可能發生於 master 或 tempdb 等系統資料庫。

修復步驟

  1. 以單用戶模式啟動 SQL Server
    命令提示字元執行:SQLSERVER -f -m
    -m 為單用戶模式,僅允許一個連線,注意避免其他服務搶佔連線。
  2. 重置疑似狀態旗標
    EXEC sp_resetstatus 'database_name'
    回傳:Database 'database_name' status reset! WARNING: You must reboot SQL Server prior to Accessing this database!
  3. 新增資料檔或記錄檔擴充空間
    範例腳本:
USE master;
GO
-- 新增資料檔
ALTER DATABASE db_name ADD FILE (
    NAME = dbname_dat2,
    FILENAME = 'F:\MSSQL\DATA\dbname_dat2.ndf',
    SIZE = 2000MB,
    FILEGROWTH = 50MB
);
GO
-- 新增記錄檔
ALTER DATABASE db_name ADD LOG FILE (
    NAME = db_name_log2,
    FILENAME = 'F:\MSSQL\Data\db_name_log2.ldf',
    SIZE = 1000MB,
    FILEGROWTH = 20MB
);
GO
  1. 重啟 SQL Server,利用新增空間完成復原。
  2. 釋放磁碟空間並收縮記錄檔,徹底解決根本問題。

長效預防配置

方案 A:簡單復原模式(不需時間點還原)

USE MASTER;
GO
ALTER DATABASE DB_NAME SET RECOVERY SIMPLE;

簡單模式下 UPDATE/DELETE/INSERT 不記錄完整日誌,避免日誌暴增。

方案 B:完整復原模式 + 日誌自動截斷

USE MASTER;
GO
EXEC sp_dboption 'databasename', 'trunc. log on chkpt.', true;

或於企業管理員中設定資料庫屬性「截斷記錄檔於檢查點」。

關鍵提醒

  • sp_resetstatus 僅重置旗標,不修復實際資料損壞,後續必須執行 DBCC CHECKDB 驗證一致性。
  • 新增檔案路徑務必確保磁碟剩餘空間充足。
  • 生產環境建議啟用日誌備份作業,定期截斷非作用中虛擬記錄檔(VLF)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved