正しい方向に向けていただければ幸いです。私はT-SQLを頻繁に使用するわけではありませんが、グーグル操作をして、以下のスクリプトを見つけました。スクリプトを少し修正しました。
スクリプトで次のことを行います。
スクリプト:
USE MASTER
declare
@isql varchar(2000),
@dbname varchar(64)
declare c1 cursor for select name from master..sysdatabases where name not in ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB')
open c1
fetch next from c1 into @dbname
While @@fetch_status <> -1
begin
select @isql = 'ALTER DATABASE @dbname SET RECOVERY SIMPLE'
select @isql = replace(@isql,'@dbname',@dbname)
print @isql
exec(@isql)
select @isql='USE @dbname checkpoint'
select @isql = replace(@isql,'@dbname',@dbname)
print @isql
exec(@isql)
select @isql='DBCC SHRINKFILE @dbname.ldf'
select @isql = replace(@isql,'@dbname',@dbname)
print @isql
exec(@isql)
fetch next from c1 into @dbname
end
close c1
deallocate c1
スクリプトを使用して、システムDB以外のすべてのデータベースのログファイルを圧縮します。
USE MASTER
GO
SET QUOTED_IDENTIFIER ON
GO
SET ARITHABORT ON
GO
DECLARE @DBName NVARCHAR(255),@LogicalFileName NVARCHAR(255),@DBRecoveryDesc Varchar(200)
DECLARE DatabaseList CURSOR
FOR
SELECT name,recovery_model_desc
FROM sys.databases
WHERE state_desc = 'ONLINE'
AND is_read_only = 0
and database_id>4
ORDER BY name
OPEN DatabaseList
FETCH NEXT FROM DatabaseList INTO @DBName,@DBRecoveryDesc
WHILE @@FETCH_STATUS = 0
BEGIN
SET @LogicalFileName=(SELECT top 1 name FROM sys.master_files AS mf WHERE DB_NAME(database_id)=@DBName and type_desc='LOG')
If @DBRecoveryDesc='Full'
Begin
Print('Use ['+@DBName+']
GO
ALTER DATABASE ['+@DBName+'] SET RECOVERY SIMPLE WITH NO_WAIT
GO
DBCC SHRINKFILE ('''+@LogicalFileName+''',10)
GO
ALTER DATABASE ['+@DBName+'] SET RECOVERY FULL WITH NO_WAIT
GO ')
Print '----------------------------------------------------------- '
END
If @DBRecoveryDesc='Simple'
Begin
Print('Use ['+@DBName+']
GO
DBCC SHRINKFILE ('''+@LogicalFileName+''',10)
GO
')
Print '----------------------------------------------------------- '
END
FETCH NEXT FROM DatabaseList INTO @DBName,@DBRecoveryDesc
END
CLOSE DatabaseList
DEALLOCATE DatabaseList
私はいつもカーソルに対する嫌悪感を抱いており、理解しやすいようにこれを書きました。これは、AA.SCの回答(ちなみにありがとう)に完全に基づいています。これが他の人の考えとうまくいっているなら、素晴らしい。ただし、後で完全復旧モードに戻しませんでした。
SELECT
'--', d.name dbName, d.recovery_model, d.recovery_model_desc , mf.name LogicalFileName,
'
use [' + d.name + ']
if(' + cast(d.recovery_model as varchar(5)) + ' = 1)
BEGIN
ALTER DATABASE ['+ d.name +'] SET RECOVERY SIMPLE WITH NO_WAIT
END
GO
DBCC SHRINKFILE (''' + mf.name +''',10)
GO
'
FROM sys.databases d
join sys.master_files mf
on d.database_id = mf.database_id
and mf.type_desc = 'LOG'
WHERE d.state_desc = 'ONLINE'
AND d.is_read_only = 0
and d.database_id > 4
--and d.recovery_model = 1
ORDER BY d.name