Неожиданное поведение sp_MSForEachDB - PullRequest
3 голосов
/ 06 апреля 2011

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

sp_MSForEachDb 'IF LOWER(rtrim(''?'')) NOT IN ('''', ''master'', ''tempdb'', ''tempdev'', ''model'', ''msdb'')
                BEGIN
                    declare @LogFile nvarchar(max)
                    USE [?]
                    SELECT @LogFile = sys.sysaltfiles.name FROM sys.sysdatabases
                    INNER JOIN sys.sysaltfiles ON sys.sysdatabases.dbid = sys.sysaltfiles.dbid
                    WHERE (sys.sysaltfiles.fileid = 1) AND (sys.sysdatabases.name = ''?'')
                    print ''DB: [?], Log: '' + @LogFile
                    CHECKPOINT
                    DBCC SHRINKFILE (@LogFile, 1)
                END'

Оказывается, что только иногда это успешно усекает журнал базы данных. В базах данных происходит сбой (без сообщения об ошибке, просто оставляет мне необработанный файл журнала), он последовательно / воспроизводимо не работает.

Однако в операторе print он печатает ТОЧНО, что я ожидаю, что он напечатает. Однако, если я вручную наберу функциональную часть этого скрипта для каждой базы данных:

USE [Seed]
CHECKPOINT
DBCC SHRINKFILE('Seedlog', 1)

это работает 100% времени.

Почему моя sp_MSForEachDB «петля» не работает должным образом? Чего мне не хватает?

1 Ответ

2 голосов
/ 06 апреля 2011

Похоже, ваш запрос возвращает логическое имя для файла данных, а не файл журнала?(FILEID = 1) * * тысяча один

...