我正在设计一个程序,它通过网络收缩数据库日志文件。
日志文件并不总是采用相同的格式,因此我想通过路径名缩小它。在我写作的那一刻获取路径名称:
select top 2 physical_name as current_file_location FROM sys.master_files where physical_name like '%adventureworks%'
我缩小日志文件的脚本是:
ALTER DATABASE adventureworks2012 SET RECOVERY SIMPLE DBCC
SHRINKFILE ('c:\Program Files (x86)\Microsoft SQL Server\MSSQL10.50\MSSQL\DATA\adventureworks2012_log.ldf', 1)
ALTER DATABASE adventureworks2012 SET RECOVERY FULL
这将返回错误:
找不到文件'c:\ Program Files(x86)\ Microsoft SQL 用于数据库的Server \ MSSQL10.50 \ MSSQL \ DATA \ AdventureWorksLog.ldf' sys.database_files中的“AdventureWorks”。该文件要么没有 存在,或被丢弃。
有什么办法可以让它选择自己而不管日志文件命名约定?
答案 0 :(得分:0)
Declare @string Varchar(8000), @Strt Int ,@End Int
select name INto #tt from sys.databases where is_read_only=0 and state=0
and name NOT In ('master','model','tempdb','msdb')
Select ROW_NUMBER()Over(Order by Name)SRNO,name INto #TTT from #tt
Set @Strt=1
Select @End=Max(Srno)from #ttt
While @Strt<=@End
Begin
Declare @Db Varchar(255),@str varchar(Max)
Select @Db=Name from #ttT Where Srno=@Strt
Set @str=''
Select @str= 'ALTER DATABASE '''+Name+''' SET RECOVERY SIMPLE' from #tTt Where Srno=@Strt
--Exec (@str)
DBCC shrinkdatabase (@Db)
Print @Db
Set @Strt=@Strt+1
End
Drop Table #tt
Drop Table #ttT
答案 1 :(得分:0)
最佳解决方案是从原始选择列表中获取ID并使用它来缩小它。
select top 2 file_id, physical_name as current_file_location FROM sys.master_files where physical_name like '%adventureworks%'
然后在我的第二个脚本中:
DBCC SHRINKFILE (2,1)