Memecahkan masalah konektor Sumber PostgreSQL

Bagian ini memberikan panduan pemecahan masalah untuk masalah umum yang terjadi saat menggunakan konektor Sumber PostgreSQL Debezium, termasuk jenis konektor berikut:

Pengambilan snapshot gagal

Jika pengguna tidak memiliki hak istimewa USAGE pada skema tabel, konektor tidak dapat membuat snapshot awal, dan error berikut akan terjadi:

Snapshotting of table SCHEMA.TABLE failed

Untuk mengatasi masalah ini, gunakan perintah SQL GRANT untuk memberikan hak istimewa USAGE pada skema:

GRANT USAGE ON SCHEMA SCHEMA_NAME TO ROLE_NAME;

Pembuatan slot replikasi gagal

Jika Anda membuat beberapa konektor untuk server database PostgreSQL yang sama, konektor harus menggunakan slot replikasi yang berbeda. Jika tidak, error berikut akan terjadi:

io.debezium.DebeziumException: Creation of replication slot failed; when setting up multiple connectors
for the same database host, please make sure to use a distinct replication slot name for each.
    at io.debezium.connector.postgresql.PostgresConnectorTask.tryToCreateSlot(PostgresConnectorTask.java:282)

Anda juga mungkin melihat error seperti berikut:

io.debezium.DebeziumException: Failed to start replication stream at LSN{0/80002808}; when setting
up multiple connectors for the same database host, please make sure to use a distinct replication
slot name for each.

Untuk mengatasi masalah ini, tetapkan slot.name ke nilai unik. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan beberapa konektor untuk server database yang sama dalam dokumentasi Debezium.

Terjadi error saat membuat atau memperbarui publikasi

Konektor PostgreSQL Debezium membaca peristiwa perubahan dari publikasi dalam database. Jika konektor tidak dapat mengakses atau membuat publikasi, error yang tercantum di bagian berikut mungkin muncul di log konektor.

Publikasi tidak ada

Jika publication.autocreate.mode=disabled dan publikasi tidak ada, error berikut akan terjadi:

org.apache.kafka.connect.errors.ConnectException: Publication PUBLICATION autocreation is disabled, please
create one and restart the connector.
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initPublication(PostgresReplicationConnection.java:163)

Untuk mengatasi error ini, buat publikasi secara manual atau tetapkan publication.autocreate.mode ke all_tables atau filtered.

Tidak dapat memperbarui publikasi yang difilter

Jika publication.autocreate.mode=filtered dan konektor tidak dapat memperbarui publikasi yang ada, error berikut akan terjadi:

org.apache.kafka.connect.errors.ConnectException: Unable to update filtered publication PUBLICATION for
"SCHEMA"."TABLE"
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.createOrUpdatePublicationModeFilterted(PostgresReplicationConnection.java:227)
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initPublication(PostgresReplicationConnection.java:191)

Untuk mengatasi masalah ini, pastikan pengguna database adalah pemilik publikasi.

Tidak dapat membuat publikasi yang difilter

Jika publication.autocreate.mode=filtered dan konektor tidak dapat membuat publikasi baru, error berikut akan terjadi:

org.apache.kafka.connect.errors.ConnectException: Unable to create filtered publication PUBLICATION for
"SCHEMA"."TABLE"
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.createOrUpdatePublicationModeFilterted(PostgresReplicationConnection.java:227)
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initPublication(PostgresReplicationConnection.java:171)

Untuk mengatasi masalah ini, pastikan pengguna database memiliki izin CREATE di database dan merupakan pemilik tabel yang disertakan.

Publikasi untuk semua tabel sudah aktif

Jika publication.autocreate.mode=filtered dan publikasi sudah dibuat dengan FOR ALL TABLES, error berikut akan terjadi:

io.debezium.DebeziumException: A logical publication for all tables named 'PUBLICATION' for plugin
'PGOUTPUT' and database 'DATABASE' is already active on the server and can not be altered. If you need to
exclude some tables or include only specific subset, please recreate the publication with necessary
configuration or let plugin recreate it by dropping existing publication. Otherwise please change the
'publication.autocreate.mode' property to 'all_tables'.
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initPublication(PostgresReplicationConnection.java:181)

Error ini terjadi karena konektor mencoba mengubah tabel dalam publikasi untuk semua tabel. Untuk mengatasi masalah ini, batalkan publikasi yang ada dan mulai ulang konektor. Atau, perbarui 'publication.autocreate.mode' ke all_tables.

Harus menjadi pengguna super untuk membuat publikasi FOR ALL TABLES

Jika publication.autocreate.mode=all_tables dan konektor mencoba membuat publikasi baru, error berikut mungkin terjadi:

io.debezium.jdbc.JdbcConnectionException: ERROR: must be superuser to create FOR ALL TABLES publication
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection.initPublication(PostgresReplicationConnection.java:207)

Error ini terjadi saat pengguna database bukan superuser (atau tidak memiliki peran cloudsqlsuperuser di Cloud SQL), yang diperlukan untuk membuat publikasi dengan FOR ALL TABLES. Untuk mengatasi error ini, lakukan salah satu tindakan berikut:

  • Buat publikasi secara manual.
  • Perbarui publication.autocreate.mode ke nilai lain.
  • Berikan SUPERUSER (atau cloudsqlsuperuser di Cloud SQL) kepada pengguna database. Namun, opsi ini umumnya tidak direkomendasikan karena peran ini melewati pemeriksaan izin dalam database.

Langkah berikutnya