跳至主要内容

如何在 Docker 上使用 ODBC 将 ClickHouse 连接到 Microsoft SQL Server (MSSQL) 数据库

·阅读时间 3 分钟

问题

如何使用 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 中创建的数据库和表

Screenshot 2024-01-01 at 8 25 50 PM

MSSQL 登录用户 sql_user

Screenshot 2024-01-01 at 8 27 11 PM

sql_user 的数据库成员资格角色

Screenshot 2024-01-01 at 8 27 35 PM

具有登录的数据库用户

Screenshot 2024-01-01 at 8 35 34 PM

使用 ODBC 配置 ClickHouse

创建一个工作目录

mkdir ch-odbc-mssql
cd ch-odbc-mssql

创建一个 odbc.ini 文件

vim odbc.ini

添加以下条目以更新 DSN 和 IP 的名称

[marsdb2_mssql]
Driver = FreeTDS
Server = 192.168.1.133

创建一个 odbcinst.ini 文件

vim odbcinst.ini

添加以下条目(跟踪是可选的,但有助于调试)

[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

配置一个 Dockerfile 以下载镜像并添加 TDS 和所需的 ODBC 库

创建 Dockerfile

vim Dockerfile

添加 Dockerfile 的内容

FROM clickhouse/clickhouse-server:23.10

# Install the ODBC driver

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.10

创建一个 docker-compose.yml 文件

vim docker-compose.yml

将以下内容添加到 YAML

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-odbc

测试 ODBC 连接

使用 ClickHouse 客户端登录

./clickhouse client

使用 odbc 表函数测试 SELECT 到远程 MSSQL 数据库表的查询

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.

有关更多信息,请参阅