简体   繁体   English

我可以通过文件路径/使用自身来收缩SQL数据库日志文件吗?

[英]Can I shrink a SQL database log file via file path / by using it's self?

I am designing a program which shrinks database log files across a network. 我正在设计一个程序,该程序可以通过网络缩小数据库日志文件。

The log file will not always be in the same format so I want to shrink it via the path name. 日志文件不会总是采用相同的格式,因此我想通过路径名将其缩小。 To get the path names at the moment I am writing: 为了在我写此刻获得路径名:

select top 2 physical_name as current_file_location FROM sys.master_files where physical_name like '%adventureworks%'

My script to shrink the log files are: 我缩小日志文件的脚本是:

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

This returns the error: 这将返回错误:

Could not locate file 'c:\\Program Files (x86)\\Microsoft SQL Server\\MSSQL10.50\\MSSQL\\DATA\\AdventureWorksLog.ldf' for database 'AdventureWorks' in sys.database_files. 在sys.database_files中找不到数据库'AdventureWorks'的文件'c:\\ Program Files(x86)\\ Microsoft SQL Server \\ MSSQL10.50 \\ MSSQL \\ DATA \\ AdventureWorksLog.ldf'。 The file either does not exist, or was dropped. 该文件不存在或已被删除。

Is there a way I can make it select its self regardless of log file naming convention? 有什么方法可以使它选择其自身,而不考虑日志文件的命名约定?

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

The best solution was to grab the ID from the original select list and use that to shrink it by. 最好的解决方案是从原始选择列表中获取ID,然后使用该ID进行缩小。

select top 2 file_id, physical_name as current_file_location FROM sys.master_files where physical_name like '%adventureworks%'

then in my second script: 然后在我的第二个脚本中:

DBCC SHRINKFILE (2,1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM