View a markdown version of this page

Memahami catatan CDC - Amazon Aurora DSQL

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memahami catatan CDC

penting

Fitur ini disediakan sebagai AWS Pratinjau dan dapat berubah sewaktu-waktu. Untuk informasi selengkapnya, lihat bagian 2, Beta dan Pratinjau, di Ketentuan AWS Layanan. Untuk mempelajari lebih lanjut tentang harga untuk aliran CDC, lihat halaman harga Aurora DSQL.

Sebelum ketersediaan umum, kami akan menambahkan jenis operasi baru ("op": "u"untuk pembaruan) ke muatan aliran Anda. Untuk memastikan aplikasi Anda menangani perubahan ini tanpa modifikasi, perlakukan op nilai yang tidak dikenal sebagai peningkatan dengan menerapkan payload. after Lihat Memahami catatan CDC untuk detail.

Aurora DSQL CDC memberikan setiap perubahan sebagai catatan JSON. Rekaman menggunakan struktur amplop dengan tipe operasi, sebelum dan sesudah gambar baris, dan metadata sumber.

Bagaimana catatan memetakan ke Amazon Kinesis

Aurora DSQL menulis setiap catatan CDC sebagai catatan Kinesis tunggal. DataBidang catatan Kinesis berisi muatan JSON. Aurora DSQL menggunakan kunci partisi Kinesis acak untuk mendistribusikan catatan CDC secara merata di seluruh pecahan. Untuk membaca semua perubahan, gunakan semua pecahan pada aliran data Kinesis. Jika catatan melebihi batas ukuran rekaman Kinesis, Aurora DSQL membaginya di beberapa catatan Kinesis. Lihat perinciannya di Menangani catatan besar.

catatan

Catatan Kinesis memiliki satu Data gumpalan. Nilai kunci primer muncul di bidang payload JSON untuk dihapus, atau before after bidang untuk sisipan dan pembaruan. Untuk mengekstrak kunci utama untuk pemrosesan hilir, bacalah dari bidang yang sesuai di payload.

Kunci utama dalam muatan

Untuk tabel dengan kunci primer, nilai kolom kunci primer muncul di payload:

  • Untuk sisipan dan pembaruan, payload mencakup kolom kunci utama bersama dengan semua kolom lain di after bidang.

  • Untuk menghapus, kolom kunci utama muncul di before bidang.

Misalnya, pertimbangkan tabel dengan kunci primer komposit:

CREATE TABLE order_items ( order_id INT, item_id INT, quantity INT, price NUMERIC, PRIMARY KEY (order_id, item_id) );

Penghapusan pada tabel ini menghasilkan muatan di mana"before": {"order_id": 1001, "item_id": 42}.

Rekam muatan

Payload menggunakan format amplop JSON berikut.

Contoh INSERT

Contoh berikut menunjukkan catatan CDC untuk operasi insert:

{ "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 }
Contoh UPDATE

Contoh berikut menunjukkan seperti apa catatan CDC yang dihasilkan oleh UPDATE pernyataan setelah Aurora DSQL mulai memancarkan: op: "u"

penting

Saat ini Aurora DSQL memancarkan op: "c" untuk sisipan dan pembaruan. Rilis berikutnya akan memancarkan pembaruan, dan op: "u" op: "c" untuk sisipan. Rancang aplikasi Anda untuk ditangani cu, d sehingga konsumen Anda terus bekerja di seluruh transisi.

{ "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 }
DELETE contoh

Untuk menghapus pada tabel dengan kunci primer, before bidang berisi nilai kunci primer dari baris yang dihapus:

{ "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 }

Bidang payload

Bidang Deskripsi
type Jenis rekaman. fulluntuk catatan lengkap yang mencakup inline before dan after nilai. chunkeduntuk catatan utama yang mereferensikan catatan fragmen untuk satu atau kedua gambar. fragmentuntuk bagian individu dari gambar yang dipotong. Lihat perinciannya di Menangani catatan besar.
op Jenis operasi. c= buat (sisipkan), u = pembaruan, d = hapus. Saat ini Aurora DSQL memancarkan c untuk sisipan dan pembaruan. Rilis berikutnya akan memancarkan pembaruan, dan u c untuk sisipan. Rancang aplikasi Anda untuk menangani ketiga nilai tersebut.
before Untuk menghapus pada tabel dengan kunci primer, berisi nilai kunci primer dari baris yang dihapus. Aurora DSQL menetapkan bidang ini null untuk menyisipkan, memperbarui, dan menghapus pada tabel tanpa kunci utama.
after Status baris penuh setelah perubahan, termasuk semua kolom. Aurora DSQL menetapkan bidang ini untuk dihapus. null
chunked Hadir hanya ketika type adachunked. Berisi metadata pemasangan ulang untuk before gambar, gambar, atau keduanyaafter. Aurora DSQL menghilangkan gambar yang terpotong dari tingkat atas atau bidang dan menempatkannya di bawahbefore. after chunked Lihat perinciannya di Menangani catatan besar.
source.version Versi format metadata sumber CDC. Versi saat ini adalah 1.0.
source.ts_ms Transaksi melakukan stempel waktu dalam milidetik sejak zaman Unix, Coordinated Universal Time (UTC).
source.ts_ns Stempel waktu komit transaksi dalam nanodetik, UTC. Stempel waktu presisi tertinggi yang tersedia. Gunakan bidang ini untuk menetapkan urutan total transaksi.
source.txId Pengidentifikasi transaksi unik, dikodekan sebagai base32. Semua catatan dari transaksi yang sama memiliki txId nilai yang sama. Gunakan bidang ini untuk mengelompokkan catatan yang termasuk dalam transaksi yang sama.
source.schema Nama skema PostgreSQL (misalnya,). public
source.table Nama tabel.
source.db Nama database. Selalu postgres untuk Aurora DSQL.
source.cluster Pengidentifikasi cluster Aurora DSQL.
ts_ms Waktu di mana sistem CDC memproses catatan, dalam milidetik, UTC. Perbedaan antara ts_ms dan source.ts_ms merupakan ukuran lag replikasi.
ts_ns Waktu di mana sistem CDC memproses catatan, dalam nanodetik, UTC.

Rincian format

Rincian berikut menjelaskan bagaimana format Aurora DSQL CDC mencatat. Rancang aplikasi Anda untuk menangani perilaku ini.

  • Gambar setelah penuh untuk sisipan dan pembaruan. Aurora DSQL menyertakan status baris lengkap di after bidang untuk semua penulisan. beforeBidang ini null untuk sisipan dan pembaruan. Saat ini sisipan dan pembaruan digunakanop: "c", tetapi rilis berikutnya akan memancarkan op: "u" pembaruan. Rancang aplikasi Anda untuk digunakan source.ts_ns per kunci utama untuk pemesanan daripada mengandalkan op bidang untuk membedakan antara sisipan dan pembaruan.

  • Post-change status baris saja. Catatan CDC mencakup status baris penuh setelah setiap perubahan. Status baris sebelum pembaruan tidak disertakan. Untuk menghapus pada tabel dengan kunci primer, before bidang berisi nilai kunci primer.

  • Jenis numerik diserialkan sebagai string. Aurora DSQL membuat serial numeric dan decimal nilai sebagai string JSON untuk mempertahankan presisi yang tepat.

  • Data biner dikodekan sebagai Base64. Aurora DSQL bytea mengkodekan nilai sebagai string Base64.

  • Nilai floating-point dan numerik khusus. Aurora DSQL membuat serial NaN dan ±Infinity sebagai string,, dan. "NaN" "Infinity" "-Infinity" Ini berlaku untukreal,double precision, dan numeric jenis.

  • Kolom JSON diserialkan sebagai string JSON. Aurora DSQL membuat serial nilai json kolom sebagai string JSON yang berisi teks JSON mentah yang disimpan di kolom. Parse nilai string di aplikasi Anda (misalnya, dengan JSON.parse in JavaScript atau json.loads di Python) untuk mengakses nilai JSON yang mendasarinya.

  • Nilai overflow dipancarkan sebagai null. Jika nilai tidak dapat direpresentasikan dalam tipe JSON target selama serialisasi, Aurora DSQL memancarkan JSON untuk kolom itu. null Ini berlaku untuk interval nilai yang total mikrodetik melebihi rentang bilangan bulat bertanda 64-bit (± 9.223.372.036.854.775.807 mikrodetik, sekitar ±292.271 tahun). Rancang aplikasi Anda untuk menangani null nilai tak terduga di kolom yang tidak dapat dibatalkan dalam skema database.

  • Catatan besar dibagi menjadi beberapa bagian. Jika rekaman melebihi batas ukuran rekaman Amazon Kinesis, Aurora DSQL membagi after gambar before atau yang terpengaruh menjadi fragmen dan mengirimkannya sebagai catatan Kinesis terpisah sehingga Anda masih menerima perubahan. Rancang aplikasi Anda untuk memasang kembali gambar. Lihat perinciannya di Menangani catatan besar.

Menangani catatan besar

Ketika JSON serial rekaman CDC melebihi 9 MiB, Aurora DSQL membagi gambar, memberikan beberapa catatan Kinesis. before and/or after Setiap rekaman berisi type bidang tingkat atas yang menunjukkan strukturnya: full untuk catatan lengkap, chunked untuk catatan utama yang mereferensikan fragmen, dan fragment untuk potongan individu dari gambar yang terpotong. Bidang opsource,ts_ms, dan ts_ns bidang pada catatan utama yang terpotong berperilaku sama seperti pada catatan lengkap. Rekaman yang sesuai dengan satu catatan Kinesis telah type ditetapkan full dan tidak memerlukan penanganan tambahan.

A chunk_id stabil di seluruh percobaan ulang. Jika Aurora DSQL mengirimkan ulang sebuah fragmen, itu akan chunk_id sama dengan pengiriman asli, sehingga aplikasi Anda dapat melanjutkan buffering di bawah pengenal yang sama tanpa menangani set sebagian dari upaya sebelumnya.

Rekor utama

Rekaman utama yang terpotong menggantikan level atas before atau after bidang untuk gambar terpisah dengan chunked objek yang menjelaskan cara memasangnya kembali. Setiap entri di bawah chunked memiliki chunk_id (pengenal yang menghubungkan fragmen ke catatan ini), total_fragments (jumlah fragmen yang membentuk gambar itu), dan crc32c (checksum CRC32C, sebagai string desimal, di atas teks gambar yang dipasang kembali). Jika satu gambar sebaris dan yang lainnya terpotong, gambar sebaris masih muncul di tingkat atas sebagai nilai atau. 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 }
Catatan fragmen

Setiap fragmen adalah catatan Kinesis sendiri type dengan set fragment ke dan tiga bidangchunk_id: cocok dengan nilai dalam catatan chunked.before.chunk_id yang sesuai chunked.after.chunk_id atau pada catatan utamaindex, adalah posisi berbasis nol dari fragmen dalam gambar, data dan merupakan segmen dari teks JSON gambar yang dibagi UTF-8 pada batas karakter (nilai setiap fragmen data adalah string yang valid sendiri). UTF-8 Karena Aurora DSQL CDC menggunakan UNORDERED mode dan kunci partisi acak, fragmen dan catatan utama dapat tiba di pecahan yang berbeda dan dalam urutan apa pun. Untuk membaca semua fragmen, konsumsi semua pecahan pada aliran data Kinesis. Untuk informasi lebih lanjut tentang pemesanan pengiriman, lihatMemesan.

{ "type": "fragment", "chunk_id": "chunk-id", "index": 0, "data": "partial-JSON-text" }

Untuk memasang kembali gambar yang terlalu besar, buffer setiap rekaman dengan itu. type fragment chunk_id Ketika Anda menerima catatan utama dengan typechunked, tunggu sampai Anda memiliki total_fragments fragmen untuk setiap chunk_id direferensikan di bawah chunked.before atauchunked.after, urutkan fragmen dengan index naik, dan gabungkan string. data Hasil gabungan adalah asli before atau after objek sebagai teks JSON — menguraikannya untuk mengakses nilai kolom. Untuk memverifikasi integritas pengiriman, hitung CRC32C melalui string gabungan dan bandingkan hasilnya dengan atau. chunked.before.crc32c chunked.after.crc32c

Serialisasi tipe data

Tabel berikut menjelaskan bagaimana Aurora DSQL serialisasi setiap tipe data PostgreSQL dalam catatan CDC.

Jenis bilangan bulat

Jenis PostgreSQL Representasi JSON Contoh
smallint (int2) Nomor JSON 42
integer (int4) Nomor JSON 1001
bigint (int8) Nomor JSON 9223372036854775807
oid Nomor JSON (tidak ditandatangani) 16384

Nilai bigint di luar ±2^53 mungkin kehilangan presisi di lingkungan. JavaScript Gunakan BigInt atau pustaka presisi sewenang-wenang dalam kasus tersebut.

Floating-point jenis

Jenis PostgreSQL Representasi JSON Contoh Catatan
real (float4) Nomor JSON 3.14159 NaN dan ±Infinity diserialisasikan sebagai string"NaN",,. "Infinity" "-Infinity"
double precision (float8) Nomor JSON 3.141592653589793 Penanganan nilai khusus yang sama sepertireal.
numeric / decimal String JSON "123.45" Selalu string untuk mempertahankan presisi yang tepat. NaN dan ±Infinity diserialisasikan sebagai string"NaN",,. "Infinity" "-Infinity"

Boolean

Jenis PostgreSQL Representasi JSON Contoh
boolean Boolean JSON true atau false

Jenis karakter

Jenis PostgreSQL Representasi JSON Contoh
varchar / text String JSON "Hello, world!"
bpchar (char(n)) String JSON "ABC"(spasi belakang dilucuti)
name String JSON "pg_class"
"char"(byte tunggal) String JSON "A"

Biner

Jenis PostgreSQL Representasi JSON Contoh
bytea String JSON (Base64) "SGVsbG8gV29ybGQh"

Jenis data tanggal dan waktu

Jenis PostgreSQL Representasi JSON Contoh Catatan
date Nomor JSON (hari sejak zaman Unix) 19797 +infinitydan -infinity direpresentasikan sebagai hitungan hari penjaga yang berasal dari aritmatika epoch-offset. Nilai-nilai ini tidak sesuai dengan tanggal kalender yang bermakna.
time Nomor JSON (mikrodetik sejak tengah malam) 52200123456
timetz Nomor JSON (mikrodetik sejak tengah malam, UTC) 52200123456 Waktu lokal disesuaikan dengan UTC dengan menerapkan offset zona waktu yang disimpan (detik di sebelah barat UTC). Hasilnya dibungkus ke kisaran [0, 86400000000) mikrodetik.
timestamp Nomor JSON (mikrodetik sejak zaman Unix) 1710510600123456 ±Infinity memetakan nilai sentinel: 9223372036825200000 untuk dan untuk. +infinity -9223372036832400000 -infinity
timestamptz Nomor JSON (mikrodetik sejak zaman Unix) 1710510600123456 Disimpan dan dipancarkan dalam UTC. Nilai sentinel ±infinity yang sama dengan. timestamp
interval Nomor JSON (perkiraan total mikrodetik) 2802603000000 Bulan diperkirakan 30,4375 hari (2.629.800 detik). Total dihitung sebagai(months × 2,629,800 + days × 86,400) × 1,000,000 + microseconds. Jika hasilnya melebihi rentang bilangan bulat bertanda 64-bit (± 9.223.372.036.854.775.807 mikrodetik, kira-kira ± 292.271 tahun), Aurora DSQL memancarkan JSON untuk kolom. null

Jenis lainnya

Jenis PostgreSQL Representasi JSON Contoh
uuid String JSON (format hex standar 8-4-4-4-12) "550e8400-e29b-41d4-a716-446655440000"
oidvector Array kosong JSON []
json String JSON yang berisi teks JSON mentah "{\"key\": \"value\"}"

Nilai NULL

Untuk tipe data apa pun, nilai NULL kolom direpresentasikan sebagai JSONnull.

Evolusi skema dalam catatan CDC

Saat Anda memodifikasi skema tabel—misalnya, dengan menambahkan, menjatuhkan, atau mengganti nama kolom—catatan CDC mencerminkan perubahan yang dimulai dari transaksi yang melakukan perubahan DDL. Catatan dari transaksi yang dilakukan sebelum perubahan DDL menggunakan skema sebelumnya. Contoh:

  • Jika Anda menambahkan kolom, catatan dari transaksi sebelumnya tidak menyertakan kolom baru. Catatan dari transaksi penambahan dan seterusnya termasuk kolom baru.

  • Jika Anda menjatuhkan kolom, catatan dari transaksi yang jatuh dan seterusnya tidak lagi menyertakan kolom itu.

  • Jika Anda mengganti nama kolom, catatan dari transaksi penggantian nama selanjutnya menggunakan nama kolom baru.

Lacak perubahan skema di konsumen hilir Anda dengan memeriksa nama kolom yang ada di setiap rekaman dan bidang. after before source.versionBidang di setiap catatan mengidentifikasi format amplop CDC.