SQL Server несколько операций сжатия - PullRequest
3 голосов
/ 13 сентября 2011

Я пытаюсь сжать все базы данных (файлы и журналы) в SQL Server 2008 R2.

Я закончил сценарий, но проблема в том, что когда я зацикливаюсь на всех базах данных и выполняю запрос для выполнения shrink file, первые 3 или 4 сжатия работают, но у них появляется эта ошибка:

Сообщение 0, Уровень 11, Состояние 0, Строка 0
Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, следует выбросить.

Сценарий:

declare @db_name as varchar(30)
declare @db_recorvery_model as varchar(30)
declare @db_files_name as varchar(250)
declare @db_files_physical_name as varchar(250)

declare get_files cursor for 
     select b.name, a.name  
     from sys.master_files as a, 
          sys.databases as b 
     where a.database_id = b.database_id  
     order by b.name  

open get_files

fetch next from get_files into @db_files_name, @db_files_physical_name

set @db_files_name = (select @db_files_name)
set @db_files_physical_name = (select @db_files_physical_name)

DECLARE @Command as nvarchar(max)
set @Command=''

while(@@FETCH_STATUS=0)
BEGIN
   if (@db_files_name='master' or @db_files_name='msdb' or @db_files_name='tempdb' or @db_files_name='model')
   BEGIN
      print 'Bases de dados do sql server: '+@db_files_name
   END
   ELSE
   BEGIN
      set @Command = 'USE ' + '[' + @db_files_name + '] DBCC SHRINKFILE ("'+@db_files_physical_name+'", 1 )'
      EXEC sp_executesql @Command
      print @Command
   END

   fetch next from get_files into @db_files_name, @db_files_physical_name

   set @db_files_name = (select @db_files_name)
   set @db_files_physical_name = (select @db_files_physical_name)
END

close get_files
deallocate get_files

У кого-нибудь есть идеи?

PS: я знаю, что не должен сжиматься, но это очень особенная и непродуктивная среда.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Можете ли вы определить, какая база данных помечает ошибку? Можете ли вы попробовать запустить свой скрипт в единственной базе данных, в которой возникла проблема, и посмотреть, является ли она последовательно той же самой базой данных, которая вызывает ошибку? Возможно, это специальная база данных, которую вы пропустили, которую нельзя таким образом сократить.

У меня есть похожая среда, содержащая временные базы данных, которые не предназначены для длительного хранения, и я использую следующий скрипт, который отлично работал для сотен баз данных:

CREATE procedure [dbo].[ShrinkLog]
    @DB varchar(200)
as

declare @LogFile varchar(200)
declare @Sql varchar(500)

SELECT @LogFile = name
FROM sys.master_files
where type_desc = 'LOG'
and db_name(database_id) = @DB


set @Sql = '
    Use [' + @DB + ']
    DBCC SHRINKFILE([' + @LogFile + '], 1)
'
print(@sql)
exec(@sql)

Имейте также в виду, что вы не хотите запускать эту команду, если на вашем сервере также не достаточно места на жестком диске / в памяти.

С уважением,

0 голосов
/ 11 декабря 2012

Если вы хотите уменьшить журнал, это будет лучший код.Я пользуюсь им некоторое время, и он никогда не падает мне.

declare @SQL nvarchar(max)

select @SQL = coalesce(@SQL + char(13) + char(10),'') + N'
Use ' + QUOTENAME(d.[name]) + ';' + CHAR(13) + '
ALTER DATABASE ' + QUOTENAME(d.[name]) + ' SET RECOVERY SIMPLE;
DBCC SHRINKFILE (' + quotename(mf.[name],'''') + ', 1);
ALTER DATABASE ' + QUOTENAME(d.[name]) + ' SET RECOVERY FULL;'
FROM sys.databases d
INNER JOIN sys.master_files mf ON [d].[database_id] = [mf].[database_id]
WHERE
    d.[database_id] > 4 --no sys dbs
    AND d.recovery_model = 1
    AND d.is_read_only = 0
    AND mf.[type] = 1 --log files
ORDER BY d.name

--print @SQL

execute (@SQL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...