Почему SQL Server так привязан к журналам транзакций

ОК, вот идет. Я не гуру баз данных или администратор. На самом деле, помимо некоторой периодической настройки индекса/запроса, я не слишком часто копаюсь в базах данных. Одна из вещей, которая часто ускользает от меня, — это журнал транзакций SQL Server. Я знаю, для чего он нужен, что он содержит и как работает (по крайней мере, концептуально), но я не понимаю, почему SQL Server так привязан к журналам транзакций.

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

Мой второй вопрос: почему так сложно избавиться от журнала переходов? Это только я, или действительно нет прямого способа сделать это? Совсем недавно я пытался избавиться от журнала размером более 100 МБ в базе данных размером 5 МБ, и самым простым способом, который я нашел, было отсоединить базу данных, удалить журнал и снова подключить его (и даже этот SQL Serve немного пожаловался). Я попробовал команду сжатия со всеми возможными вариантами, которые смог найти, но смог уменьшить только примерно до 50%. База данных не использовалась (нет активных подключений), и меня, честно говоря, вообще не волновали какие-либо прошлые переходы. Я заметил, что, возможно, есть и другие «способы», как это сделать; некоторые из них включают резервное копирование и восстановление.

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

Редактировать: После первых ответов я понял, что, возможно, был недостаточно ясен. Я знаю, как работает журнал транзакций во время транзакций, почему он важен и что его можно использовать для резервного копирования. Я думаю, что хотел спросить больше с точки зрения разработчика. Большую часть времени я имею дело с промежуточными/тестовыми временными базами данных, которые не нуждаются в каком-либо резервном копировании и которые никто не использует, кроме меня, и я часто обнаруживаю, что мне нужно их перенести, а наличие огромного журнала переходов является ненужным неудобством в этой ситуации. .


person Jan Zich    schedule 12.10.2009    source источник


Ответы (5)


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

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

Другой способ — изменить модель восстановления на ПРОСТАЯ, что позволит сервер для автоматического повторного использования файла журнала по своему усмотрению. Изменение модели восстановления на SIMPLE влияет на возможность восстановления базы данных, поскольку вы не сможете применять определенные сценарии аварийного восстановления, такие как восстановление на определенный момент времени, и вы не сможете восстановить какие-либо изменения данных с момента последнего резервного копирования.

Общие сведения о ведении журнала и восстановлении в SQL Server
Неправильные представления о журнал и резервные копии журналов: как убедиться в этом
Подсистема хранения: дополнительные сведения о циклическом характере журнала

person Remus Rusanu    schedule 12.10.2009
comment
Спасибо за очень подробный ответ. Просто для подтверждения: правда ли, что если я ничего не сделаю с журналом транзакций и оставлю все параметры по умолчанию, он будет расти вечно и в конечном итоге будет содержать полную историю всех изменений в базе данных (в той или иной форме)? - person Jan Zich; 13.10.2009
comment
Нет, неправда. Новая база данных будет иметь режим восстановления SIMPLE и перезапустит журнал. База данных, которая изменила модель восстановления, но никогда не создавала резервную копию, по-прежнему будет находиться в «псевдо-простом» режиме и по-прежнему не будет увеличивать журнал. Только после изменения модели восстановления и создания резервной копии журнал начнет расти. - person Remus Rusanu; 13.10.2009
comment
Не могли бы вы подробнее рассказать о псевдопростом режиме или дать мне несколько ссылок? Я думал, что где-то видел что-то об этом, но больше не могу найти. - person Jan Zich; 13.10.2009
comment
Как возможно, что журнал размером более 100 МБ не может быть уменьшен более чем на 50% в простом режиме? Рассматриваемая база данных долгое время использовалась кем-то еще, кроме меня, и я использовал ее в основном или только для чтения. - person Jan Zich; 13.10.2009
comment
Псевдопростой: sqlskills.com/BLOGS/PAUL/post/ - person Remus Rusanu; 13.10.2009
comment
Если вы считаете, что ваш журнал не используется повторно, проверьте столбец log_reuse_wait_desc в базе данных sys.databases technet.microsoft.com/en-us/library/ms178534.aspx - person Remus Rusanu; 13.10.2009

Журналы транзакций существуют по двум основным причинам.

1 — разрешить БД «откатить» текущую транзакцию 2 — разрешить аварийной БД восстановить свое состояние до последней зафиксированной транзакции перед сбоем

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

Идея состоит в том, что вы время от времени делаете резервную копию журнала транзакций в файл дампа. Файл дампа — это полный моментальный снимок состояния БД, из которого можно восстановить ВСЮ БД в определенный момент времени. Когда вы делаете это, журнал транзакций усекается и начинается снова с пустого места.

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

Таким образом, делая регулярные дампы БД, ваш журнал транзакций неоднократно очищается.

Есть еще один вариант, который я бы не рекомендовал, — отключить журналы транзакций в вашей БД. Это в основном устраняет 2 выше, поэтому журнал транзакций не растет со временем. Конечно, если ваша БД выйдет из строя, вы сможете восстановиться только из последней полной резервной копии/дампа, поэтому этот вариант сопряжен со значительным риском, если вы запускаете что-то даже полуважное.

ХТН.

person Mike Q    schedule 12.10.2009

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

Неограниченный рост — это просто значение по умолчанию, и не рекомендуется позволять журналу произвольно увеличиваться, так как это приводит к фрагментации журнала из-за увеличения количества vlf, виртуальных файлов журнала в фактическом файле журнала. Когда их становится слишком много, производительность некоторых операций, таких как репликация, снижается.

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

Отсоединение базы данных и ее повторное присоединение после уничтожения журнала - довольно плохая вещь для вашей базы данных, она не может быть в согласованном с транзакциями состоянии, и вы действительно хотите запустить dbcc checkdb после этого. Да, у вас не было активных подключений, но это рискованно и в значительной степени является последним средством, когда у вас есть повреждение журнала, а не первое в списке.

Плохо считается, что в 2005 году есть даже флаг, который нельзя изменить, который указывает на то, что вы это сделали. Служба поддержки MS может проверить, нуждались ли вы в их помощи с потенциальной ошибкой в ​​SQL.

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

Тема очень большая и, как вы видели, сложная, но ее стоит изучить.

person Andrew    schedule 12.10.2009

(Это MS-SQL, верно?)

Да, держу пари, сервер жаловался, когда вы отключили и удалили журнал вручную.

Если вы не хотите вести T-журнал, измените режим восстановления каталога на «Простой» (в свойствах каталога), это приведет к усечению журнала после успешного завершения транзакций.

Если вам ДЕЙСТВИТЕЛЬНО нужен журнал (большинству людей это очень удобно!), журнал будет усечен при резервном копировании.

(Журналы транзакций, FTW!)

person Community    schedule 12.10.2009

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

Я давно не работал с SQL Server, поэтому не могу ответить, почему так сложно избавиться от журнала транзакций. В SQL Server 7, SQL Server 2000 дней, при создании полной резервной копии базы данных журнал транзакций по умолчанию будет усечен.

person dthrasher    schedule 12.10.2009