Назад | Перейти на главную страницу

Как определить, используется ли на сервере ldf-файл журнала SQL Server?

У меня есть ldf-файл SQL Server, который имеет очень большой размер 190 гигабайт. Я почти уверен, что это всего лишь остаток старой базы данных контента SharePoint, которой больше нет на этом сервере базы данных, но я хотел бы быть абсолютно уверенным, прежде чем приступить к работе с ней. На моем сервере несколько десятков баз данных. Как мне проще всего проверить, используется ли этот файл ldf каким-либо образом на этом сервере? Могу ли я использовать SSMS и вручную проверять каждую базу данных?

Что ж, не рекомендуемый способ - это попытаться переименовать файл .ldf в файловой системе. Если файл журнала действительно используется для обслуживания действующей в настоящее время базы данных SQL Server, вы не сможете переименовать файл.

Рекомендуемый метод - проверить представление каталога sys.database_files, чтобы идентифицировать / найти соответствующий файл журнала.

Что-то вроде следующих должно сделать это ...

Select 
    file_id,
    name,
    state
From sys.database_files
Where Type = 1 and name=’logFileName’

Подробную информацию о представлении каталога sys.database_files см. В следующих онлайн-справочниках:

http://msdn.microsoft.com/en-us/library/ms174397.aspx

Вот быстрый и грязный сценарий, который будет перебирать все ваши базы данных и искать ваш файл. Просто замените значение @FileToFind именем рассматриваемого файла. Если вы не получаете результатов в окончательном наборе результатов, значит, этот сервер не использует ваш файл. Если вы получите результат, то это база данных, которая использует файл.

DECLARE @CurrentDB sysname
DECLARE @SQL NVARCHAR(1000)
DECLARE @FileToFind NVARCHAR(260)

SET @FileToFind='master.mdf'

CREATE TABLE #TmpDBTable (
    DBName sysname,
    FileName NVARCHAR(260)
)

DECLARE ALLDBS CURSOR FOR
SELECT NAME FROM sys.databases
OPEN ALLDBS
FETCH NEXT FROM ALLDBS INTO @CurrentDB 
WHILE @@FETCH_STATUS=0
BEGIN
    SET @SQL='use ' + @CurrentDB + ';insert #TmpDBTable select '''+@CurrentDB+''',physical_name from sys.database_files where physical_name like ''%'+@FileToFind+'%'''
    EXEC sp_executesql @SQL
    FETCH NEXT FROM ALLDBS INTO @CurrentDB 
END
CLOSE ALLDBS
DEALLOCATE ALLDBS

SELECT * FROM #TmpDBTable

DROP TABLE #TmpDBTable

Если вы считаете, что это неактивная база данных, должна ли метка времени (этот проводник ставит ее) в указанном файле журнала быть устаревшей? Или это совершенно неверная информация? Я случайный dba, уф