Как предотвратить заполнение журнала транзакций во время реорганизации индекса?

19

У нас есть несколько машин, на которых мы предварительно выделили размер журнала транзакций в 50 ГБ. Размер таблицы, которую я пытаюсь реорганизовать, составляет 55 - 60 ГБ, но будет постоянно увеличиваться. Основная причина, по которой я хочу реорганизоваться, заключается в том, чтобы освободить место и получить какую-либо выгоду от производительности, потому что это дополнительный бонус.

Уровень фрагментации таблицы составляет 30 - 35%. На некоторых из этих машин я получаю сообщение об ошибке «Журнал транзакций заполнен» и реорганизация завершается неудачно. Размер журнала транзакций достигает 48 ГБ. Какой хороший способ противостоять этому? У нас не включено автоматическое увеличение, и я не хочу этого делать.

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

Пол Уайт говорит, что GoFundMonica
источник

Ответы:

7

Лучшая практика заключается в том, чтобы REORGANIZEфрагментация была ниже 30% и REBUILDвыше. Просто REBUILDделает чистую копию, REORGANIZEделает это на месте.

Проверьте, что вы на самом деле делаете: у вас нет плана обслуживания, выполняющего оба варианта, не так ли?

На больших таблицах (таблица размером 50 ГБ) я видел REORGANIZEиспользование всего пространства журнала транзакций, если вы следуете этому правилу. Не часто: только одна система с определенной схемой загрузки. REORGANIZEТолько просуществовали до журнала расширяется и потребляется все дисковое пространство.

REBUILDВместо этого мы переключились без проблем, но проигнорировали фрагментацию ниже 25%. Это сработало для нас лучше: вам нужно посмотреть, работает ли это для вас.

REBUILDможет влиять на производительность больше, чем REORGANIZEна производстве, но иногда это можно уменьшить с помощью ONLINEпараметра (требуется Enterprise Edition).

ГБН
источник
Очень полезны цифры, основанные на принципах большого пальца, и качественные и количественные оценки.
Робино
6

REORGANIZE (как в ALTER INDEX ... REORGANIZE) - это очень быстрая операция (ну, в основном ...), которая требует небольшого количества журнала, может быть прервана в любой момент и возобновлена ​​позже, и работает внутри в небольших пакетных транзакциях :

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

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

Мне кажется, что вы делаете перестройку, что является действительно исключительной операцией, которую вы не должны делать, если у вас нет очень хорошо продуманной причины. Какого рода космическое освоение вы прыгаете? Все, чтоDBCC CLEANTABLE не справится? Вы проверили физическую структуру таблицы, не сместилась ли она от логической структуры (подробности см. В столбцах таблицы SQL Server под капотом )?

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

Если таблица секционирована, то вы можете перестроить в автономном режиме (и реорганизовать) по одному разделу за раз. Перестроение в режиме онлайн можно выполнить только на уровне всей таблицы.

Ремус Русану
источник
2
я делаю реорганизацию. модель восстановления заполнена, и я вижу большой размер журнала транзакций. причина неудачи - одна из двух 1. зеркальное отображение. Журнал должен быть передан вторичному, прежде чем пространство может быть освобождено 2. резервные копии журнала. Несмотря на то, что мы делаем резервные копии каждые 15 минут, по этой причине иногда происходит сбой.
Та же ситуация здесь, 2008R2, индекс реорганизуется (не перестраивается), и даже в простом режиме (!) Размер журнала увеличивается до размера, превышающего размер самой большой таблицы, которая составляет> 40 ГБ. В режиме полного восстановления выполнение 5-минутного резервного копирования журнала также не помогает, во время переоценки индекса создается только один огромный файл резервной копии TRN. Кажется, это не имеет смысла, но это одинаковое поведение на двух разных серверах. Любая идея, как на самом деле разделить это на небольшие пакетные транзакции, как задокументировано?
realMarkusSchmidt
5

У меня была эта проблема раньше.

  • У вас большая база данных и небольшой лог-диск. Вы хотите реорганизоваться (по разным причинам).
  • При попытке выполнить это для большой фрагментированной таблицы журнал заполняется до тех пор, пока диск журнала не заполнится, а затем команда прерывается.
  • Если он находится в простом режиме, другие транзакции могут завершиться неудачей, пока журнал не будет очищен в следующей контрольной точке, а если он находится в полном режиме, другие транзакции могут завершиться неудачей до следующего резервного копирования журнала. Перелива!
  • Если вы работаете в полном режиме, вы увеличиваете частоту резервного копирования журнала, но это не помогает избежать проблемы, поскольку реорганизация выполняется в неявной транзакции, журнал не очищается до тех пор, пока эта транзакция не завершится, не прекратится или не будет остановлена.
  • И вы ДЕЙСТВИТЕЛЬНО хотите, чтобы реорганизация прошла до конца.

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

Вот что ты делаешь. Это немного долго, но просто.

  • Предварительно увеличьте размер файла журнала до сравнительно большого размера, но не до максимального. По сути, вы хотите оставить достаточно места для полезной работы, а также для небольшого роста, если он произойдет, чтобы обычные операции не прекращались.
  • Создайте задание для запуска реорганизации индекса («Реорганизация»).
  • Создайте предупреждение WMI агента («Reorganize Relief Valve») о состоянии производительности.

    • Объект: SQLServer: Базы данных
    • Счетчик: Процент журнала используется
    • Экземпляр: (имя вашей большой базы данных)
    • Предупреждение, если счетчик поднимается выше: 80
    • Ответ: Выполнить задание («Проверка реорганизации»)
  • Создать работу («Реорганизовать проверку»)

    • В задании проверьте msdb.dbo.sysjobactivity, чтобы увидеть, выполняется ли задание «Реорганизация». И если это ...
    • Остановите работу и опросите, пока она не остановится. Это может занять несколько секунд.
    • (Если вы находитесь в полном режиме) Запустите задание резервного копирования журнала и подтвердите его завершение.
    • Дважды проверьте sys.dm_os_performance_counters, что ваш счетчик свободного места в журнале уменьшился ниже вашего порога.
    • Начните задание «Реорганизовать».
  • Протестируйте все это где-нибудь, даже в изолированной программной среде разработки, чтобы убедиться, что она работает правильно, прежде чем прикреплять ее на свой рабочий сервер.

Вы увидите, что задание «Реорганизация» запускается и начинает заполнять журнал. Когда журнал достигает процента заполнения, он запускает предупреждение WMI (в течение примерно 30 с), которое запускает другое задание, которое видит, что задание «Реорганизация» выполняется и, вероятно, ошибочно. Затем он останавливает «Реорганизацию», выполняет резервное копирование, подтверждает, что свободное место в журнале вернулось к разумному значению, а затем снова запускает задание «Реорганизация», которое выполнит его с того места, где оно остановилось.

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

Это своего рода странный сценарий. Я почти уверен, что бы ошибся в этом несколько лет назад, и, очевидно, здесь есть фундаментальные проблемы. Но если вы имеете дело с сотнями серверов, возникнет несколько таких крайних случаев, которые никак не могут быть решены по какой-либо бизнес-причине, кроме как с помощью MacGyvering временного решения, которое выполняет свою работу.

Пока это безопасно, логично, проверено и хорошо документировано, проблем не должно быть.

Коди Кониор
источник
1

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

  1. Во время реорганизации индекса я буду увеличивать резервную копию tlog со своей обычной 30-минутной частоты до каждых 10-минутных частот.
  2. У меня есть другой сеанс, выполняющий проверку свободного места в журнале каждые 1 минуту, и, если свободное пространство в журнале находится ниже порогового значения, я остановлю сеанс реорганизации индекса и начну (или подожду) резервную копию журнала. Затем перезапустите индекс reorg.

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

jyao
источник
1

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

Проблема была вызвана репликацией транзакций . Очевидно, что журнал не может быть сохранен доREORGANIZE операции. Я где-то читал, что это известная проблема Microsoft, но я не уверен, где.

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

IUmpierrez
источник
0

Я предполагаю, что вы управляете чем-то вроде:

ИЗМЕНЕНИЕ ИНДЕКСА НА РЕОРГАНИЗАЦИЮ

К сожалению, нет возможности запустить частичную организацию (например, вы можете частично сжать файл журнала). Я могу обдумать эту проблему следующим образом:

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

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

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


источник