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.