Wann wird CDC zum Verfolgen des Verlaufs verwendet?

26

SQL Server Change Data Capture ist eine Funktion, mit der Verlaufsdaten aus den SQL Server-Transaktionsprotokollen gelesen und in einer speziellen Tabelle gespeichert werden.

Durch die Verwendung spezieller Tabellenwertfunktionen (TVF) kann der Benutzer diese Daten abfragen, sodass entweder alle Änderungen an einer bestimmten Tabelle oder nur die Nettoveränderungen abgerufen werden können, die sich aus den Änderungen innerhalb einer bestimmten Zeit ergeben.

CDC hat bestimmte Vorteile

  • Es kann so konfiguriert werden, dass nur bestimmte Tabellen oder Spalten verfolgt werden.
  • Es ist in der Lage, Modelländerungen bis zu einem gewissen Grad zu verarbeiten.
  • Es beeinträchtigt die Leistung nicht so stark wie Trigger, da es mit den Transaktionsprotokollen zusammenarbeitet.
  • Es ist leicht zu aktivieren / deaktivieren und erfordert keine zusätzlichen Spalten in der Tabelle, die verfolgt werden sollten.

Es hat auch einige Nachteile:

Ich habe ziemlich viel über CDC gelesen und obwohl ich jetzt weiß, wie man es benutzt, bin ich mir immer noch nicht sicher, ob es das richtige Werkzeug für mich ist.

  1. Für welche Aufgaben / Szenarien ist CDC das richtige Werkzeug? (z. B. Benutzern erlauben, ein Datenobjekt zu einem bestimmten Zeitpunkt wiederherzustellen? Überwachung? Anzeigen des vollständigen Datenverlaufs?)
  2. Wann sollten Sie CDC lieber nicht verwenden, sondern auf eine benutzerdefinierte, auf Triggern basierende Lösung zurückgreifen?
  3. Ist es in Ordnung, CDC in einer Betriebsdatenbank zu verwenden und die CDC-Daten in einer Betriebsanwendung zu verwenden? (zB dem Endbenutzer zeigen) Oder ist dies eindeutig ein Missbrauch dieser Funktion?

Ich höre häufig, dass CDC ein Audit-Tool ist, aber ist das nicht, wofür SQL Server Audit ist? Sind sie beide verschiedene Werkzeuge für die gleiche Aufgabe? Oder kann CDC für andere Dinge verwendet werden?

Mein derzeitiges Szenario ist, dass ich gebeten werde, ein zuverlässiges Datenframework zu erstellen, das die Basis für mehrere zukünftige Anwendungen sein soll. Die genauen Anforderungen sind verschwommen, aber eine davon ist, dass es in der Lage sein sollte, den Datenverlauf zu verfolgen und ältere Einträge zusammen mit allen zugehörigen Daten aus anderen Tabellen wiederherzustellen. Ich prüfe CDC derzeit als Option, bin mir jedoch nicht sicher, ob dies der richtige Weg ist, da ich keine wirklich empfohlenen Anwendungsfälle finden kann.

Während ich Ratschläge für mein bestimmtes Szenario schätze, sollten Antworten allgemeine Ratschläge darüber geben, wann oder wann Change Data Capture nicht verwendet werden soll.

großartig
quelle
1
Idealerweise würde ein "Rahmen" diese Art von Entscheidung nicht treffen. es wäre den einzelnen Projekten überlassen. Aber da Sie dazu aufgefordert werden, möchte ich zumindest darauf hinweisen, wer Ihnen diese Anforderungen stellt: Es gibt verschiedene Möglichkeiten, dies zu erreichen, und die beste Wahl hängt stark von der genauen Verwendung und den Anforderungen ab. Fragen Sie, ob sie Ihnen Klarstellungen geben können, die Ihnen bei der Entscheidung helfen könnten (z. B. ob Leistung oder Flexibilität wichtiger sind). Eine weitere in Betracht zu ziehende Option besteht darin, beide Optionen als Teil des "Frameworks" zu entwickeln und realen Projekten die Wahl zu überlassen, welche aktiviert werden soll.
jpmc26
@ jpmc26, möglicherweise wird das Framework benötigt, um zu verhindern, dass jedes Projekt Zeit für die Entscheidung über diese Art von Frage aufwenden muss.
Ian Ringrose
@IanRingrose Mein Punkt ist, dass der Versuch, diese Entscheidung zu treffen, ohne die spezifischen Bedürfnisse eines Projekts zu berücksichtigen, auf lange Sicht mehr Probleme verursacht als es löst (und somit tatsächlich teurer ist als der Zeitaufwand). Dies ist eine Entscheidung, die im Allgemeinen nicht effektiv getroffen werden kann. Die Besonderheiten des Projekts müssen berücksichtigt werden. Wenn Sie eine Pauschalentscheidung treffen, verbringen Sie Zeit damit, die gewählte Lösung zu verwenden und Annahmen zu treffen, damit diese Annahmen verletzt werden, wenn festgestellt wird, dass es sich nicht um eine geeignete Lösung handelt. Dann muss das System neu gestaltet werden.
jpmc26
1
@ jpmc26 Ich könnte mich tatsächlich für die von Ihnen vorgeschlagene Lösung entscheiden, falls ich eine Möglichkeit finde, sie umzusetzen: Entwicklung von Trigger-basierter und CDC-basierter Verlaufsverfolgung, umschaltbar und hinter einer gemeinsamen Oberfläche. Die Anwendungen können dann je nach ihren Anforderungen die eine oder die andere auswählen, müssen sich jedoch nicht darum kümmern, sie selbst zu implementieren. Natürlich würde ich trotzdem gerne eine gute Antwort auf meine obige Frage bekommen, denn wenn CDC sowieso nicht für diese Art von Aufgabe geeignet ist (z. B. weil es nur für Audits gut ist), könnte ich mir die Mühe sparen und immer Trigger verwenden .
Magnattic
"Wenn der Agent nicht ausgeführt wird oder abstürzt, wird kein Verlauf verfolgt" - aber wenn er neu gestartet wird, gehen keine Änderungen verloren, oder?
Andy Joiner

Antworten:

12

Zuerst,

Die Erfassung von Änderungsdaten ist nur in den Editionen Enterprise, Developer und Evaluation von SQL Server verfügbar.

Dies kann für Sie entscheiden, ob einer Ihrer Kunden nicht über die Enterprise-Editionen verfügt oder ob Sie noch nicht wissen, dass Sie die Enterprise-Editionen verwenden werden. (Da die Spezifikation "mehrere zukünftige Anwendungen" enthält, kann dies ein echtes Problem für Sie sein.)

Im Gegensatz zu Triggern ist dies keine Echtzeit, sondern sowohl ein Vorteil als auch ein Nachteil. Die Verwendung von Triggern verlangsamt ein Update immer.

Ich habe an einem System gearbeitet, als wir Trigger verwendeten (von CodeSmith generiert) und alle Änderungen an den Datensätzen verfolgten. Außerdem haben wir die Änderungen mit einer Verlaufstabelle verknüpft, die das Modul der Anwendung enthielt, die die Änderung vorgenommen hat. und das Benutzeroberflächenelement, mit dem der Benutzer die Änderung vorgenommen hat.

Sie können dies jedoch am besten auf Anwendungsebene lösen, indem Sie beispielsweise alle Aktualisierungen in eine Nachrichtenwarteschlange schreiben, die dann wiederholt wird, um zu einem bestimmten Zeitpunkt eine Datenbank zu erstellen. Eine gute Übersicht über die Optionen finden Sie unter Temporale Muster im Martin Flowler-Blog .

Ian Ringrose
quelle
Der Link ist eine sehr interessante Lektüre, danke dafür. Dennoch ist es in meinem Fall keine Option, dies auf Anwendungsebene zu lösen. Das Framework, das ich baue, soll den größten Teil der Arbeit, einschließlich der Verlaufsverfolgung, für die darauf basierenden Anwendungen erledigen. Die Anwendungen arbeiten dann mit einer gemeinsamen Schnittstelle zum Speichern / Abrufen von Daten, sodass sie sich nicht darum kümmern müssen, wie die Daten gespeichert werden. Mir ist bewusst, dass diese Aufgabe alles andere als trivial ist.
Magnattic
Außerdem denke ich derzeit nicht über die Enterprise Edition nach oder bin in unserem Fall kein entscheidender Faktor. Die zukünftigen Anwendungen, von denen ich spreche, werden höchstwahrscheinlich alle von uns erstellt und gehostet.
Magnattic
@atticae, Ihr Framework muss nicht auf die Datenbank beschränkt sein. Es kann Code enthalten, der außerhalb der Datenbank ausgeführt wird.
Ian Ringrose
Es ist natürlich nicht auf die Datenbank beschränkt. (In diesem Fall würde ich es nicht als Framework bezeichnen.) Ich verstehe, was Sie jetzt unter "Anwendungsebene" verstehen, und verwende derzeit tatsächlich eine Variation des temporären Eigenschaftsmusters, über das in Ihrem Link gesprochen wird. Das von mir erstellte Framework stellt diese Schnittstelle für die Anwendungen bereit, die es verwenden. Trotzdem ist das Teil der Seite der Benutzeroberfläche, und nichts davon beantwortet meine oben skizzierten Fragen wirklich.
Magnattic
Nochmals vielen Dank für Ihre Antwort. Dies ist wahrscheinlich der entscheidende Faktor für die meisten Menschen, daher denke ich, dass dies eine gute Antwort ist und den zukünftigen Besuchern wahrscheinlich hilft, sich gegen die Verwendung von CDC zu entscheiden. Ich habe jedoch das Gefühl, dass die meisten meiner Fragen nicht wirklich beantwortet werden. Daher muss ich Stacylaray die Kopfgeldzahlung gewähren, der als einziger versucht hat, alle meine Fragen zu beantworten. (Obwohl ich auf eine etwas ausführlichere Antwort gehofft hatte.)
Magnattic
12

Hier ist eine sehr gut geschriebene 9-teilige Serie, in der die verschiedenen Methoden zum Überwachen von SQL Server-Datenänderungen beschrieben werden. Die Teile 3, 4 und 5 konzentrieren sich auf CDC. Es lohnt sich, alle Artikel durchzulesen, da hierdurch Ihre Fragen beantwortet werden, beispielsweise in den verschiedenen Szenarien, in denen die Funktionen angemessen und überlastet wären. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server

Brynn
quelle
1
Nachdem ich den Artikel durchgesehen habe, bin ich immer noch nicht viel schlauer. Wie in den meisten Artikeln wird detailliert beschrieben, wie CDC verwendet wird und wie es mit Change Tracking verglichen wird. Das beantwortet meine obigen Fragen allerdings nicht wirklich.
Magnattic
9

Für welche Aufgaben / Szenarien ist CDC das richtige Werkzeug? (zB Benutzern erlauben, ein Datenobjekt zu einem bestimmten Zeitpunkt wiederherzustellen?

Vielleicht kommt es darauf an.

Wirtschaftsprüfung?

Ja.

Vollständige Datenhistorie anzeigen?)

Ja.

Wann sollten Sie CDC lieber nicht verwenden, sondern auf eine benutzerdefinierte Trigger-basierte Lösung zurückgreifen?

Wenn die Daten in der Änderungstabelle nicht Ihren Anforderungen entsprechen.

Ist es in Ordnung, CDC in einer Betriebsdatenbank zu verwenden und die CDC-Daten in einer Betriebsanwendung zu verwenden? (zB dem Endbenutzer zeigen)

Ja.

Oder ist dies eindeutig ein Missbrauch dieser Funktion?

Nein, dies ist kein Missbrauch dieser Funktion.

Ich höre häufig, dass CDC ein Überwachungstool ist, aber ist das nicht der Zweck von SQL Server Audit?

Ja.

Sind sie beide verschiedene Werkzeuge für die gleiche Aufgabe?

Nein.

Oder kann CDC für andere Dinge verwendet werden?

CDC kann für andere Zwecke verwendet werden.

Es gibt Änderungsnachverfolgung und es gibt Änderungsdatenerfassung. Beide haben ihre Wurzeln in der Replikation.

Mit der Änderungsnachverfolgung können Sie die Nettoveränderungen für eine Tabelle bereitstellen. Ein Beispiel für die Verwendung wäre eine Handheld-Gerätesynchronisation.

CDC hingegen verfolgt jede kleine Veränderung, eine Geschichte. Man kann diesen Verlauf verwenden, um ein Data Warehouse zu aktualisieren, anstatt Daten massenweise zu kopieren, oder man kann diesen Verlauf als Daten selbst verwenden und daraus Berichte erstellen. Die Änderungstabelle ist weder versteckt noch enthält sie ein seltsames Schema oder ähnliches. Sie können es abfragen und die Daten verwenden, wie Sie möchten. Denken Sie daran ... es ist keine Echtzeit, wie Ian sagte. Die Daten stammen aus dem Transaktionsprotokoll. Vergewissern Sie sich daher, dass Sie Replikation, Spiegelung oder Protokollversand verwenden. Im Großen und Ganzen ist es schneller als Trigger. Sie müssen die Snapshot-Isolation verwenden, die mit Overhead verbunden ist, und Sie müssen über Disaster Recovery nachdenken.

Stacylaray
quelle
2

Ein Punkt der Korrektur. Zu einer Zeit war die Erfassung von Änderungsdaten nur in den oben aufgeführten Versionen verfügbar. Die Erfassung von Änderungsdaten war jedoch in der Standardausgabe ab 2016 SP1 verfügbar. In vielen Artikeln, die vor 2016 SP1 verfasst wurden, klingt es daher so, als ob CDC für diejenigen von uns, die die Standard-Edition verwenden, unerreichbar wäre. Dies ist nicht mehr der Fall. Das Microsoft-Dokument mit den verfügbaren Informationen zu CDC finden Sie unter dem folgenden Link.

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

Robert Sievers
quelle