채널톡 아이콘

인프런 커뮤니티 질문&답변

logt님의 프로필 이미지

작성한 질문수 21

카프카 완벽 가이드 - 커넥트(Connect) 편

MySQL과 PostgreSQL 연동 실습 - 02

자문자답: JDBC Sink Connector가 PostgreSQL의 Schema를 바라보지 않습니다.

해결된 질문

작성

·

142

·

수정됨

0

2025-02-24 추가) 해당 문제는 psql session 로그인 시도에서 database만 잘 접근하면 문제 없습니다. 강의대로 따라가시면 됩니다.

psql -h localhost -U connect_dev -d ${database_name}

p.s.) MySQL과 달리, PostgreSQL은 생각한 대로 JDBC Sink Config에서 connection.url의 첫 번째 파라미터를 데이터베이스 그대로 읽고, table.name.format 옵션에서 구분자.을 가지고 스키마와 테이블을 제대로 구분하네요. 제가 인지하지 못한 부분이 있다면 다음 사람을 위해서 댓글 남겨주시면 감사하겠습니다.


안녕하세요 선생님.

 

이전에 MySQL Sink Config 파일에서 table.name.format 설정하는데 있어서, 데이터베이스 스키마를 바라보지 현상이 발생하여 질문 게시판에 자문자답을 남긴 적이 있습니다.

 

해당 PostgreSQL도 마찬가지로 JDBC Sink Connector가 해당 search_path를 제대로 읽어오지 못하고 에러가 발생하는 것을 확인했습니다. (모든 프로그램 버전은 강의와 동일합니다.)

 

PostgreSQL도 실습하며 명확해졌네요. DBMS마다 관련 데이터베이스를 자동으로 연결해주는 기능(auto-creation)이 제대로 동작하지 않는 JDBC Sink Connector의 내부적인 문제 같습니다.

 

또한, 아직 kafka-connect-jdbc/issues/246 이슈가 close되지 않은 것으로 확인했습니다. 다른 해결 방안이 있어서 몇 년이 지나도 내부적으로 수정해주지 않는 것 같습니다...


Error log

image.png

 

기존 postgres_jdbc_ops_sink_customers_avro_01.json

{
    "name": "postgres_jdbc_ops_sink_customers_avro_01",
    "config": {
        "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
        "tasks.max": "1",
        "topics": "mysqlavro-ops-customers",
        "connection.url": "jdbc:postgresql://localhost:5432/postgres",
        "connection.user": "connect_dev",
        "connection.password": "1234",
        "table.name.format": "ops_sink.customers_sink"

혹여 같은 현상이 발생하신다면, 마찬가지로 connection url에 직접적인 schema 설정으로 문제를 해결할 수 있습니다.

 

Solved

jdbc:postgresql://<host>:<port5432>/<database>?options=-c%20search_path=myschema,anotherschema
image.png

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

좋은 정보 주셔서 감사합니다.

음, 그리고 제가 다시 확인해 봤지만, 강의 실습환경에서는 제대로 동작하고 있습니다.

하지만, 그럼에도 오류가 발생하신 분들에게는 좋은 해결책이 될 것 같습니다.

언제나 좋은 정보 공유해 주셔서 감사합니다.

logt님의 프로필 이미지
logt
질문자

안녕하세요 선생님.

PostgreSQL은 table.name.format 에서 스키마을 추가해도 정상 동작하네요. MySQL이 안됐으니까 PostgreSQL도 되지 않을 것이라는 저의 막연한 생각이 문제였습니다. 😅

 

앞에서 MySQL로만 실습하다가 PostgreSQL로 넘어와서 그런가 MySQL의 데이터베이스와 PostgreSQL의 데이터베이스 스키마와 혼동이 있었던 것 같습니다.

 

애초에 PostgreSQL 강의에서는 public 스키마로만 진행하기에 아래의 코드로만 database에 접근만 잘하면 /etc/postgresql/12/main/postgresql.confdefault search_path 대로, 기본 스키마인 public이 설정되기에 발생하지 않을 문제였습니다.

psql -h localhost -U connect_dev -d ${database_name}

어서 완강하고 마지막 챕터로 넘어가겠습니다 ㅋㅋ..