Topik ini menjelaskan plug-in wal2json di PolarDB for PostgreSQL (Kompatibel dengan Oracle), yang digunakan untuk mengonversi file log logis ke dalam format JSON.
Prasyarat
Ekstensi ini didukung pada kluster PolarDB for PostgreSQL (Kompatibel dengan Oracle) yang menjalankan mesin berikut:
PolarDB for PostgreSQL (Kompatibel dengan Oracle) 2.0 (versi revisi 2.0.14.5.1.0 atau lebih baru).
Anda dapat melihat versi revisi di konsol atau mengeksekusi pernyataan SHOW polardb_version; untuk memeriksa versi revisi. Jika Anda perlu meningkatkan versi revisi, lihat Perbarui versi.
Informasi latar belakang
wal2json adalah plug-in decoding logis yang menyediakan fitur-fitur berikut:
Mengakses tupel yang dihasilkan melalui pernyataan
INSERTdanUPDATE.Mengakses versi baris lama dari
UPDATEdanDELETEtergantung pada identitas duplikat yang ditentukan.Mengonsumsi perubahan menggunakan protokol streaming (slot replikasi logis) atau API SQL khusus.
Plug-in wal2json menghasilkan objek JSON untuk setiap transaksi. Semua tupel baru dan lama tersedia dalam objek JSON. Selain itu, opsi mencakup properti seperti timestamp transaksi, skema-qualified, tipe data, dan ID transaksi. Untuk informasi lebih lanjut, lihat Eksekusi Pernyataan SQL untuk Mendapatkan Objek JSON.
Peringatan
Karena menggunakan metode replikasi
REPLICA_IDENTITY_FULL, seluruh baris data ditampilkan selama operasi UPDATE dan DELETE, bukan hanya kolom sebelum dan sesudah UPDATE dan DELETE. Untuk memodifikasi hanya kolom sebelum dan sesudah UPDATE, atur parameterpolar_create_table_with_full_replica_identitymenjadi off. Parameter ini tidak dapat dimodifikasi di konsol. Anda harus Hubungi Kami untuk memodifikasi parameter tersebut.Plug-in wal2json memerlukan pengkodean dan dekoding logis. Ubah parameter
wal_levelmenjadilogical.CatatanParameter ini dapat dimodifikasi di konsol. Untuk informasi lebih lanjut, lihat Konfigurasikan Parameter Kluster. Kluster akan restart setelah Anda memodifikasi parameter. Lanjutkan dengan hati-hati.
Eksekusi pernyataan SQL untuk mendapatkan objek JSON
Anda tidak perlu mengeksekusi pernyataan create extension untuk membuat plug-in wal2json. Anda dapat membuat slot salinan logis untuk memuat plug-in wal2json.
Setelah Anda membuat slot replikasi logis yang berisi plug-in wal2json, eksekusi pernyataan berikut untuk mendapatkan objek JSON di WAL:
-- Buat tabel dengan dan tanpa primary key.
CREATE TABLE table2_with_pk (a SERIAL, b VARCHAR(30), c TIMESTAMP NOT NULL, PRIMARY KEY(a, c));
CREATE TABLE table2_without_pk (a SERIAL, b NUMERIC(5,2), c TEXT);
-- Buat slot replikasi logis bertipe wal2json.
SELECT 'init' FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
-- Commit transaksi dan tulis ke WAL.
BEGIN;
INSERT INTO table2_with_pk (b, c) VALUES('Backup and Restore', now());
INSERT INTO table2_with_pk (b, c) VALUES('Tuning', now());
INSERT INTO table2_with_pk (b, c) VALUES('Replication', now());
DELETE FROM table2_with_pk WHERE a < 3;
INSERT INTO table2_without_pk (b, c) VALUES(2.34, 'Tapir');
UPDATE table2_without_pk SET c = 'Anta' WHERE c = 'Tapir';
COMMIT;
-- Dapatkan objek JSON di WAL.
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');Contoh hasil:
{
"change": [
{
"kind": "insert",
"schema": "public",
"table": "table2_with_pk",
"columnnames": ["a", "b", "c"],
"columntypes": ["integer", "character varying(30)", "timestamp without time zone"],
"columnvalues": [1, "Backup and Restore", "2018-03-27 12:05:29.914496"]
}
,{
"kind": "insert",
"schema": "public",
"table": "table2_with_pk",
"columnnames": ["a", "b", "c"],
"columntypes": ["integer", "character varying(30)", "timestamp without time zone"],
"columnvalues": [2, "Tuning", "2018-03-27 12:05:29.914496"]
}
,{
"kind": "insert",
"schema": "public",
"table": "table2_with_pk",
"columnnames": ["a", "b", "c"],
"columntypes": ["integer", "character varying(30)", "timestamp without time zone"],
"columnvalues": [3, "Replication", "2018-03-27 12:05:29.914496"]
}
,{
"kind": "delete",
"schema": "public",
"table": "table2_with_pk",
"oldkeys": {
"keynames": ["a", "c"],
"keytypes": ["integer", "timestamp without time zone"],
"keyvalues": [1, "2018-03-27 12:05:29.914496"]
}
}
,{
"kind": "delete",
"schema": "public",
"table": "table2_with_pk",
"oldkeys": {
"keynames": ["a", "c"],
"keytypes": ["integer", "timestamp without time zone"],
"keyvalues": [2, "2018-03-27 12:05:29.914496"]
}
}
,{
"kind": "insert",
"schema": "public",
"table": "table2_without_pk",
"columnnames": ["a", "b", "c"],
"columntypes": ["integer", "numeric(5,2)", "text"],
"columnvalues": [1, 2.34, "Tapir"]
}
]
}Hapus slot replikasi test_slot dan kembalikan string 'stop'.
SELECT 'stop' FROM pg_drop_replication_slot('test_slot');Parameter
Tabel berikut menjelaskan parameter yang terkait dengan wal2json.
Parameter | Deskripsi |
change | Entri WAL untuk setiap DML, seperti catatan WAL untuk INSERT, UPDATE, DELETE, dan TRUNCATE. |
changeset | Sekumpulan beberapa perubahan. |
include-xids | Menentukan apakah akan menambahkan xid ke setiap changeset. Nilai default: false. Nilai valid:
|
include-timestamp | Menentukan apakah akan menambahkan timestamp ke setiap changeset. Nilai default: false. Nilai valid:
|
include-schemas | Menentukan apakah akan menambahkan skema ke setiap perubahan. Nilai default: true. Nilai valid:
|
include-types | Menentukan apakah akan menambahkan tipe ke setiap perubahan. Nilai default: true. Nilai valid:
|
include-typmod | Menentukan apakah akan menambahkan modifier ke tipe yang memilikinya (seperti varchar(20) daripada varchar). Nilai default: true. Nilai valid:
|
include-type-oids | Menentukan apakah akan menambahkan oids tipe. Nilai default: false. Nilai valid:
|
include-not-null | Menentukan apakah akan menambahkan informasi
|
pretty-print | Menentukan apakah akan menambahkan spasi dan indentasi ke struktur JSON untuk pemformatan. Nilai default: false. Nilai valid:
|
write-in-chunks | Menentukan apakah akan menulis setelah setiap perubahan alih-alih setiap changeset. Nilai default: false. Nilai valid:
|
include-lsn | Menentukan apakah akan menambahkan nextlsn ke setiap changeset. Nilai default: false. Nilai valid:
|
filter-tables | Mengecualikan baris dari tabel yang ditentukan. Secara default, parameter ini kosong, yang menunjukkan bahwa tidak ada tabel yang dikecualikan. Catatan
|
add-tables | Hanya menyertakan baris dari tabel yang ditentukan. Secara default, semua tabel dari semua skema dianalisis. Untuk informasi lebih lanjut, lihat filter-tables. |
filter-msg-prefixes | Mengecualikan baris dengan awalan yang ditentukan. Parameter ini biasanya digunakan dalam fungsi |
add-msg-prefixes | Menyertakan baris dengan awalan yang ditentukan. Parameter ini biasanya digunakan dalam fungsi |
format-version | Menentukan format keluaran mana yang digunakan. Nilai default: 1. Nilai valid:
|
actions | Menentukan operasi mana yang dikirim. Secara default, semua operasi termasuk INSERT, UPDATE, DELETE, dan TRUNCATE dikirim. Jika |
Contoh
include-xids digunakan dalam contoh berikut.
Buat tabel dan slot replikasi logis. Masukkan satu baris data.
DROP TABLE IF EXISTS tbl; CREATE TABLE tbl (id int); SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'wal2json'); INSERT INTO tbl VALUES (1);Masukkan parameter dan nilai dalam fungsi.
SELECT count(*) = 1, count(distinct ((data::json)->'xid')::text) = 1 FROM pg_logical_slot_get_changes( 'regression_slot', NULL, NULL, 'format-version', '1', 'include-xids', '1');
Cara kerjanya
Untuk informasi lebih lanjut, lihat Dokumentasi Resmi.