问题描述
我尝试将postgresql与spring boot和嵌入式debezium连接,建立了数据库连接,在表被锁定后,我拒绝访问。我使用复制访问权限登录。请找到以下日志。
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
解决方法
请检查loginUser
中的角色permissions:
,设置PostgreSQL服务器以运行Debezium连接器要求数据库用户可以执行复制。复制只能由具有适当权限的数据库用户执行,并且只能对配置的主机数量执行。
根据我的经验,需要(从 v10.x 开始使用 pgoutput 插件):
- 在数据库实例上启用逻辑复制;
- 属于 REPLICATION(或 AWS RDS 的 rds_replication - 无服务器选项似乎已被破坏多年)角色的用户;
- 成为所有白名单表的所有者(连接到数据库的用户);
- 对所有列入白名单的表和序列进行 USE、SELECT;
- 有权访问“公共”架构(元数据);
- 有权在“公共”架构上创建对象。
注意:如果上面的列表太多,拥有 rds_admin 的要求不是一项要求,而是一种简单的入门方法。