All Products
Search
Document Center

PolarDB:wal2json

Last Updated:Jul 03, 2025

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).

Catatan

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 INSERT dan UPDATE.

  • Mengakses versi baris lama dari UPDATE dan DELETE tergantung 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 parameter polar_create_table_with_full_replica_identity menjadi 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_level menjadi logical.

    Catatan

    Parameter 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:

  • true

  • false

include-timestamp

Menentukan apakah akan menambahkan timestamp ke setiap changeset. Nilai default: false. Nilai valid:

  • true

  • false

include-schemas

Menentukan apakah akan menambahkan skema ke setiap perubahan. Nilai default: true. Nilai valid:

  • true

  • false

include-types

Menentukan apakah akan menambahkan tipe ke setiap perubahan. Nilai default: true. Nilai valid:

  • true

  • false

include-typmod

Menentukan apakah akan menambahkan modifier ke tipe yang memilikinya (seperti varchar(20) daripada varchar). Nilai default: true. Nilai valid:

  • true

  • false

include-type-oids

Menentukan apakah akan menambahkan oids tipe. Nilai default: false. Nilai valid:

  • true

  • false

include-not-null

Menentukan apakah akan menambahkan informasi not null sebagai columnoptionals. Nilai default: false. Nilai valid:

  • true

  • false

pretty-print

Menentukan apakah akan menambahkan spasi dan indentasi ke struktur JSON untuk pemformatan. Nilai default: false. Nilai valid:

  • true

  • false

write-in-chunks

Menentukan apakah akan menulis setelah setiap perubahan alih-alih setiap changeset. Nilai default: false. Nilai valid:

  • true

  • false

include-lsn

Menentukan apakah akan menambahkan nextlsn ke setiap changeset. Nilai default: false. Nilai valid:

  • true

  • false

filter-tables

Mengecualikan baris dari tabel yang ditentukan. Secara default, parameter ini kosong, yang menunjukkan bahwa tidak ada tabel yang dikecualikan.

Catatan
  • Pisahkan beberapa tabel dengan koma (,). Anda harus menentukan skema untuk setiap tabel.

  • *.foo menunjukkan tabel foo di semua skema, sedangkan bar.* menunjukkan semua tabel di skema bar.

  • Karakter khusus (spasi, tanda kutip tunggal, koma, titik, asterisk) harus diloloskan dengan backslash (\).

  • Skema dan tabel bersifat case-sensitive.

  • Tabel Foo bar di skema public harus ditentukan sebagai public.Foo\bar.

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 pg_logical_slot_peek_changes(). Secara default, parameter ini kosong, yang menunjukkan bahwa tidak ada baris yang dikecualikan. Pisahkan beberapa awalan dengan koma (,).

add-msg-prefixes

Menyertakan baris dengan awalan yang ditentukan. Parameter ini biasanya digunakan dalam fungsi pg_logical_slot_peek_changes(). Secara default, semua awalan dipilih. Pisahkan beberapa awalan dengan koma (,). Anda harus menggunakan filter-msg-prefixes sebelum parameter ini.

format-version

Menentukan format keluaran mana yang digunakan. Nilai default: 1. Nilai valid:

  • 1: menggunakan format versi 1.

  • 2: menggunakan format versi 2.

actions

Menentukan operasi mana yang dikirim. Secara default, semua operasi termasuk INSERT, UPDATE, DELETE, dan TRUNCATE dikirim. Jika format version 1 digunakan, operasi TRUNCATE tidak dikirim.

Contoh

include-xids digunakan dalam contoh berikut.

  1. 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);
                            
  2. 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.