我尝试用spring boot和嵌入式debezium连接postgreSQL,DB连接正在建立,在表被锁定后,我被拒绝访问。我正在使用复制访问权限登录。请查找以下日志。
2020-09-15 20:27:00.806 INFO 14784 --- [pool-3-thread-1] i.d.c.postgresql.PostgresConnectorTask : user 'loginUser' connected to database 'pgDatabase' on PostgreSQL 12.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit with roles:
role 'loginUser' [superuser: false, replication: true, inherit: true, create role: false, create db: false, can log in: true]
2020-09-15 20:27:00.813 INFO 14784 --- [pool-3-thread-1] i.d.c.p.connection.PostgresConnection : Obtained valid replication slot ReplicationSlot [active=false, latestFlushedLsn=null, catalogXmin=null]
2020-09-15 20:27:00.813 INFO 14784 --- [pool-3-thread-1] i.d.c.postgresql.PostgresConnectorTask : Found previous offset PostgresOffsetContext [sourceInfoSchema=Schema{io.debezium.connector.postgresql.Source:STRUCT}, sourceInfo=source_info[server='pgServer.com-pgDatabase'db='pgDatabase', lsn=LSN{2/61010900}, txId=14082, timestamp=2020-09-10T01:04:03.660Z, snapshot=FALSE], partition={server=pgServer.com-pgDatabase}, lastSnapshotRecord=true, lastCompletelyProcessedLsn=null, lastCommitLsn=null, transactionContext=TransactionContext [currentTransactionId=null, perTableEventCount={}, totalEventCount=0]]
2020-09-15 20:27:00.814 INFO 14784 --- [pool-3-thread-1] i.d.c.p.snapshot.InitialSnapshotter : Previous snapshot has completed successfully, streaming logical changes from last known position
2020-09-15 20:27:00.871 DEBUG 14784 --- [ main] .m.m.a.ExceptionHandlerExceptionResolver : ControllerAdvice beans: 0 @ExceptionHandler, 1 ResponseBodyAdvice
2020-09-15 20:27:08.185 INFO 14784 --- [pool-3-thread-1] i.d.c.p.c.PostgresReplicationConnection : Initializing PgOutput logical decoder publication
2020-09-15 20:27:08.243 INFO 14784 --- [pool-3-thread-1] i.d.c.p.c.PostgresReplicationConnection : Creating new publication 'dbz_publication' for plugin 'PGOUTPUT'
2020-09-15 20:27:08.246 INFO 14784 --- [pool-3-thread-1] i.d.c.p.c.PostgresReplicationConnection : Creating Publication with statement 'CREATE PUBLICATION dbz_publication FOR ALL TABLES;'
2020-09-15 20:27:08.765 INFO 14784 --- [pool-3-thread-1] o.a.k.c.storage.FileOffsetBackingStore : Stopped FileOffsetBackingStore
2020-09-15 20:27:09.059 ERROR 14784 --- [pool-3-thread-1] io.debezium.embedded.EmbeddedEngine : Unable to initialize and start connector's task class 'io.debezium.connector.postgresql.PostgresConnectorTask' with config: {connector.class=io.debezium.connector.postgresql.PostgresConnector, database.user=loginUser, database.dbname=pgDatabase, offset.storage=org.apache.kafka.connect.storage.FileOffsetBackingStore, database.server.name=pgServer.com-pgDatabase, database.port=5432, plugin.name=pgoutput, table.whitelist=schema.tableName, offset.flush.interval.ms=10000, offset.storage.file.filename=/Users/loginUser/student-offset.dat, database.hostname=pgServer.com, database.password=********, name=student-postgres-connector}
io.debezium.jdbc.JdbcConnectionException: ERROR: permission denied for database pgDatabase
根据我的经验,需要(从v10.x开始的pgoutput插件(:
- 在数据库实例上启用逻辑复制
- 属于REPLICATION(或AWS rds的rds_REPLICATION-无服务器选项似乎已中断多年(角色的用户
- 成为所有白名单表的所有者(连接到DB的用户(
- 在所有白名单的表格和序列上使用USE、SELECT
- 访问USE、SELECT on";"公共";模式(元数据(
- 具有在"上创建对象的权限;"公共";架构
注意:如果上面的列表过于庞大,那么拥有rds_admin的要求不是一个要求,而是一个简单的入门方法。
请检查您的角色loginUser
:的权限
设置PostgreSQL服务器以运行Debezium连接器需要一个可以执行复制的数据库用户。复制只能由具有适当权限的数据库用户执行,并且只能针对配置数量的主机执行。