2009-09-16 10 views
19

Я пытаюсь написать процедуру T-SQL, которая сокращает файл журнала транзакций, используя DBCC SHRINKFILE на основе логического имени базы данных. Функция DB_NAME() дает логическое имя базы данных. Есть ли эквивалентный для журнала транзакций? Если нет, есть ли другой способ получить эту информацию? Имя по умолчанию для журналов транзакций - <<Database Name>>_log, но я предпочел бы не полагаться на это.Как получить логическое имя журнала транзакций в SQL Server 2005

ответ

35

Вы можете использовать:

SELECT name 
FROM sys.master_files 
WHERE database_id = db_id() 
    AND type = 1 

Файлы журналов имеют тип = 1 для любого database_id и все файлы для всех баз данных можно найти в sys.master_files.

EDIT:

Я должен отметить, что вы не должны быть усадка вашего журнала на регулярной основе. Ваш журнал транзакций должен иметь соответствующий размер, чтобы он никогда не увеличивался, а затем оставался на таком уровне. Журнал транзакций не может быть мгновенным инициализированным файлом и должен быть нулевым, если в него добавлено пространство, что является медленной последовательной операцией, которая снижает производительность.

+2

пс. Обратите внимание, что разные базы данных в одном экземпляре могут использовать одно и то же имя журнала. В результате помимо добавления 'DBCC SHRINKFILE (« логическое имя журнала », размер) вы должны сначала поместить' use [MyDatabase] ', чтобы убедиться, что работаете в правой БД. – JohnLBevan

12

Предполагая, что стандартная база данных (например, только один файл журнала), файл журнала всегда является file_id = 2. Это применимо, даже если у вас есть несколько файлов данных (id = 3+ для NDF).

DBCC также принимает идентификатор файла. Таким образом, DBCC SHRINKFILE (2...) всегда будет работать. Вы не можете параметризовать внутри DBCC, чтобы избежать динамического SQL. Если вы хотите получить имя, используйте FILE_NAME (2).

3
select Name 
from sys.database_files 

Формирует,

SomeDb_Data 
SomeDb_Log 

SqlServer 2012

Смежные вопросы