2010-02-03 5 views
3

Я пытаюсь сжать свой файл журнала базы данных. Я попытался запустить:Файл базы данных базы данных SQL

USE databasename 
BACKUP log databasename 
WITH truncate_only 
DBCC shrinkfile (databasename_log, 1) 

Я получаю сообщение об ошибке:

Msg 155, Level 15, State 1, Line 3 'truncate_only' не является вариантом BACKUP признан .

Я что-то не хватает?

+0

Почему? Как правило, сокращение ваших файлов является ** плохой идеей. – RBarryYoung

+1

Извините, но я очень к этому не знаком. Почему это плохая идея? – user258133

+2

Это плохая практика, потому что это в первую очередь отрицает назначение журнала транзакций. Именно поэтому SQL Server 2008 удалил эту возможность. Как я уже говорил, если вы не хотите, чтобы журнал транзакций увеличивался, если у вас нет RPO, используйте модель простого восстановления. В противном случае вам нужен журнал транзакций, чтобы иметь возможность успешно восстанавливать последние транзакции из последней резервной копии базы данных. – Aaronaught

ответ

5

SQL Server 2008 больше не позволяет использовать параметры NO_LOG/TRUNCATE_ONLY.

Чтобы урезать журнал транзакций, вам необходимо либо выполнить резервное копирование (для реального), либо переключить модель восстановления базы данных на «Простой». Последнее, вероятно, то, что вы действительно хотите здесь. Вам не требуется полное восстановление, если вы не делаете регулярные резервные копии журналов транзакций, чтобы восстановить их до некоторой точки в середине дня.

+0

http://www.codeproject.com/Tips/625760/How-to-truncate-log-file-in-SQL-Server –

+0

Это ужасная, ужасная вещь. Если вы хотите использовать модель восстановления SIMPLE, тогда все в порядке, но не ложь, уничтожив журнал транзакций, а затем заявив, что у вас есть FULL. Человек, который написал эту статью, явно ничего не понимает в моделях восстановления SQL Server и был просто (как, например, OP), ища быстрое исправление для освобождения места. – Aaronaught

+0

Это не ужасно, если кто-то не хочет делать резервную копию и не беспокоиться о журналах и только хочет сэкономить место, тогда неплохо пойти с этим решением только для сокращения файла журнала. И я думаю, что ОП спросил то же самое. –

0

Я думаю, что лучший способ использовать скрипт так:

USE AdventureWorks 
GO 

-- Use some dynamic SQL just only not to re-write several times the name 
-- of your db, or to insert this snippet into a loop for all your databases... 
DECLARE @dbname varchar(50) = 'AdventureWorks'; 
DECLARE @logFileName varchar(50) = @dbname + '_log'; 
DECLARE @SQL nvarchar(max); 
SET @SQL = REPLACE('ALTER DATABASE {dbname} SET RECOVERY FULL;', '{dbname}', @dbname); 
EXECUTE(@SQL); 

DECLARE @path nvarchar(255) = N'F:\BCK_DB\logBCK' + CONVERT(CHAR(8), GETDATE(), 112) + '_' 
    + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','') + '.trn'; 

BACKUP LOG @dbname TO DISK = @path WITH INIT, COMPRESSION; 

DBCC SHRINKFILE(@logFileName); 

-- determine here the new file size and growth rate: 
SET @SQL = REPLACE('ALTER DATABASE {dbname} MODIFY FILE (NAME = ' + @logFileName + ', SIZE = 32000MB, FILEGROWTH = 10%);', 
    '{dbname}', @dbname); 
EXECUTE(@SQL); 
GO 

http://www.snip2code.com/Snippet/12913/How-to-correctly-Shrink-Log-File-for-SQL