我遇到了问题,
大型数据库上的日志文件不断变大。它设置为简单恢复,现在日志文件大40GB。
它到达了它填满硬盘的阶段,当我尝试在数据库中删除较旧的行时,它会尝试将此记录到日志文件中,并且它无法导致硬盘已满,因此无法删除条目。
那我该怎么办?
报废/删除/清空当前日志文件,我不需要其中的数据。
或b:
以不在日志文件中记录的方式从表中删除?
我试过了:
DBCC SHRINKFILE(FSK_LoggingServer__log, 200);
GO
但它会返回:
bdid, FieldId, CurrentSize, MinimumSize, UsedPages, EstimatedPages
32 2 4292352 512 4292352 512
并且它不会缩小文件。
答案 0 :(得分:0)
听起来你可能有一个长时间运行的查询阻止日志被截断。试试这个:
DECLARE @LT TABLE
(
spid INT ,
ttext VARCHAR(MAX) ,
TranBeginTime DATETIME
)
DECLARE @CaptureDate DATETIME = DATEADD(minute,DATEDIFF(minute, 0, DATEADD(second, 30 - DATEPART(second, GETDATE() + '00:00:30.000'), GETDATE())), 0)
INSERT INTO @LT
( spid ,
ttext ,
TranBeginTime
)
SELECT sessions.session_id ,
statements.text ,
at.transaction_begin_time
FROM sys.dm_tran_database_transactions db_trans
JOIN sys.dm_tran_session_transactions sessions ON db_trans.transaction_id = sessions.transaction_id
JOIN sys.dm_exec_connections conns ON conns.session_id = sessions.session_id
LEFT OUTER JOIN sys.dm_tran_active_transactions at ON db_trans.transaction_id = at.transaction_id
CROSS APPLY sys.dm_exec_sql_text(conns.most_recent_sql_handle)
AS statements
WHERE at.transaction_begin_time < DATEADD(Minute,-30,GETDATE())
CREATE TABLE #sp_who2
(
SPID INT ,
Status VARCHAR(1000) NULL ,
Login SYSNAME NULL ,
HostName SYSNAME NULL ,
BlkBy SYSNAME NULL ,
DBName SYSNAME NULL ,
Command VARCHAR(1000) NULL ,
CPUTime INT NULL ,
DiskIO INT NULL ,
LastBatch VARCHAR(1000) NULL ,
ProgramName VARCHAR(1000) NULL ,
SPID2 INT ,
RequestID INT NULL ,
rundate DATETIME DEFAULT ( GETDATE() )
)
INSERT INTO #sp_who2
( SPID ,
Status ,
Login ,
HostName ,
BlkBy ,
DBName ,
Command ,
CPUTime ,
DiskIO ,
LastBatch ,
ProgramName ,
SPID2 ,
RequestID
)
EXEC sp_who2
SELECT who.SPID ,
who.login ,
who.HostName ,
who.DBName ,
DATEDIFF(SECOND, LT.TranBeginTime, GETDATE()) AS elapsedseconds ,
who.ProgramName ,
'Transaction' AS notetype ,
LT.ttext
FROM #sp_who2 who
INNER JOIN @LT LT ON LT.spid = who.SPID
是否会返回任何结果?