Як запобігти заповненню журналу транзакцій під час реорганізації індексу?


19

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

Рівень фрагментації таблиці становить 30 - 35%. На деяких із цих машин я отримую помилку "журнал транзакцій повний", і реорганізація не вдається. Розмір журналу транзакцій сягає до 48 Гб. Який хороший спосіб протидіяти цьому? У нас не ввімкнено автоматичний приріст, і я не хочу це робити.

Я можу збільшити розмір журналу до більшого значення, але в міру збільшення розміру таблиці в майбутньому це може бути недостатньо. Крім того, це перемагає мета реорганізації для відновлення місця, якщо я збираюся збільшити розмір журналу в рівній мірі. Будь-які ідеї, як я можу ефективно протидіяти цьому? Використання насиченого режиму не є можливим, оскільки втрата даних неприйнятна.

Відповіді:


7

Найкраща практика - це REORGANIZEприблизно до 30% фрагментації та REBUILDвище. Просто REBUILDробить чисту копію, REORGANIZEробить це in situ.

Перевірте, що ви насправді робите: у вас немає плану технічного обслуговування, що робить і те, і інше?

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

REBUILDНатомість ми перейшли на без проблем, але ігнорували фрагментацію нижче 25%. Для нас це працювало краще: вам доведеться побачити, чи працює він для вас.

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


Правила числення та спілкування як в якісному, так і в кількісному відношенні дуже корисні.
Робіно

6

РЕОРГАНІЗАЦІЯ (як у ALTER INDEX ... REORGANIZE) - це дуже швидка операція (ну, в основному ...), яка вимагає невеликої кількості журналу, може бути перервана в будь-який момент і відновлена ​​пізніше, і працює внутрішньо в невеликих пакетних операціях :

дефрагментація виконується у вигляді серії коротких транзакцій, тому великий журнал непотрібний, якщо резервні копії журналу проводяться часто або якщо налаштування моделі відновлення є ПРОСТОМО.

Ви впевнені, що не говорите про відновлення ? Індекс REBUILD повільний, дорогий, витрачає величезну кількість журналу (якщо він не в режимі офлайн і не може бути мінімально занесений , оновлення в Інтернеті не може бути мінімально введеним), є однією гігантською транзакцією і її неможливо перервати без втрати всієї роботи.

Мені здається, що ти робиш перебудову, це дійсно виняткова операція, яку ти не повинен робити, якщо не маєш надзвичайно продуманої причини. Який рекрут космічного ви вимагаєте? Що-небудь, що DBCC CLEANTABLEне впорається? Ви перевірили фізичну структуру таблиці, чи вона відійшла від логічної структури (див. Стовпці таблиць SQL Server під кришкою )?

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

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


2
я роблю реорганізацію. модель відновлення повна, і я бачу великий розмір журналу транзакцій. причиною відмови є одне з двох 1. дзеркальних відображень. журнал потрібно висунути до другорядного до того, як простір можна буде відновити. 2. резервні копії журналу. Незважаючи на те, що ми робимо резервні копії кожні 15 хвилин, іноді це не вдається через цю причину.

Тут же ситуація, 2008R2, реорганізація індексів (не перебудована), і навіть у простому режимі (!) Tlog зростає до розміру найбільшої таблиці, яка становить> 40 ГБ. У повному режимі відновлення також не допомагає робити 5-хвилинне створення резервного копіювання, лише один величезний файл резервного копіювання TRN створюється під час регенерації індексу. Здається, це не має сенсу, але це однакова поведінка на двох різних серверах. Будь-яка ідея, як насправді розділити це на невеликі пакетні транзакції, як це підтверджено?
realMarkusSchmidt

5

У мене це питання було раніше.

  • У вас є велика база даних та невеликий привід журналу. Ви хочете реорганізуватись (з різних причин).
  • При спробі цього на великій фрагментованій таблиці журнал заповнюється, поки диск журналу не заповниться, а потім команда скасовується.
  • Якщо це в простому режимі, інші транзакції можуть провалитися, поки журнал не буде очищено в наступній контрольній точці, а якщо він перебуває в повному режимі, інші транзакції можуть завершитись до наступного резервного копіювання журналу. Витяг!
  • Якщо ви перебуваєте в повному режимі, ви збільшуєте частоту резервного копіювання журналу, але це не допомагає уникнути проблеми, оскільки реорганізація проводиться в результаті неявної транзакції, журнал не очищається, поки ця транзація не закінчиться або не припиниться або не буде зупинена.
  • І ви дійсно хочете, щоб ця реорганізація запустилася до завершення.

Це трохи протиінтуїтивно, тому що ви знаєте, що якщо ви скасуєте реорганізацію, вона може продовжуватися з того місця, де вона припинилася, це просто, що аборт здійснює транзакцію, а не відкочується назад.

Ось що ти робиш. Це трохи довго, але прямо.

  • Попередньо зробіть свій файл журналу до відносно великого розміру, але не максимум. В основному ви хочете залишити достатньо місця для корисної роботи, а також для невеликих наростів, якщо вони відбудуться, так що нормальні операції не припиняться.
  • Створіть завдання для запуску реорганізації індексу ("Реорганізувати").
  • Створіть попередження WMI агента ("Реорганізуйте клапан усунення") за умови виконання продуктивності.

    • Об'єкт: SQLServer: Бази даних
    • Лічильник: Використовується відсоток журналу
    • Примірник: (ваше велике ім'я бази даних)
    • Попередження, якщо лічильник піднімається вище: 80
    • Відповідь: виконати завдання ("Реорганізувати перевірку")
  • Створити роботу ("Реорганізувати чек")

    • Перевірте завдання msdb.dbo.sysjobactivity, щоб побачити, чи працює "Реорганізувати" завдання. І якщо це ...
    • Припиніть роботу і опитуйте, поки вона не припиниться. Це може зайняти кілька секунд.
    • (Якщо ви перебуваєте в повному режимі) Запустіть роботу резервного копіювання журналу та підтвердьте, коли він закінчується.
    • Двічі перевірте sys.dm_os_performance_counters, що ваш лічильник вільного простору журналу зменшився нижче порогового значення.
    • Почніть роботу "Реорганізувати".
  • Перевірте це десь, навіть пісочниця розробки, щоб переконатися, що він працює належним чином, перш ніж наклеювати його на свій виробничий сервер.

Що ви побачите - це робота "Реорганізувати", яка починається і починається заповнення журналу. Коли журнал потрапляє на відсоток, він запускає попередження WMI (протягом приблизно 30-х років), яке запускає вашу іншу роботу, яка бачить, що робота «Реорганізувати» працює і так, швидше за все, вини. Потім він зупиняє "Реорганізувати", робить резервну копію, підтверджує, що вільний простір журналу повернувся до розумного значення, а потім знову запустить роботу "Реорганізувати", яка підбере там, де вона зупинилась.

Тож як ви можете пояснити, що заздалегідь розмістити ваш журнал до розумної цифри в цьому сценарії, це зменшити кількість зростання / тригер / робота / стоп / перезапуск, щоб він був більш ефективним, а також зберігав достатньо місця для епізодичні нарости, які не потрапляють вчасно.

Це своєрідний дивний сценарій. Я впевнений, що я би придумав це кілька років тому, і очевидно, що тут є основні основні проблеми. Але якщо ви матимете справу із сотнями серверів, кілька таких випадків урізаються, з якими неможливо вирішити жодним чином з будь-якої ділової причини, за винятком MacGyvering тимчасового рішення, яке виконує завдання.

Поки це безпечно, логічно, перевірено та добре задокументовано, проблем не повинно бути.


1

Це те, що я зазвичай робив (у мене також є кілька таблиць із 80 + ГБ у кожній) для індексу reorg (тому що reorg індексу можна будь-коли зупинити, не втрачаючи попередньої роботи rorg).

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

У рамках мого обслуговування індексів я класифікую індекси на дві групи, одна - для відновлення індексу, а інша - для реорганізації індексу. Для відновлення індексу я буду використовувати дещо інший підхід, оскільки я не хочу зупиняти сеанс перебудови індексу (що спричинить відкат і втратить всю попередню роботу). Під час відновлення індексу, якщо мій сеанс моніторингу помітить сценарій вільного простору файлу tlog, що використовується, моніторинговий сеанс автоматично попередньо збільшить файл tlog, а в гіршому випадку (тобто диск заповнений), мій сеанс моніторингу створить інший файл журналу ( але пізніше я викину його на інший диск (резервний диск)


1

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

Проблема була викликана транзакційною реплікацією . Мабуть, журнал не можна створити резервне копіювання, поки REORGANIZEоперація не буде закінчена. Я десь читав, що це була відома проблема Microsoft, але не знаю, де.

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


0

Я припускаю, що ви щось робите:

АЛТЕР ІНДЕКСУ ПРО РЕОРГАНІЗАЦІЮ

На жаль, немає можливості запустити часткову організацію (наприклад, частково зменшити файл журналу). Я можу розглянути ці проблеми:

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.