2010-03-31 2 views
1

Я всегда думал, что журнал транзакций SQL отслеживает все транзакции, выполненные в базе данных, поэтому может помочь восстановить файл базы данных в случае неожиданного отключения питания или что-то в этом роде Итак, при нормальном использовании, когда данные фиксируются и записываются на диск, они очищаются, потому что все данные являются хорошими и безопасными в файле mdf. Увидев, что файл ldf растет и читает некоторые, я понимаю, что это не так, и он будет продолжать расти, пока: вы не сжимаете журнал. Только в этот момент все транзакции транзакции очищаются и файл журнала сжимается. Я нашел некоторых sp, кто должен это делать, но также нашел теорию, что вам сначала нужно сделать резервную копию базы данных? Этот последний шаг для меня не имеет смысла, поэтому кто-нибудь может сказать мне, что это правильно, и если да, то почему?Как насчет журнала транзакций Sql

+0

Итак, вкратце, что я узнал здесь: если вы хотите восстановить только последнюю резервную копию: выберите простое восстановление. Если вы хотите иметь возможность делать резервную копию в определенный момент времени, вам нужно иметь журнал транзакций. Когда вы создадите резервную копию, журнал будет очищен, но файл не будет сокращаться, потому что ему нужно место для следующих транзакций. Если вы подождете слишком долго, чтобы сделать резервную копию, и вы позволяете ей расти автоматически, она будет расти и расти: она ДОЛЖНА, потому что иначе вы пропустите данные. Вам нужно будет создать резервную копию журнала транзакций, опорожнить его и сжать его, а затем вернуться к нему чаще, чтобы он снова не увеличивался. – Michel

+0

Спасибо всем за вход, все были полезны.Ответ Лусеро с входом по его ссылке и ответом Шеранда были одинаково полезны, и ответ Шеранда был отмечен зеленым «V» для набора текста. Надежда Лусеро может жить с этим ..... – Michel

ответ

5

Представьте, что вы (или кто-то) запускаете delete from very_important_table в вашей производственной базе данных. Сервер Sql успешно удаляет, совершает транзакцию и, как вы предлагаете, «забыл» о транзакции.

Позже кто-то заметит, что данные ушли (после всего этого был ваш very_important_table). Вы были бы благодарны в этой ситуации. Sql Server сделал не забыл о транзакции, чтобы вы могли восстановить свою базу данных до момента, непосредственно перед (непреднамеренным) удалением! Как минимум (как упоминалось), если вы используете модель «Полное восстановление».

Это, среди прочего, журнал транзакций хранит всю эту информацию.

Теперь, когда было бы «безопасно» выбить лог? После того, как вы сделали резервную копию - ха-ха! Sql Server предполагает, что вы сохраняете резервную копию в надежном месте, и это означает, что больше не нужно висеть в журнале. Вот почему вы должны сделать резервную копию, прежде чем сможете сжать свой журнал транзакций.

Но Я считаю, что сокращение журнала транзакций должно быть чем-то для чрезвычайных ситуаций. При нормальной работе вы должны «знать» (или догадываться), насколько большой журнал транзакций будет получен через определенное количество времени (прочитайте: в промежутках между резервными копиями журналов!) И назначьте ему столько места (плюс некоторый запас может быть хорошим идея). Затем вы отключите автоматическое увеличение (или измените его как минимум) и установите предупреждение, когда транзакция станет «слишком большой» (скажем, 80% того, что вы задали как размер, если вы дали ему 50% или 100% запаса). Тогда у вас есть время отреагировать, если что-то пойдет не так.

Помните (как писали другие): резервная копия (журнал) не «сжимает» файл журнала, а просто «пуст». Вы по-прежнему будете видеть одинаковый размер файла в файловой системе, но в нем есть свободное место (DBCC SQLPERF(logspace) покажет вам это).

Если у вас включен автоматический рост, журнал просто заполнит ваш диск, если вы не знаете, и когда диск будет заполнен - ​​bam - ничего не вы можете сделать (в худшем случае даже не резервное копирование или сжатие журнала!).

То, что я пытаюсь сказать, следующее: это непростая тема. Помните!

Может быть, эта статья Microsoft обеспечит отправную точку: How to Stop the transaction log of a SQL Server database from growing unexpectedly

Edit: бы этот вопрос лучше всего подходит для serverfault?

+0

Спасибо, с ответами до этого и все это становится ясно. – Michel

2

Это зависит от модели восстановления резервной копии.

Возможно, все, что вам нужно или нужно знать, можно найти в this KB article.

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

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

+0

Ах! Спасибо за это объяснение. Никогда не включал модель восстановления резервных копий в мои мысли. Я всегда думал, что это было только для сбоев дисков, когда файл (ы) базы данных находился бы в состоянии, которое вам нужно было выполнить/отменить последние несколько транзакций. Но на самом деле это зависит от вашей стратегии резервного копирования (и восстановления) о том, сколько данных транзакции должно быть доступно. – Michel

+0

Теперь я не нуждаюсь в резервном копировании журнала транзакций: при его резервном копировании вы все равно можете использовать его для восстановления момента времени, и фактический журнал может быть опустошен. – Michel

2

Чтобы восстановить базу данных, в основном сделать следующее:

  • восстановления последнего полного резервного копирования
  • восстановить инкрементные резервные копии, так как последнего полного резервного копирования
  • восстановить все транзакции, записанные с момента дополнительных полного резервного копирования было получено

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

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

+0

Теперь становится все яснее и понятнее. Мои мысли о целях журнала транзакций были неправильными, он фактически является частью резервного копирования данных вместе с создаваемыми резервными копиями. – Michel

1

у вас есть состояние базы данных x, то вы добавляете транзакции y, тогда вы сокращаете транзакцию в 2 раза, поэтому у вас будет только состояние базы данных x + (y/2). если у вас нет резервной копии, у вас нет способа учесть эту недостающую половину y. другими словами, всегда делайте резервную копию. единственным реальным исключением является дублирование базы данных при вводе записей, и вы можете приостановить такой процесс дублирования при сокращении журнала транзакций.

+0

Вы ** не можете ** сжимать файл журнала, пока все, что он содержит, являются «активными» транзакциями (SQL Server не позволит вам это сделать); то есть x + (y/2) не может случиться. У вас ** есть ** для резервного копирования, прежде чем вы ** можете ** уменьшить. – scherand

1

FYI: Когда вы сокращаете журнал транзакций, освобождается место для новых транзакций, оно не освобождает место в файловой системе.

Кроме того, как упоминает другое сообщение, когда я набираю это, модель восстановления играет большую роль, поскольку SQL Server усекает журнал транзакций на каждой контрольной точке.

+0

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

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