Résoudre les problèmes liés à un connecteur de source PostgreSQL

Cette section fournit des conseils de dépannage pour les problèmes courants rencontrés lors de l'utilisation d'un connecteur source Debezium PostgreSQL, y compris les types de connecteurs suivants :

Échec de la création de l'instantané

Si l'utilisateur ne dispose pas du droit USAGE sur le schéma de la table, le connecteur ne peut pas créer l'instantané initial et l'erreur suivante se produit :

Snapshotting of table SCHEMA.TABLE failed

Pour résoudre ce problème, utilisez la commande SQL GRANT pour accorder le droit USAGE sur le schéma :

GRANT USAGE ON SCHEMA SCHEMA_NAME TO ROLE_NAME;

Échec de la création de l'emplacement de réplication

Si vous créez plusieurs connecteurs pour le même serveur de base de données PostgreSQL, ils doivent utiliser des emplacements de réplication différents. Sinon, l'erreur suivante se produit :

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)

Vous pouvez également voir une erreur semblable à la suivante :

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.

Pour résoudre ce problème, définissez slot.name sur une valeur unique. Pour en savoir plus, consultez la section Configurer plusieurs connecteurs pour le même serveur de base de données dans la documentation Debezium.

Erreur lors de la création ou de la mise à jour de la publication

Un connecteur Debezium PostgreSQL lit les événements de modification à partir d'une publication dans la base de données. Si le connecteur ne peut pas accéder à la publication ni la créer, les erreurs listées dans les sections suivantes peuvent s'afficher dans les journaux du connecteur.

La publication n'existe pas

Si publication.autocreate.mode=disabled et que la publication n'existe pas, l'erreur suivante se produit :

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)

Pour résoudre cette erreur, créez la publication manuellement ou définissez publication.autocreate.mode sur all_tables ou filtered.

Impossible de mettre à jour la publication filtrée

Si publication.autocreate.mode=filtered et que le connecteur ne peut pas mettre à jour une publication existante, l'erreur suivante se produit :

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)

Pour résoudre ce problème, assurez-vous que l'utilisateur de la base de données est le propriétaire de la publication.

Impossible de créer une publication filtrée

Si publication.autocreate.mode=filtered et que le connecteur ne peut pas créer de publication, l'erreur suivante se produit :

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)

Pour résoudre ce problème, assurez-vous que l'utilisateur de la base de données dispose de l'autorisation CREATE sur la base de données et qu'il est le propriétaire des tables incluses.

Une publication pour toutes les tables est déjà active

Si publication.autocreate.mode=filtered et que la publication a déjà été créée avec FOR ALL TABLES, l'erreur suivante se produit :

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)

Cette erreur se produit, car le connecteur tente de modifier les tables d'une publication pour toutes les tables. Pour résoudre ce problème, supprimez la publication existante et redémarrez le connecteur. Vous pouvez également définir "publication.autocreate.mode" sur all_tables.

Vous devez être un super-utilisateur pour créer une publication FOR ALL TABLES

Si publication.autocreate.mode=all_tables et que le connecteur tente de créer une publication, l'erreur suivante peut se produire :

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)

Cette erreur se produit lorsque l'utilisateur de la base de données n'est pas un super-utilisateur (ou ne dispose pas du rôle cloudsqlsuperuser dans Cloud SQL), ce qui est nécessaire pour créer une publication avec FOR ALL TABLES. Pour résoudre cette erreur, procédez de l'une des manières suivantes :

  • Créez la publication manuellement.
  • Définissez publication.autocreate.mode sur une autre valeur.
  • Accordez SUPERUSER (ou cloudsqlsuperuser dans Cloud SQL) à l'utilisateur de la base de données. Toutefois, cette option n'est généralement pas recommandée, car ces rôles contournent les vérifications des autorisations dans la base de données.

Étape suivante