Trino

[Trino/MySQL] - Table does not exist 에러 해결

비번변경 2023. 3. 24. 19:30

현상

아래와 같이 MySQL 커넥터를 이용해 Trino에 카탈로그를 생성하고 데이터가 정상적으로 인식되는지 확인해 보았다.

# $TRINO_HOME/etc/catalog/<mysql-catalog>.properties

connector.name=mysql
connection-url=jdbc:mysql://<SERVER>:<PORT>
connection-user=<USERNAME>
connection-password=<PASSWD>

카탈로그, 스키마, 테이블 목록까지 전부 정상적으로 인식되었는데,

테이블 내에 있는 데이터를 조회하면 아래와 같이 테이블을 찾을 수 없다는 에러가 발생했다.

 

 

접속 정보 및 권한 확인

서버에서 Trino가 아니라 MySQL Client를 이용해 카탈로그 생성에 이용한 MySQL 접속 정보를 점검한다.

 

접속

mysql -h <SERVER> -P <PORT> -u <계정명> -p

# 예시
mysql -h ip-172-31-17-00.ap-northeast-2.compute.internal -P 3306 -u hms -p

 

데이터 조회

use hmsdb;
SELECT * FROM CTLGS;

아주 정상적이었다…….

하지만 눈썰미가 좋은 사람은 Trino로 인식된 테이블명이 CTLGS가 아니라 ctlgs라는 것을 보았을 것이다. Linux에서 MySQL은 기본적으로 테이블 대소문자를 구분한다. (Windows에서는 비구분이 기본값이라고 한다.)

테이블명을 소문자로 변경해서 다시 확인한다.

use hmsdb;
SELECT * FROM ctlgs;

Trino를 통해 데이터를 조회했을 때와 동일한 에러가 발생했다.

 

 

해결 방법

해결 방법은 크게 두 가지 방법을 있을 것 같다.

 

  1. MySQL 서버의 테이블 대소문자 구분 설정 변경
  2. Trino MySQL-connector 구성 카탈로그의 테이블 대소문자 구분 설정 변경

이 글에서는 변경에 대한 영향이 적은 방향인 2번을 채택하여 해결하도록 한다.

MySQL 커넥터 구성 설정 중 대소문자 구분과 관련된 설정은 case-insensitive-name-matching로, 기본값은 False이다. MySQL 커넥터를 구성한 카탈로그에 이 설정을 True로 지정한다.

# $TRINO_HOME/etc/catalog/<mysql-catalog>.properties

connector.name=mysql
connection-url=jdbc:mysql://<SERVER>:<PORT>
connection-user=<USERNAME>
connection-password=<PASSWD>
case-insensitive-name-matching=True

설정 저장 후 트리노 서버를 재시작한다.

 

서버 재시작

$TRINO_HOME/bin/launcher restart

 

 

확인

대소문자 구분 설정 변경 후 정상적으로 데이터를 조회할 수 있는지 다시 확인한다.

 

트리노 서버 접속

trino --server localhost:8080

 

결과

이제 정상적으로 동작하는 것을 확인할 수 있다.

 

 

참고 문서

https://stackoverflow.com/questions/65620296/presto-show-tables-shows-a-nonexistent-table-due-to-case-sensitivity-with-mysqld

https://trino.io/docs/current/connector/mysql.html#general-configuration-properties

 

728x90