Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

如何在 Docker 中设置 ClickHouse,并通过 ODBC 连接到 Microsoft SQL Server (MSSQL) 数据库

问题

如何使用 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 数据库和表结构

MSSQL 登录用户 sql_user

MSSQL 登录用户配置

sql_user 的数据库成员身份角色:

MSSQL 数据库成员身份角色

具有登录名的数据库用户:

具有登录名的 MSSQL 数据库用户

使用 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

添加以下条目 (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

配置 Dockerfile 以拉取镜像并添加 TDS 及所需的 ODBC 库

创建 Dockerfile:

vim Dockerfile

在 Dockerfile 中添加以下内容:

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.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 表函数对远程 MSSQL 数据库中的表执行 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. 

更多信息请参见:

Navigation