Коли використовувати CDC для відстеження історії?


26

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

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

CDC має певні переваги

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

Він також має деякі недоліки:

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

  1. Для яких завдань / сценаріїв CDC є правильним інструментом? (наприклад, Дозволити користувачам відновити об'єкт даних до певного моменту? Аудит? Показ усієї історії даних?)
  2. Коли вам краще не використовувати CDC, а вдатися до користувацького рішення на основі тригера?
  3. Чи нормально використовувати CDC в операційній базі даних та використовувати дані CDC в операційній програмі? (наприклад, показ її кінцевому користувачеві) Або це явно неправильне використання цієї функції?

Я часто чую, що CDC є інструментом аудиту, але хіба це те, для чого призначений аудит SQL Server ? Вони обидва різні інструменти для одного завдання? Або CDC можна використовувати для інших речей?

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

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


1
В ідеалі "рамки" не приймали б такого рішення; це було б залишено окремими проектами. Але оскільки вас просять зробити це, я, принаймні, зауважую, хто б не ставив перед вами ці вимоги: для цього є різні способи, і найкращий вибір сильно залежить від конкретного використання та потреб. Запитайте, чи можуть вони дати вам якісь пояснення, які могли б допомогти вам вирішити (наприклад, важливіше чи продуктивність). Ще один варіант, який слід розглянути, - це розробити обидва варіанти як частину "рамки" та дозволити реальним проектам обирати, який із них можна включити.
jpmc26

@ jpmc26, може знадобитися рамка, щоб зупинити витрачання кожного проекту часу на вирішення такого питання.
Ян Рінроуз

@IanRingrose Моя думка полягає в тому, що спроба прийняти це рішення, не враховуючи конкретних потреб проекту, в кінцевому рахунку спричинить більше проблем, ніж вирішує (і, таким чином, фактично буде дорожче, ніж витрачати цей час). Це рішення, яке не може бути ефективно прийнято в загальному випадку. Необхідно враховувати специфіку проекту . Використовуючи рішення про ковдру, час буде витрачено на використання обраного рішення та зробити припущення навколо нього лише для тих припущень, які будуть порушені, коли буде виявлено, що це не було відповідним рішенням. Тоді систему потрібно буде переробити.
jpmc26

1
@ jpmc26 Я можу насправді попрацювати з запропонованим вами рішенням, якщо я знайду спосіб відключити його: Розробка як відстеження історії на основі тригера, так і на CDC, перемикається і знаходиться за загальним інтерфейсом. Тоді програми можуть вибирати те чи інше, залежно від їхніх вимог, але не потрібно хвилюватися про їх реалізацію самостійно. Звичайно, я все-таки хотів би отримати хорошу відповідь на моє вище питання, тому що якщо CDC все одно не вирізаний для подібного завдання (наприклад, тому що це лише користь для аудиту), я можу врятувати себе від неприємностей і завжди використовувати тригери .
магнатський

"Якщо Агент не працює або виходить з ладу, не відслідковується історія" - але якщо його перезапустити, зміни не втратяться, правда?
Енді Столяр

Відповіді:


12

По-перше,

Збір даних для збору даних доступний лише у виданнях Enterprise, Developer та Evaluation SQL Server.

Таким чином, це може вирішити для вас, якщо хтось із ваших клієнтів не матиме корпоративних видань, або ви ще не знаєте, чи будете ви використовувати корпоративні видання. (Оскільки специфікація включає в себе "кілька майбутніх додатків", це може бути справжньою проблемою для вас)

На відміну від тригерів це не в режимі реального часу, це є і перевагою, і недоліком. Використання тригерів завжди сповільнює оновлення.

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

Однак ви, можливо, найкраще вирішити це на рівні програми, написавши все оновлення до черги повідомлень, яке потім відтворюється для створення бази даних у будь-який момент часу, див. Templaral Patterns в блозі Martin Flowler для хорошого огляду варіантів.


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

Крім того, наразі я не розглядаю Enterprise Edition чи не є вирішальним фактором у нашому випадку. Майбутні програми, про які я говорю, швидше за все, будуть створені та розміщені нами.
магнатичний

@atticae, ваша рамка не повинна обмежуватися базою даних, вона може включати код, який працює за межами бази даних.
Ян Рінроуз

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

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

12

Ось дуже добре написана серія із 9 частин, в якій розглядаються різні способи аудиту змін даних SQL Server. Частини 3, 4 і 5 зосереджуються на CDC. Варто ознайомитися з усіма статтями, оскільки це відповість на ваші запитання, як і в різних сценаріях, де функції будуть доречними та накладними. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server


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

9

Для яких завдань / сценаріїв CDC є правильним інструментом? (наприклад, дозволити користувачам відновити об'єкт даних до певного моменту?

Можливо, це залежить.

Аудит?

Так.

Показано повну історію даних?)

Так.

Коли вам краще не використовувати CDC, а вдатися до користувацького рішення на основі тригера?

Коли дані в таблиці змін не відповідають вашим потребам.

Чи нормально використовувати CDC в операційній базі даних та використовувати дані CDC в операційній програмі? (наприклад, показ цього кінцевому користувачеві)

Так.

Або явно це неправильне використання цієї функції?

Ні, це не зловживання цією функцією.

Я зазвичай чую, що CDC є інструментом аудиту, але чи не для цього є аудит SQL Server?

Так.

Вони обидва різні інструменти для одного завдання?

Ні.

Або CDC можна використовувати для інших речей?

CDC можна використовувати для інших речей.

Існує Відстеження змін і Є Зміна даних Захоплення. Обидва мають своє коріння в реплікації.

Відстеження змін забезпечує спосіб подання чистих змін до таблиці. Прикладом використання може бути ручна синхронізація пристрою.

CDC, з іншого боку, відстежує всі невеликі зміни, історію. Можна використовувати цю історію для оновлення сховища даних замість масового копіювання даних, або можна використовувати цю історію як самі дані та генерувати звіти з неї. Таблиця змін не прихована, не має якоїсь дивної схеми чи чогось іншого. Ви можете запитувати його та використовувати дані, скільки завгодно. Просто майте на увазі ... це не реальний час, як сказав Іан. Дані надходять з журналу транзакцій, тому дбайте про них так, як ви б використовували реплікацію, дзеркальне відображення або доставку журналу. За великим рахунком, це буде швидше, ніж тригери. Вам потрібно буде використовувати знімок Snapshot, який має накладні витрати, і вам доведеться подумати про відновлення після аварій.


2

Точка корекції. Свого часу зміни даних були доступні лише у перелічених вище версіях. Однак засіб збору даних про зміни стало доступним у стандартному виданні з SP1 2016 року. Таким чином, у багатьох статтях, написаних до 2016 року SP1, звучить так, ніби CDC недоступний для тих, хто використовує Standard Edition. Це вже не так. Документ Microsoft, що описує наявні CDC, знаходиться за посиланням нижче.

https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017#DW

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