標籤:end error 大小 software because stat logic log 實現
Message
Executed as user: CN\HKSQLPWV625sqlagent. Cannot shrink log file 2 (DIX_Log) because the logical log file located at the end of the file is in use. [SQLSTATE 01000] (Message 9008) DBCC execution completed. If DBCC printed error messages, contact your system administrator. [SQLSTATE 01000] (Message 2528) DBCC execution completed. If DBCC printed error messages, contact your system administrator. [SQLSTATE 01000] (Message 2528) Cannot shrink log file 2 (LTD_Log) because the logical log file located at the end of the file is in use. [SQLSTATE 01000] (Message 9008) DBCC execution completed. If DBCC printed error messages, contact your system administrator. [SQLSTATE 01000] (Message 2528) Backup, file manipulation operations (such as ALTER DATABASE ADD FILE) and encryption changes on a database must be serialized. Reissue the statement after the current backup or file manipulation operation is completed. [SQLSTATE 42000] (Error 3023). The step failed.
use DIX
dbcc loginfo
--建立表用於儲存loginfo資訊
create table DoxLoginfo
(
ID int identity,
RecoveryUnitId int null,
fileld int null,
filesize int null,
StartOffset int null,
Status int null,
Parity int null,
CreateLSN int null,
CreateDate datetime default getdate()
)
insert into DixLoginfo(RecoveryUnitId,fileld,filesize,StartOffset,FSeqNo,Status,Parity,CreateLSN)
EXEC (‘DBCC loginfo‘)
--查詢虛擬日誌最後一條狀態 並判斷為0時進行收縮
declare @status int select @status = Status from DixLoginfo where id = (select MAX(id) from DixLoginfo)
if (@status =0)
begin
DBCC SHRINKFILE(DIX_log,TRUNCATEONLY)
--刪除7天以外的loginfo
DELETE FROM DixLoginfo where datediff(day,createdate,getdate())>7
end
GO
--以下轉自互連網 作者不祥
每一個資料庫至少有一個記錄檔,無論為交易記錄定義多個少物理檔案,SQL Server均視為一個連續的檔案。該交易記錄檔實際上由一系列的虛擬記錄檔VLF來管理。虛擬記錄檔的大小由SQL Server的總記錄檔的大小決定。虛擬記錄檔的物理結構圖如下所示:
當該記錄檔收縮時,記錄檔末端的未使用的VLF可以被刪除。
在SQL server2000中,記錄檔僅可以從記錄檔的尾部收縮,但是微軟已經糾正先前在SQL server 7.0中的問題,當你備份或截斷日誌時,SQL Server會自動將日誌的活動部分轉移到檔案的始端,然後你運行DBCC SHRINKFILE或DBCC SHRINKDATABASE命令來釋放未使用的空間。
如果要判斷記錄檔中有多少個虛擬記錄檔,並且哪些虛擬記錄檔是活動的,可以使用未歸檔命令DBCC命令:DBCC LOGINFO,其文法如下:
DBCC LOGINFO [ ( dbname ) ]
下面我們來通過一個樣本來介紹DBCC LOGINFO的用法,同時查看日誌收縮與截斷的工作原理與實現機制。
首先,建立一個測試資料庫,指令碼如下:
USE MASTER;
Go
CREATE DATABASE logtest
GO
ALTER DATABASE logtest SET recovery FULL
GO
USE logtest;
GO
DBCC loginfo; GO
可以知道,活動的虛擬記錄檔的狀態(status)為2,logtest資料庫有兩個虛擬記錄檔,當前僅有一個虛擬記錄檔是活動的,現在建立一個表,然後填充一些行,以產生一些日誌再查看日誌的變化情況。
SELECT TOP 10000 * INTO bigOrderHeader
FROM AdventureWorks.Sales.SalesOrderHeader
GO
DBCC loginfo GO
此時你將看到記錄檔中有12個虛擬記錄檔,並且它們都是活動的(狀態都為2),現在,收縮日誌然後再查看有什麼變化?
DBCC SHRINKFILE (logtest_log) DBCC LOGINFO GO
由於未對資料庫進行備份,仍沒有活動事務,SQL Server將認為你不需要保留日誌的不活動部分,就將其刪除。現在對資料庫進行備份。
BACKUP DATABASE logtest
TO DISK = ‘f:\logtest.bak‘ GO 已為資料庫‘logtest‘,檔案‘logtest‘ (位於檔案1 上)處理了440 頁。
已為資料庫‘logtest‘,檔案‘logtest_log‘ (位於檔案1 上)處理了2 頁。
BACKUP DATABASE 成功處理了442 頁,花費0.851 秒(4.246 MB/秒)。
現在再運行一些日誌記錄,重新檢查日誌的變化情況:
SET ROWCOUNT 1000
GO
BEGIN TRAN
DELETE bigOrderHeader
ROLLBACK TRAN
GO
SET ROWCOUNT 0
GO
DBCC loginfo
GO
從注意到,現在有3個標記為2的活動事務,然後收縮該日誌:
DBCC shrinkfile ( logtest_log)
GO
無法收縮記錄檔2 (logtest_log),因為所有的邏輯記錄檔都在使用中。
(1 行受影響)
DBCC 執行完畢。如果DBCC 輸出了錯誤資訊,請與系統管理員聯絡。
從輸出資訊知道,該檔案的上一個虛擬記錄檔仍舊是活動的,因此發生了失敗,SQL Server不能從檔案的末端進行收縮,接著我們執行另一個事務,讓日誌繼續增長:
SET ROWCOUNT 5000 GO BEGIN TRAN DELETE bigOrderHeader ROLLBACK TRAN GO SET ROWCOUNT 0 GO DBCC loginfo GO
此時的日誌也不能進行收縮,原因在於標記的虛擬日誌用於還原作業,只有該日誌做了備份或截斷,其空間才可以被釋放。
BACKUP LOG logtest WITH TRUNCATE_only
DBCC loginfo
GO
現在作了標記的虛擬日誌將不再需要(日誌記錄要麼是截斷的要麼是已經備份至磁碟),記錄檔可以進行收縮。
DBCC shrinkfile (logtest_log)
DBCC loginfo
GO
(1 行受影響)
DBCC 執行完畢。如果DBCC 輸出了錯誤資訊,請與系統管理員聯絡。
(2 行受影響)
DBCC 執行完畢。如果DBCC 輸出了錯誤資訊,請與系統管理員聯絡。
Sql Server ShrinkFile Error 解決方案