Arv*_*ddk 8 sql-server shrink sql-server-2012 transaction-log recovery-model
我希望你能指出我正确的方向。我不是 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
Run Code Online (Sandbox Code Playgroud)
AA.*_*.SC 13
使用脚本来收缩除系统 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
Run Code Online (Sandbox Code Playgroud)
小智 5
我一直对游标很反感,所以我写了这个,因为我可以更好地理解它。它完全基于 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20763 次 |
| 最近记录: |