質問
Docker イメージを使って ClickHouse をセットアップし、Microsoft SQL Server に接続するにはどうすればよいですか?
回答
この例に関する注意
- ClickHouse Docker Ubuntu イメージを使用します
- FreeTDS ドライバーを使用します
- MSSQL Server 2012R2 を使用します
- この例で使用する Windows のホスト名は
MARSDB2.marsnet2.local、IP アドレスは192.168.1.133です (ご使用のホスト名や IP アドレスに合わせて更新してください) - MSSQL インスタンス名は
MARSDB2です - MSSQL のログインユーザーおよびデータベースユーザーは
sql_userです
テスト用のMSSQL設定例
MSSQL で作成したデータベースとテーブル:

MSSQL のログインユーザー sql_user:

sql_user のデータベース メンバーシップ ロール:

ログインに関連付けられたデータベースユーザー:

ODBC を使用した ClickHouse の設定
作業ディレクトリを作成します。
mkdir ch-odbc-mssql
cd ch-odbc-mssqlodbc.ini ファイルを作成します。
vim odbc.iniDSN 名と IP を更新するには、以下のエントリを追加します。
[marsdb2_mssql]
Driver = FreeTDS
Server = 192.168.1.133odbcinst.ini ファイルを作成します。
vim odbcinst.ini以下のエントリを追加してください (trace は任意ですが、デバッグに役立ちます) :
[ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log
[FreeTDS]
Description = FreeTDS
Driver = /usr/lib/aarch64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1イメージをダウンロードし、TDS と必要な ODBC ライブラリを追加するよう Dockerfile を設定する
Dockerfile を作成します。
vim DockerfileDockerfileの内容を追記します:
FROM clickhouse/clickhouse-server:23.10
# ODBC ドライバをインストールする
RUN apt-get update && apt-get install -y --no-install-recommends unixodbc \
&& apt-get install -y freetds-bin freetds-common freetds-dev libct4 libsybdb5 \
&& apt-get install tdsodbc新しいDockerイメージをビルドします:
docker build . -t marsnet/clickhouse-odbc:23.10docker-compose.yml ファイルを作成します。
vim docker-compose.ymlYAML に以下の内容を追加します。
version: '3.7'
services:
clickhouse:
image: marsnet/clickhouse-odbc:23.10
container_name: clickhouse-odbc
hostname: clickhouse-host
ports:
- "9000:9000"
- "8123:8123"
- "9009:9009"
volumes:
- ./odbc.ini:/etc/odbc.ini
- ./odbcinst.ini:/etc/odbcinst.ini
restart: always
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 262144
hard: 262144
deploy:
resources:
limits:
memory: 4gコンテナを起動します:
docker compose up --detachコンテナを起動すると、次のように表示されるはずです。
ch-odbc-mssql % docker compose up --detach
[+] Running 1/1
✔ Container clickhouse-odbc Startedコンテナが起動していることを確認します。
ch-odbc-mssql % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87a400b803ce marsnet/clickhouse-odbc:23.10 "/entrypoint.sh" 57 minutes ago Up About a minute 0.0.0.0:8123->8123/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:9009->9009/tcp clickhouse-odbcODBC 接続をテストする
ClickHouse clientでログインします:
./clickhouse clientリモートの MSSQL データベーステーブルに対して、odbc テーブル関数を使用した SELECT をテストします。
clickhouse-host :) SELECT * from odbc('DSN=marsdb2_mssql;port=1433;Uid=sql_user;Pwd=ClickHouse123;Database=db1', 'table1');
SELECT *
FROM odbc('DSN=marsdb2_mssql;port=1433;Uid=sql_user;Pwd=ClickHouse123;Database=db1', 'table1')
Query id: 23494da2-6e12-4ade-95fa-372a0420cac1
┌─id─┬─column1─┐
│ 1 │ abc │
│ 2 │ def │
│ 3 │ ghi │
└────┴─────────┘
3 rows in set. Elapsed: 0.188 sec. odbc テーブルエンジンを使用して、リモートテーブルを作成することもできます:
CREATE TABLE table1_odbc_mssql
(
`id` Int32,
`column1` String
)
ENGINE = ODBC('DSN=marsdb2_mssql;port=1433;Uid=sql_user;Pwd=ClickHouse123;Database=db1', 'dbo', 'table1')新しいリモートテーブルをテストするには、SELECTクエリを使用します:
clickhouse-host :) select * from table1_odbc_mssql;
SELECT *
FROM table1_odbc_mssql
Query id: 94724368-485d-4364-ae58-a435a225c37d
┌─id─┬─column1─┐
│ 1 │ abc │
│ 2 │ def │
│ 3 │ ghi │
└────┴─────────┘
3 rows in set. Elapsed: 0.218 sec. 詳細については、以下をご覧ください。