Как сжать файл журнала SQL Server с включенным зеркалированием? - PullRequest
5 голосов
/ 30 октября 2008

У меня есть несколько баз данных для моих приложений, которые используют зеркальное отображение SQL Server 2005, чтобы хранить точную копию данных в другом месте. Работает как очарование, однако, файл журнала, кажется, только растет и растет, один на 15 ГБ для базы данных 3 ГБ.

Обычно я могу просто уменьшить его - однако появляется ошибка, что это не может быть сделано специально. Но, кажется, в конечном итоге, если не отмечено, просто расширится, чтобы использовать все пространство на диске.

Я вижу, что могу установить максимальный размер файла журнала, это ответ здесь? Будет ли журнал просто катиться, когда достигнет максимума, или БД просто перестанет функционировать?

Спасибо

Ответы [ 10 ]

3 голосов
/ 09 ноября 2009

Мы столкнулись с той же проблемой после перехода от доставки журналов к зеркалированию. Необходимо создать задание, которое регулярно создает резервные копии журнала транзакций (каждые 15 или 30 минут или около того), чтобы размер журнала не выходил из-под контроля.

Если это уже вышло из-под контроля, запустите BACKUP LOG TO DISK = 'Nul', затем выполните команду DBCC SHRINKFILE. Тогда вы можете настроить свою работу.

Обратите внимание, что 'Nul' - это не орфографическая ошибка, это старый трюк DOS, который ведет себя так, как будто вы пишете файл, но на самом деле просто выгружает информацию в эфир, чтобы она не занимала место на машина.

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

РЕДАКТИРОВАТЬ: Дэвид правильно указал, что это действие разорвет цепочку журналов и уменьшит возможность восстановления после сбоя. Обязательно используйте команду резервного копирования в команду 'nul' в качестве последнего средства. Если у вас есть место на диске, вы должны сделать надлежащее резервное копирование журнала и настроить план резервного копирования журнала. Убедитесь, что вы также включили регулярные полные резервные копии и задачу очистки для удаления старых файлов.

2 голосов
/ 05 ноября 2008

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

Когда открывается основная база данных, она активна с пользовательскими подключениями и обработкой транзакций. Однако записи журнала не отправляются в зеркальную базу данных, и в случае сбоя принципала в зеркале не будет никаких транзакций от принципала с момента, когда принципал перешел в открытое состояние. Кроме того, журнал транзакций принципала не может быть усечен, поэтому файл журнала будет расти бесконечно. ref http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx

1 голос
/ 03 августа 2012

У меня была такая же проблема на зеркальных базах размер файла журнала вырос до 40 ГБ, где основной файл базы данных был около 700 МБ Я нашел это решение в Microsoft, оно работает, но только уменьшило мою базу данных примерно на 4%

1 - просто выполните это, чтобы создать хранимую процедуру

   use master
   go
   if object_id ('sp_shrink_mirrored_database', 'P') is not null 
     drop proc sp_shrink_mirrored_database 
   go
   create procedure sp_shrink_mirrored_database @dbname sysname, @target_percent int = null
   as
   begin
     declare @filename sysname
     declare @filesize int
     declare @sql nvarchar(4000)

     if @target_percent is null
       dbcc shrinkdatabase (@dbname)
     else 
       dbcc shrinkdatabase (@dbname, @target_percent)
     declare c cursor for 
     select [name], [size] from sys.master_files where type=0 and database_id = db_id (@dbname)
     open c
     fetch next from c into @filename, @filesize
     while @@fetch_status=0
     begin
       set @filesize=(@filesize+1)*8
       set @sql='alter database [' + @dbname + '] modify file ( name=' 
         + @filename + ', size=' + cast(@filesize as nvarchar) + 'kb )'
       execute sp_executesql @sql
       fetch next from c into @filename, @filesize
     end
     close c
     deallocate c
   end
   go

2 - выполнить хранимую процедуру следующим образом в новом окне запроса Например, если вы хотите уменьшить базу данных mydb, выполните следующую инструкцию.

  EXEC sp_shrink_mirrored_database 'mydb'
1 голос
/ 18 декабря 2009

http://support.microsoft.com/kb/937531

Операция сжатия не дублируется в зеркальной базе данных при использовании зеркального отображения базы данных в SQL Server 2005

ПРИЧИНА
Зеркальное отображение базы данных изменит физические размеры файлов только после контрольной точки.

1010 * Отправить отзыв * Метод 1
Чтобы обойти эту проблему, выполните следующие операторы, чтобы создать новую хранимую процедуру в базе данных master. Затем используйте эту хранимую процедуру для сжатия основной базы данных вместо выполнения инструкции DBCC SHRINKDATABASE или инструкции DBCC SHRINKFILE.
[хранимая процедура слишком длинна для публикации здесь]

Метод 2
Создайте ручную контрольную точку после сжатия файлов на основном сервере.

1 голос
/ 31 октября 2008

Некоторые хорошие идеи можно найти здесь: http://yukonspace ... транзакция-лог-рост .

Исходя из моего опыта работы с базами данных в режиме полного восстановления (должен вести себя примерно так же), вам необходимо, по крайней мере, регулярно создавать полные резервные копии, в противном случае журналы только растут.

0 голосов
/ 04 ноября 2013

Обязательно выполните полное резервное копирование после выполнения резервного копирования журнала с помощью TRUNCATE_ONLY Это нарушает цепочку резервного копирования журнала.

0 голосов
/ 31 января 2013

Просто вы можете сжать файл журнала, используя следующую команду

USE DBNAME
GO
DBCC SHRINKFILE(DBNAME_log, 1)
BACKUP LOG DBNAME WITH TRUNCATE_ONLY
DBCC SHRINKFILE(DBNAME_log, 1)
GO
0 голосов
/ 21 июня 2011
  1. Вы должны регулярно делать резервную копию журнала в противном случае ваш файл журнала будет расти на неопределенный срок. Если вы не можете написать журнал (т.е. не хватает места на диске или нажмите на максимальный размер) БД потерпит неудачу
  2. SQL Server 2005 имеет проблему, когда сокращение не отражается на зеркальная сторона. Решение здесь http://support.microsoft.com/kb/937531

Эта статья содержит полезную информацию о Как работают файлы журнала , вам также следует прочитать Факторы, которые могут задержать усечение журнала

0 голосов
/ 14 марта 2011

Чтобы сжать файл транзакции, резервное копирование должно быть выполнено при наличии активных файлов виртуального журнала: http://www.xoowiki.com/Article/SQL-Server/tronquer-journal-de-log-sur-base-en-miroir-499.aspx

0 голосов
/ 09 ноября 2008

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

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