Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
CDC-Datensätze verstehen
Wichtig
Diese Funktion wird als AWS Vorversion bereitgestellt und kann sich ändern. Weitere Informationen finden Sie in Abschnitt 2, Betas und Vorschauen, in den AWS Servicebedingungen
Vor der allgemeinen Verfügbarkeit werden wir Ihrer Stream-Payload neue Operationstypen ("op": "u"für Updates) hinzufügen. Um sicherzustellen, dass Ihre Anwendung diese Änderungen unverändert verarbeitet, behandeln Sie jeden unbekannten op Wert als Fehler, indem Sie die Payload übernehmen. after Details dazu finden Sie unter CDC-Datensätze verstehen.
Aurora DSQL CDC liefert jede Änderung als JSON-Datensatz. Der Datensatz verwendet eine Hüllstruktur mit Operationstyp, Bildern vor und nach der Zeile und Quellmetadaten.
So werden Datensätze Amazon Kinesis zugeordnet
Aurora DSQL schreibt jeden CDC-Datensatz als einen einzelnen Kinesis-Datensatz. Das Data Feld des Kinesis-Datensatzes enthält die JSON-Nutzlast. Aurora DSQL verwendet einen randomisierten Kinesis-Partitionsschlüssel, um CDC-Datensätze gleichmäßig auf Shards zu verteilen. Um alle Änderungen zu lesen, verwenden Sie alle Shards im Kinesis-Datenstrom. Wenn ein Datensatz die Größenbeschränkung für Kinesis-Datensätze überschreitet, teilt Aurora DSQL ihn auf mehrere Kinesis-Datensätze auf. Details hierzu finden Sie unter Umgang mit übergroßen Datensätzen.
Anmerkung
Ein Kinesis-Datensatz hat einen Data Blob. Die Primärschlüsselwerte werden im Feld der JSON-Payload für Löschungen oder before im Feld für Einfügungen und after Aktualisierungen angezeigt. Um den Primärschlüssel für die nachfolgende Verarbeitung zu extrahieren, lesen Sie ihn aus dem entsprechenden Feld in der Payload.
Primärschlüssel in der Payload
Bei Tabellen mit einem Primärschlüssel erscheinen die Werte der Primärschlüsselspalte in der Payload:
-
Bei Einfügungen und Aktualisierungen umfasst die Payload die Primärschlüsselspalten zusammen mit allen anderen Spalten im
afterFeld. -
Bei Löschungen werden die Primärschlüsselspalten im
beforeFeld angezeigt.
Stellen Sie sich zum Beispiel eine Tabelle mit einem zusammengesetzten Primärschlüssel vor:
CREATE TABLE order_items ( order_id INT, item_id INT, quantity INT, price NUMERIC, PRIMARY KEY (order_id, item_id) );
Ein Löschen dieser Tabelle erzeugt eine Nutzlast, wo"before": {"order_id": 1001, "item_id": 42}.
Nutzlast aufzeichnen
Die Nutzlast verwendet das folgende JSON-Umschlagformat.
INSERT-Beispiel
Das folgende Beispiel zeigt einen CDC-Datensatz für einen Einfügevorgang:
{ "type": "full", "op": "c", "before": null, "after": {"order_id": 1001, "item_id": 42, "quantity": 5, "price": "29.99"}, "source": { "version": "1.0", "ts_ms": 1705318200000, "ts_ns": 1705318200000000000, "txId": "ffthunp5stx6ffs2vyfqoatmfu", "schema": "public", "table": "order_items", "db": "postgres", "cluster": "kmabugltfmjdaj2siqr2qbxgju" }, "ts_ms": 1705318200125, "ts_ns": 1705318200125483291 }
Beispiel „UPDATE“
Das folgende Beispiel zeigt, wie ein durch eine UPDATE Anweisung erzeugter CDC-Datensatz aussehen wird, nachdem Aurora DSQL mit der Ausgabe beginnt: op: "u"
Wichtig
Derzeit sendet Aurora DSQL sowohl op: "c" für Einfügungen als auch für Updates. Eine nachfolgende Version wird op: "u" für Updates und op: "c" für Inserts ausgegeben. Gestalten Sie Ihre App so cu, dass sie handhabt, d damit Ihre Kunden während der Umstellung weiterarbeiten können.
{ "type": "full", "op": "u", "before": null, "after": {"order_id": 1001, "item_id": 42, "quantity": 10, "price": "29.99"}, "source": { "version": "1.0", "ts_ms": 1705318300000, "ts_ns": 1705318300000000000, "txId": "qvtiesgmd55cvlfukm3dfuotji", "schema": "public", "table": "order_items", "db": "postgres", "cluster": "kmabugltfmjdaj2siqr2qbxgju" }, "ts_ms": 1705318300125, "ts_ns": 1705318300125483291 }
Beispiel LÖSCHEN
Bei Löschungen in Tabellen mit einem Primärschlüssel enthält das before Feld die Primärschlüsselwerte der gelöschten Zeile:
{ "type": "full", "op": "d", "before": {"order_id": 1001, "item_id": 42}, "after": null, "source": { "version": "1.0", "ts_ms": 1705318400000, "ts_ns": 1705318400000000000, "txId": "xyzabc123def456ghi789jklmno", "schema": "public", "table": "order_items", "db": "postgres", "cluster": "kmabugltfmjdaj2siqr2qbxgju" }, "ts_ms": 1705318400125, "ts_ns": 1705318400125483291 }
Payload-Felder
| Feld | Description |
|---|---|
type |
Der Datensatztyp. fullfür einen vollständigen Datensatz, der Inline before - und after Werte enthält. chunkedfür einen Hauptdatensatz, der auf Fragmentdatensätze für ein oder beide Bilder verweist. fragmentfür einen einzelnen Teil eines zusammengefügten Bilds. Details hierzu finden Sie unter Umgang mit übergroßen Datensätzen. |
op |
Art des Vorgangs. c= erstellen (einfügen), u = aktualisieren, d = löschen. Derzeit sendet Aurora DSQL sowohl c für Einfügungen als auch für Updates. Eine nachfolgende Version wird u für Updates und c für Inserts ausgegeben. Entwerfen Sie Ihre App so, dass sie alle drei Werte verarbeitet. |
before |
Enthält bei Löschungen in Tabellen mit einem Primärschlüssel die Primärschlüsselwerte der gelöschten Zeile. Aurora DSQL legt dieses Feld null für Einfügungen, Aktualisierungen und Löschungen in Tabellen ohne Primärschlüssel auf fest. |
after |
Der vollständige Zeilenstatus nach der Änderung, einschließlich aller Spalten. Aurora DSQL setzt dieses Feld auf null für Löschungen. |
chunked |
Nur vorhanden, wenn es type ist. chunked Enthält Metadaten zur Reassemblierung für das before Bild, das after Bild oder beides. Aurora DSQL lässt das abgeschnittene Bild aus der obersten Ebene before oder dem after Feld weg und platziert es stattdessen darunter. chunked Details hierzu finden Sie unter Umgang mit übergroßen Datensätzen. |
source.version |
Die Version des CDC-Quellmetadatenformats. Die aktuelle Version ist 1.0. |
source.ts_ms |
Der Zeitstempel des Transaktions-Commits in Millisekunden seit der Unix-Epoche, Coordinated Universal Time (UTC). |
source.ts_ns |
Zeitstempel des Transaktions-Commits in Nanosekunden, UTC. Der Zeitstempel mit der höchsten Genauigkeit, der verfügbar ist. Verwenden Sie dieses Feld, um eine Gesamtreihenfolge der Transaktionen festzulegen. |
source.txId |
Eine eindeutige Transaktions-ID, codiert als Base32. Alle Datensätze aus derselben Transaktion haben denselben txId Wert. Verwenden Sie dieses Feld, um Datensätze zu gruppieren, die zu derselben Transaktion gehören. |
source.schema |
Der PostgreSQL-Schemaname (zum Beispielpublic). |
source.table |
Der Name der Tabelle. |
source.db |
Der Datenbankname. Immer postgres für Aurora DSQL. |
source.cluster |
Die Aurora DSQL-Cluster-ID. |
ts_ms |
Der Zeitpunkt, zu dem das CDC-System den Datensatz verarbeitet hat, in Millisekunden, UTC. Der Unterschied zwischen ts_ms und source.ts_ms ist ein Maß für die Verzögerung bei der Replikation. |
ts_ns |
Die Zeit, zu der das CDC-System den Datensatz verarbeitet hat, in Nanosekunden, UTC. |
Einzelheiten formatieren
Die folgenden Details beschreiben, wie Aurora DSQL CDC Datensätze formatiert. Entwerfen Sie Ihre App so, dass sie mit diesen Verhaltensweisen umgehen kann.
-
Vollständiges Nachbild für Einfügungen und Updates. Aurora DSQL enthält den vollständigen Zeilenstatus im
afterFeld für alle Schreibvorgänge. DasbeforeFeld istnullfür Einfügungen und Aktualisierungen vorgesehen. Derzeit werden sowohl Einfügungen als auch Updates verwendetop: "c", aber eine nachfolgende Version wirdop: "u"für Updates eine Ausgabe ausgeben. Entwerfen Sie Ihre App so, dass siesource.ts_nspro Primärschlüssel für die Bestellung verwendet, anstatt sich auf dasopFeld zu verlassen, um zwischen Einfügungen und Updates zu unterscheiden. -
Post-change Nur Zeilenstatus. CDC-Datensätze enthalten den vollständigen Zeilenstatus nach jeder Änderung. Der Status der Zeile vor einer Aktualisierung ist nicht enthalten. Bei Löschungen in Tabellen mit einem Primärschlüssel enthält das
beforeFeld die Primärschlüsselwerte. -
Numerische Typen, die als Zeichenketten serialisiert sind. Aurora DSQL serialisiert
numericunddecimalbewertet als JSON-Zeichenketten, um die exakte Präzision zu gewährleisten. -
Binärdaten, die als Base64 codiert sind. Aurora DSQL kodiert
byteaWerte als Base64-Zeichenketten. -
Spezielle Gleitkommawerte und numerische Werte. Aurora SQL serialisiert NaN und ±Infinity als die Zeichenketten
"NaN", und."Infinity""-Infinity"Dies gilt für die Typenreal, unddouble precision.numeric -
Als JSON-Zeichenketten serialisierte JSON-Spalten. Aurora DSQL serialisiert
jsonSpaltenwerte als JSON-Zeichenfolgen, die den in der Spalte gespeicherten JSON-Rohtext enthalten. Analysieren Sie den Zeichenkettenwert in Ihrer App (z. B. mitJSON.parsein JavaScript oderjson.loadsin Python), um auf den zugrunde liegenden JSON-Wert zuzugreifen. -
Überlaufwerte, die als Null ausgegeben werden. Wenn ein Wert während der Serialisierung nicht im Ziel-JSON-Typ dargestellt werden kann, gibt Aurora DSQL JSON
nullfür diese Spalte aus. Dies gilt fürintervalWerte, deren Gesamtmikrosekunden den 64-Bit-Ganzzahlbereich mit Vorzeichen überschreiten (±9.223.372.036.854.775.807 Mikrosekunden, ungefähr ±292.271 Jahre). Entwerfen Sie IhrenullApp so, dass sie unerwartete Werte in Spalten verarbeitet, für die im Datenbankschema keine NULL-Werte zulässig sind. -
Übergroße Datensätze, die in Blöcke aufgeteilt sind. Wenn ein Datensatz die Amazon Kinesis Kinesis-Datensatzgrößenbeschränkung überschreitet, teilt Aurora DSQL das betroffene
afterBildbeforeoder Bild in Fragmente auf und stellt sie als separate Kinesis-Datensätze bereit, sodass Sie die Änderung trotzdem erhalten. Entwerfen Sie Ihre App so, dass sie die Bilder wieder zusammensetzt. Details hierzu finden Sie unter Umgang mit übergroßen Datensätzen.
Umgang mit übergroßen Datensätzen
Wenn das serialisierte JSON eines CDC-Datensatzes 9 MiB überschreitet, teilt Aurora DSQL die before and/or after Bilder auf und liefert mehrere Kinesis-Datensätze. Jeder Datensatz enthält ein type Feld der obersten Ebene, das seine Struktur angibt: full für einen vollständigen Datensatz, für einen Hauptdatensatz, der auf Fragmente verweist, und chunked fragment für einen einzelnen Teil eines abgeschnittenen Bildes. Die ts_ns Felderop, sourcets_ms, und in einem aufgeteilten Hauptdatensatz verhalten sich genauso wie in einem vollständigen Datensatz. Datensätze, die in einen einzelnen Kinesis-Datensatz passen, sind auf type eingestellt full und erfordern keine zusätzliche Bearbeitung.
A chunk_id ist bei Wiederholungsversuchen stabil. Wenn Aurora DSQL ein Fragment erneut zustellt, überträgt es dasselbe chunk_id wie die ursprüngliche Lieferung, sodass Ihre App unter derselben Kennung weiter puffern kann, ohne Teilsätze aus früheren Versuchen zu verarbeiten.
Hauptdatensatz
Ein aufgeteilter Hauptdatensatz ersetzt die oberste Ebene before oder das after Feld für das geteilte Bild durch ein chunked Objekt, das beschreibt, wie es wieder zusammengesetzt wird. Jeder Eintrag darunter chunked hat eine chunk_id (die Kennung, die Fragmente mit diesem Datensatz verknüpft), total_fragments (die Anzahl der Fragmente, aus denen das Bild besteht) und crc32c (eine CRC32C-Prüfsumme als Dezimalzeichenfolge über dem wieder zusammengesetzten Bildtext). Wenn ein Bild inline ist und das andere in Blöcke aufgeteilt ist, erscheint das Inline-Bild immer noch auf der obersten Ebene entweder als Wert oder. null
{ "type": "chunked", "op": "c", "before": null, "after": null, "source": { "version": "1.0", "ts_ms": 1705318200000, "ts_ns": 1705318200000000000, "txId": "ffthunp5stx6ffs2vyfqoatmfu", "schema": "public", "table": "order_items", "db": "postgres", "cluster": "cluster-id" }, "chunked": { "after": { "chunk_id": "chunk-id", "total_fragments": 3, "crc32c": "2073618257" } }, "ts_ms": 1705318200125, "ts_ns": 1705318200125483291 }
Datensatz fragmentieren
Jedes Fragment ist ein eigener type Kinesis-Datensatz mit einer Einstellung chunked.after.chunk_id auf fragment und drei Feldern: chunk_id entspricht dem Wert im entsprechenden Datensatz chunked.before.chunk_id oder im Hauptdatensatz, index ist die nullbasierte Position des Fragments innerhalb des Bildes und data ist ein Segment des JSON-Textes des Bildes, das nach UTF-8 Zeichengrenzen aufgeteilt ist (der data Wert jedes Fragments ist für sich genommen eine gültige UTF-8 Zeichenfolge). Da Aurora DSQL CDC UNORDERED Modus- und randomisierte Partitionsschlüssel verwendet, können Fragmente und der Hauptdatensatz auf unterschiedlichen Shards und in beliebiger Reihenfolge ankommen. Um alle Fragmente zu lesen, verbrauchen Sie alle Shards im Kinesis-Datenstrom. Weitere Informationen zur Bestellung von Lieferungen finden Sie unter. Bestellung
{ "type": "fragment", "chunk_id": "chunk-id", "index": 0, "data": "partial-JSON-text" }
Um ein übergroßes Bild wieder zusammenzusetzen, puffern Sie jeden Datensatz type fragment einzeln. chunk_id Wenn Sie einen Hauptdatensatz mit erhalten typechunked, warten Sie, bis Sie total_fragments Fragmente für jeden Datensatz haben, auf den unter chunked.before oder chunk_id verwiesen wirdchunked.after, sortieren Sie die Fragmente index aufsteigend und verketten Sie die Zeichenketten. data Das verkettete Ergebnis ist das Original before oder das after Objekt als JSON-Text. Analysieren Sie es, um auf die Spaltenwerte zuzugreifen. Um die Integrität der Lieferung zu überprüfen, berechnen Sie CRC32C anhand der verketteten Zeichenfolge und vergleichen Sie das Ergebnis mit oder. chunked.before.crc32c chunked.after.crc32c
Serialisierung des Datentyps
In den folgenden Tabellen wird beschrieben, wie Aurora DSQL jeden PostgreSQL-Datentyp in CDC-Datensätzen serialisiert.
Ganzzahl-Typen
| PostgreSQL-Typ | JSON-Darstellung | Beispiel |
|---|---|---|
smallint (int2) |
JSON-Nummer | 42 |
integer (int4) |
JSON-Nummer | 1001 |
bigint (int8) |
JSON-Nummer | 9223372036854775807 |
oid |
JSON-Nummer (ohne Vorzeichen) | 16384 |
Werte bigint über ±2^53 können in Umgebungen an Genauigkeit verlieren. JavaScript Verwenden Sie in BigInt diesen Fällen Bibliotheken oder Bibliotheken mit beliebiger Genauigkeit.
Floating-point Typen
| PostgreSQL-Typ | JSON-Darstellung | Beispiel | Hinweise |
|---|---|---|---|
real (float4) |
JSON-Nummer | 3.14159 |
NaN und ±Infinity werden als Strings"NaN",, "Infinity" serialisiert. "-Infinity" |
double precision (float8) |
JSON-Nummer | 3.141592653589793 |
Gleiche Behandlung von Sonderwerten wiereal. |
numeric / decimal |
JSON-Zeichenfolge | "123.45" |
Immer eine Zeichenfolge, um die exakte Genauigkeit beizubehalten. NaN und ±Infinity werden als Strings"NaN",, "Infinity" serialisiert. "-Infinity" |
Boolesch
| PostgreSQL-Typ | JSON-Darstellung | Beispiel |
|---|---|---|
boolean |
Boolescher JSON-Wert | true oder false |
Zeichentypen
| PostgreSQL-Typ | JSON-Darstellung | Beispiel |
|---|---|---|
varchar / text |
JSON-Zeichenfolge | "Hello, world!" |
bpchar (char(n)) |
JSON-Zeichenfolge | "ABC"(Leerzeichen am Ende entfernt) |
name |
JSON-Zeichenfolge | "pg_class" |
"char"(Einzelbyte) |
JSON-Zeichenfolge | "A" |
Binär
| PostgreSQL-Typ | JSON-Darstellung | Beispiel |
|---|---|---|
bytea |
JSON-Zeichenfolge (Base64) | "SGVsbG8gV29ybGQh" |
Typen für Datum und Uhrzeit
| PostgreSQL-Typ | JSON-Darstellung | Beispiel | Hinweise |
|---|---|---|---|
date |
JSON-Nummer (Tage seit der Unix-Epoche) | 19797 |
+infinityund -infinity werden als Tageszählungen für Wächter dargestellt, die aus der Epochenoffset-Arithmetik abgeleitet wurden. Diese Werte entsprechen keinen aussagekräftigen Kalenderdaten. |
time |
JSON-Nummer (Mikrosekunden seit Mitternacht) | 52200123456 |
|
timetz |
JSON-Nummer (Mikrosekunden seit Mitternacht, UTC) | 52200123456 |
Die Ortszeit wird an UTC angepasst, indem der gespeicherte Zeitzonen-Offset (Sekunden westlich von UTC) angewendet wird. Das Ergebnis wird in den Bereich [0, 86400000000) Mikrosekunden eingeschlossen. |
timestamp |
JSON-Nummer (Mikrosekunden seit der Unix-Epoche) | 1710510600123456 |
±Infinity ordnet Sentinel-Werte zu: für und für. 9223372036825200000 +infinity -9223372036832400000 -infinity |
timestamptz |
JSON-Nummer (Mikrosekunden seit der Unix-Epoche) | 1710510600123456 |
In UTC gespeichert und ausgegeben. Dieselben ±Infinity-Sentinel-Werte wie. timestamp |
interval |
JSON-Nummer (ungefähre Gesamtmikrosekunden) | 2802603000000 |
Monate werden auf 30,4375 Tage (2.629.800 Sekunden) geschätzt. Die Summe wird berechnet als. (months × 2,629,800 + days × 86,400) ×
1,000,000 + microseconds Wenn das Ergebnis den 64-Bit-Ganzzahlbereich mit Vorzeichen überschreitet (±9.223.372.036.854.775.807 Mikrosekunden, ungefähr ±292.271 Jahre), gibt Aurora DSQL JSON für die Spalte aus. null |
Andere Typen
| PostgreSQL-Typ | JSON-Darstellung | Beispiel |
|---|---|---|
uuid |
JSON-Zeichenfolge (Standard-Hexadezimalformat 8-4-4-12) | "550e8400-e29b-41d4-a716-446655440000" |
oidvector |
Leeres JSON-Array | [] |
json |
JSON-Zeichenfolge, die den rohen JSON-Text enthält | "{\"key\": \"value\"}" |
NULL-Werte
Für jeden Datentyp werden NULL Spaltenwerte als JSON dargestelltnull.
Schemaentwicklung in CDC-Datensätzen
Wenn Sie das Schema einer Tabelle ändern, z. B. indem Sie eine Spalte hinzufügen, löschen oder umbenennen, spiegeln die CDC-Datensätze die Änderung ab der Transaktion wider, die die DDL-Änderung festgeschrieben hat. Datensätze von Transaktionen, die vor der DDL-Änderung festgeschrieben wurden, verwenden das vorherige Schema. Beispiel:
-
Wenn Sie eine Spalte hinzufügen, enthalten Datensätze aus früheren Transaktionen die neue Spalte nicht. Datensätze ab der hinzugefügten Transaktion enthalten die neue Spalte.
-
Wenn Sie eine Spalte löschen, enthalten die Datensätze ab der Löschtransaktion diese Spalte nicht mehr.
-
Wenn Sie eine Spalte umbenennen, verwenden Datensätze ab der Umbenennungstransaktion den neuen Spaltennamen.
Verfolgen Sie Schemaänderungen in Ihrem Downstream-Consumer, indem Sie die Spaltennamen überprüfen, die in den einzelnen Datensätzen und Feldern vorhanden sindafter. before Das source.version Feld in jedem Datensatz identifiziert das CDC-Umschlagformat.