我可以通过文件路径缩小SQL数据库日志文件/使用它自己吗?

时间:2016-11-16 10:45:15

标签: sql-server

我正在设计一个程序,它通过网络收缩数据库日志文件。

日志文件并不总是采用相同的格式,因此我想通过路径名缩小它。在我写作的那一刻获取路径名称:

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”。该文件要么没有   存在,或被丢弃。

有什么办法可以让它选择自己而不管日志文件命名约定?

2 个答案:

答案 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)