🦔

Trino を使って Amazon RDS MySQL とTiDB Serverless のテーブルをJoinした横断クエリを実行する

に公開

少し前にTrinoを使ってAmazon RDS MySQLへクエリの実行を行える環境を作成しました。
https://zenn.dev/kameoncloud/articles/23881427e257af

今日はさらに追加でTiDB Serverlessとの接続を行い、Amazon RDS MySQLとTiDB Serverlessのテーブルをjoinしてクエリを実行する環境を作成します。

さっそくやってみる

0-1. 環境準備 その1

https://zenn.dev/kameoncloud/articles/23881427e257af
を終わらせておきます。t2.microだと厳しいようでt2.mediumを使いました。

0-2. 環境準備その2 TiDB Serverless の起動とデータ投入

https://zenn.dev/kameoncloud/articles/e81735bb6bbdac
を参考にTiDB Serverlessを起動させ接続情報を手元にメモしておきます。その後テスト用スキーマなどを作成します。

CREATE DATABASE IF NOT EXISTS my_new_schema;

USE my_new_schema;

CREATE TABLE user_scores (
    user_id INT PRIMARY KEY,
    score INT
);

INSERT INTO user_scores (user_id, score)
VALUES
    (1, 88),
    (2, 92),
    (3, 75);

1. Trinoの用Properties ファイルの作成 と TiDB クラスターの設定変更

./trino/etc/catalog/ にmysql用プロパティファイルが存在していますのでそちらをコピーします。

cp mysql.properties tidb.properties

TiDBはMySQL互換として接続しますが、ポート番号は4000となりますので注意しながら修正します。

サンプル
connector.name=mysql
connection-url=jdbc:mysql://gateway01.region.prod.aws.tidbcloud.com:4000
connection-user=xxxxx.root
connection-password=yyyyyy

その後Trinoを再起動します。

sudo docker stop trino
sudo docker rm trino
sudo docker run -d -p 8080:8080 --name trino \
  -v ~/trino/etc/catalog:/etc/trino/catalog \
  trinodb/trino

次にTiDB マネージメントコンソールのSQL Editorで以下を実行しておきます。

SET GLOBAL tidb_enable_noop_functions = 1;

TrinoはTiDBをMySQLとして認識していますが、TiDBとMySQLには一部差異があります。今回の例でいえばクエリはREAD ONLYを含んで発行されますがそれに対応していないため明示的に無視を行う必要があります。
noopとはno operationの略であり、READ ONLYはダミーとして受け付けて何もしない、という指示をTiDBに与えておく必要があります。

2. 2つのテーブルのJoin実行


SELECT 
    m.id, m.name, t.score
FROM 
    mysql.my_new_schema.users m
JOIN 
    tidb.my_new_schema.user_scores t
ON 
    m.id = t.user_id;

id | name | score
----+---------------+-------
1 | John Doe | 88
2 | Jane Smith | 92
3 | Alice Johnson | 75
(3 rows)
無事クエリが実行されました!

Discussion