SQL Server無法收縮日志文件的原因分析及解決辦法
最近服務(wù)器執(zhí)行收縮日志文件大小的job老是報錯

我所用的一個批量收縮日志腳本
USE [master]
GO
/****** Object: StoredProcedure [dbo].[ShrinkUser_DATABASESLogFile] Script Date: 01/05/2016 09:52:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[ShrinkUser_DATABASESLogFile]
AS
BEGIN
DECLARE @DBNAME NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
--臨時表保存數(shù)據(jù)
CREATE TABLE #DataBaseServerData
(
ID INT IDENTITY(1, 1) ,
DBNAME NVARCHAR(MAX) ,
Log_Total_MB DECIMAL(18, 1) NOT NULL ,
Log_FREE_SPACE_MB DECIMAL(18, 1) NOT NULL
)
--游標(biāo)
DECLARE @itemCur CURSOR
SET
@itemCur = CURSOR FOR
SELECT name from SYS.[databases] WHERE [name] NOT IN ('MASTER','MODEL','TEMPDB','MSDB','ReportServer','ReportServerTempDB','distribution')
and state=0
OPEN @itemCur
FETCH NEXT FROM @itemCur INTO @DBNAME
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL=N'USE ['+@DBNAME+'];'+CHAR(10)
+'
DECLARE @TotalLogSpace DECIMAL(18, 1)
DECLARE @FreeLogSpace DECIMAL(18, 1)
DECLARE @filename NVARCHAR(MAX)
DECLARE @CanshrinkSize BIGINT
DECLARE @SQL1 nvarchar(MAX)
SELECT @TotalLogSpace=(SUM(CONVERT(dec(17, 2), sysfiles.size)) / 128)
FROM dbo.sysfiles AS sysfiles WHERE [groupid]=0
SELECT @FreeLogSpace = ( SUM(( size - FILEPROPERTY(name, ''SpaceUsed'') )) )/ 128.0
FROM sys.database_files
WHERE [type] = 1
SELECT @filename=name FROM sys.database_files WHERE [type]=1
SET @CanshrinkSize=CAST((@TotalLogSpace-@FreeLogSpace) AS BIGINT)
SET @SQL1 = ''USE ['+@DBNAME+']''
SET @SQL1 = @SQL1+
''DBCC SHRINKFILE (['' + @filename + ''],'' + CAST(@CanshrinkSize+1 AS NVARCHAR(MAX)) + '')''
EXEC (@SQL1)'
EXEC (@SQL)
FETCH NEXT FROM @itemCur INTO @DBNAME
END
CLOSE @itemCur
DEALLOCATE @itemCur
SELECT * FROM [#DataBaseServerData]
DROP TABLE [#DataBaseServerData]
END
幸虧報錯信息還是很全面,根據(jù)報錯信息找到相關(guān)的數(shù)據(jù)庫,執(zhí)行一下DBCC LOGINFO
dbcc loginfo(N'cdb')

發(fā)現(xiàn)確實只有兩個VLF文件,不能再收縮了,因為是批量腳本,當(dāng)其中有一個庫失敗之后,后續(xù)的庫就不會再進(jìn)行收縮操作
這里只要加上數(shù)據(jù)庫的VLF數(shù)量的判斷就可以了

本文寫的不好,還請各位大俠提出寶貴意見,如有好的解決方案歡迎分享,大家共同學(xué)習(xí)進(jìn)步。
相關(guān)文章
sql語句查詢數(shù)據(jù)庫中的表名/列名/主鍵/自動增長值實例
sql語句查詢數(shù)據(jù)庫中的表名/列名/主鍵/自動增長值實例,需要的朋友可以參考下2012-06-06
基于SQL Server中如何比較兩個表的各組數(shù)據(jù) 圖解說明
本篇文章小編為大家介紹,基于SQL Server中如何比較兩個表的各組數(shù)據(jù) 圖解說明。需要的朋友參考下2013-04-04
SQL Server將一列的多行內(nèi)容拼接成一行的實現(xiàn)方法
這篇文章主要介紹了SQL Server將一列的多行內(nèi)容拼接成一行的實現(xiàn)方法,需要的朋友可以參考下2015-11-11
SQL窗口函數(shù)之聚合窗口函數(shù)的使用(count,max,min,sum)
許多常見的聚合函數(shù)也可以作為窗口函數(shù)使用,包括AVG()、SUM()、COUNT()、MAX()以及MIN()等函數(shù),本文就詳細(xì)的介紹了SQL窗口函數(shù)之聚合窗口函數(shù)的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
sql自動化檢查和分析工具 之soar和soar-web 安裝和使用體驗
這篇文章主要介紹了sql自動化檢查和分析工具 之soar和soar-web 安裝和使用體驗,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
記一次公司倉庫數(shù)據(jù)庫服務(wù)器死鎖過程及解決辦法
根據(jù)操作系統(tǒng)中的定義:死鎖是指在一組進(jìn)程中的各個進(jìn)程均占有不會釋放的資源,但因互相申請被其他進(jìn)程所站用不會釋放的資源而處于的一種永久等待狀態(tài)。下面小編給大家分享一次公司倉庫數(shù)據(jù)庫服務(wù)器死鎖過程及解決辦法,需要的朋友一起看看吧2015-09-09
SQL Server 通過with as方法查詢樹型結(jié)構(gòu)
with as 公用表表達(dá)式類似VIEW,但是不并沒有創(chuàng)建對象,WITH AS 公用表表達(dá)式不創(chuàng)建對象,只能被后隨的SELECT語句2019-11-11

