[Trino/MySQL] - Table does not exist 에러 해결
현상
아래와 같이 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를 통해 데이터를 조회했을 때와 동일한 에러가 발생했다.
해결 방법
해결 방법은 크게 두 가지 방법을 있을 것 같다.
- MySQL 서버의 테이블 대소문자 구분 설정 변경
- 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://trino.io/docs/current/connector/mysql.html#general-configuration-properties