Shrink dei log MSSQL database

Eccomi tornato alla pubblicazione…

Oggi vi voglio omaggiare di un ottimo script “SELF MADE” utile per la troncatura (shrink o shrinking) dei file “.LDF” che vengono generati ed utilizzati dai database MSSQL.

Devo ringraziare un amico, Cristian B., che mi ha aiutato comprensione e nella fase di test per la parte SQL.

Sono necessari 2 script per l’operazione, il primo, batch, utile per poter programmare un’operazione pianificata che consenta di ciclare l’operazione senza presidiarla:

REM @Echo off

for /f "Tokens=1-4 Delims=/ " %%i in ('date /t') do set datetag=%%l%%j%%k
for /f "Tokens=1-2 Delims=: " %%i in ('time /t') do set timetag=%%i%%j
set dtt=%datetag%%timetag%
set day=%datetag%

REM Directory master per lo script
set MasterPath=C:\batch
set SQLFile=MsSqlTruncateLog

REM Directory dove è presente il binario SQLCMD.exe
set BinPath="C:\Program Files\Microsoft SQL Server\110\Tools\Binn"

REM %BinPath%\sqlcmd.exe -S SERVERNAME\INSTANCENAME -U USER -P PASSWORD_MSSQL_SERVER -i C:\batch\MsSqlTruncateLog.sql -o C:\batch\AAAAmmGG_MsSqlTruncateLog.txt
%BinPath%\sqlcmd.exe -S SERVERNAME\INSTANCENAME -U USER -P PASSWORD_MSSQL_SERVER -i %MasterPath%\%SQLFile%.sql -o %MasterPath%\%day%_%SQLFile%.txt

il secondo script, di seguito, è il file che, importato nel file batch con l’opzione “-i”,  imposta tutti i database rilevati, ad esclusione dei DB di sistema, in modalità di recupero minima (recovery model “Simple”), impostazione editabile direttamente dal Management Studio nelle proprietà del database, ed infine esegue il ridimensionamento del file LDF liberando così spazio disco potenzialmente utile ad altro.

declare @logname nvarchar(128)
declare @dbname nvarchar(128)
declare @dynamic_command nvarchar(1024)
set @dynamic_command = null
declare log_cursor cursor for
select db_name(mf.database_id),name
from sys.master_files mf
where mf.database_id not in (1,2,3,4) --avoid system databases
and mf.name not like 'ReportServer$%'
and right(mf.physical_name,4) = '.ldf' and mf.state_desc='online'
open log_cursor
fetch next from log_cursor into @dbname,@logname
while @@fetch_status = 0
begin

set @dynamic_command = 'ALTER DATABASE '+@dbname+' SET RECOVERY SIMPLE'
exec sp_executesql @dynamic_command

set @dynamic_command = 'USE '+@dbname+' DBCC SHRINKFILE(N'''+@logname+''',0,TRUNCATEONLY)'
exec sp_executesql @dynamic_command
fetch next from log_cursor into @dbname,@logname
set @dynamic_command = null
end
close log_cursor
deallocate log_cursor

Potete scaricare tutto il necessario da qui.

Dario Villa

Learn More →

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.