> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> 将数据从 SQL Server 流式传输到 ClickHouse，实现快速分析

# 将数据从 SQL Server 流式传输到 ClickHouse，实现快速分析：分步指南

export const Image = ({img, alt, size = "lg"}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} />
      </Frame>
    </div>;
};

本文将拆解一个教程，向你展示如何将数据从 SQL Server 流式传输到 ClickHouse。如果你希望为内部或面向客户的仪表盘提供超高速分析，ClickHouse 是理想之选。我们会一步步带你完成这两个数据库的设置、连接方式，以及最后如何使用 [Streamkap](https://streamkap.com) 流式传输数据。如果 SQL Server 承担着你的日常业务操作，而你又需要 ClickHouse 的分析速度和能力，那么你来对地方了。

<div id="why-stream-data-from-sql-server-to-clickhouse">
  ## 为什么要将数据从 SQL Server 流式传输到 ClickHouse？
</div>

如果你读到这里，大概率已经深有体会：SQL Server 在事务处理方面非常可靠，但它并不是为高负载的实时分析查询而设计的。

这正是 ClickHouse 的用武之地。ClickHouse 专为分析而生，即使面对海量数据集，也能提供极快的聚合与报表能力。因此，搭建一条流式 CDC (变更数据捕获) 管道，把事务型数据推送到 ClickHouse 后，你就能生成速度极快的报表——非常适合运营团队、产品团队或面向客户的仪表盘。

典型用例：

* 不会拖慢生产应用的内部报表
* 需要响应迅速且始终保持最新的面向客户的仪表盘
* 事件流处理，例如让用户活动日志持续保持最新状态，以便进行分析

<div id="what-youll-need-to-get-started">
  ## 开始前需要准备的内容
</div>

在深入细节之前，请先准备好以下内容：

<div id="prerequisites">
  ### 前置条件
</div>

* 一个正在运行的 SQL Server 实例

* 本教程使用的是 AWS RDS for SQL Server，但任何现代 SQL Server 实例都可以。[从零开始设置 AWS SQL Server。](https://streamkap.com/blog/how-to-stream-data-from-rds-sql-server-to-clickhouse-cloud-using-streamkap#setting-up-a-new-rds-sql-server-from-scratch)

* 一个 ClickHouse 实例

* 可使用自托管或 Cloud。[从零开始设置 ClickHouse。](https://streamkap.com/blog/how-to-stream-data-from-rds-sql-server-to-clickhouse-cloud-using-streamkap#creating-a-new-clickhouse-account)

* Streamkap

* 该工具将作为数据流式管道的核心。

<div id="connection-info">
  ### 连接信息
</div>

请确保你已准备好：

* SQL Server 服务器地址、端口、用户名和密码。建议为 Streamkap 创建单独的用户和角色，以访问你的 SQL Server 数据库。[查看我们的配置文档。](https://www.google.com/url?q=https://docs.streamkap.com/docs/sql-server\&sa=D\&source=editors\&ust=1760992472358213\&usg=AOvVaw3jfocCF1VSijgsq1OCpZPj)
* ClickHouse 服务器地址、端口、用户名和密码。ClickHouse 中的 IP 访问列表决定了哪些服务可以连接到你的 ClickHouse 数据库。[请按照此处的说明操作。](https://www.google.com/url?q=https://docs.streamkap.com/docs/clickhouse\&sa=D\&source=editors\&ust=1760992472359060\&usg=AOvVaw3H1XqqwvqAso_TQPNBKEhD)
* 你想要流式传输的表——暂时先从一张表开始

<Steps>
  <Step title="在 Streamkap 中创建 SQL Server 数据源" id="step-1-creating-a-sql-server-source-in-streamkap">
    <a id="setting-up-sql-server-as-a-source" />

    开始吧！

    我们先设置 source 连接，这样 Streamkap 才知道要从哪里拉取变更。

    操作步骤如下：

    1. 打开 Streamkap，进入 Sources 部分。
    2. 创建一个新的 source。

    * 给它起一个便于识别的名称 (例如：sqlserver-demo-source) 。

    3. 填写 SQL Server 连接详情：

    * Host (例如：your-db-instance.rds.amazonaws.com)
    * Port (SQL Server 的默认端口是 3306)
    * 用户名和密码
    * 数据库名称

    <Image img="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/etl-tools/image3.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=b0f0584f3a5d4ad25920d0bdedce7fe2" size="lg" width="1654" height="1156" data-path="images/integrations/data-ingestion/etl-tools/image3.webp" />

    #### 后台会发生什么

    <Image img="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/etl-tools/image1.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=fe4e2ec6f907f030fdec36d1f2b4e71e" size="lg" width="1999" height="648" data-path="images/integrations/data-ingestion/etl-tools/image1.webp" />

    完成设置后，Streamkap 会连接到你的 SQL Server 并检测表。此次演示中，我们会选择一张已经有一些数据持续流入的表，例如 events 或 transactions。
  </Step>

  <Step title="在 Streamkap 中添加 ClickHouse 目标端" id="step-2-add-a-clickhouse-destination-in-streamkap">
    <a id="creating-a-clickhouse-destination" />

    现在，我们来配置接收这些数据的目标端。

    和源端一样，我们将使用 ClickHouse 连接详情来创建目标端。

    #### 步骤：

    1. 前往 Streamkap 中的 destinations 部分。
    2. 添加一个新的目标端——选择 ClickHouse 作为目标端类型。
    3. 输入你的 ClickHouse 信息：

    * Host
    * Port (默认为 9000)
    * 用户名和密码
    * 数据库名称

    示例截图：在 Streamkap 仪表板中添加新的 ClickHouse 目标端。

    ### Upsert 模式：这是什么？

    这是一个重要步骤：我们要使用 ClickHouse 的 “upsert” 模式——它在底层使用 ClickHouse 的 ReplacingMergeTree engine。这样可以高效合并传入记录，并通过 ClickHouse 所说的“分片合并”在摄取后处理更新。

    * 这样可以确保当 SQL Server 端发生变化时，目标端表不会堆满重复数据。

    ### 处理 Schema 演进

    ClickHouse 和 SQL Server 有时并不会有完全相同的列——尤其是在应用已经上线、开发人员还在持续动态添加列的情况下。

    * 好消息是：Streamkap 可以处理基础的 schema 演进。这意味着，如果你在 SQL Server 中新增了一列，它也会出现在 ClickHouse 这一侧。

    只需在目标端设置中选择“schema evolution”即可。后续你也可以根据需要随时调整。
  </Step>

  <Step title="在 Streamkap 中配置管道" id="step-3-set-up-the-pipeline-in-streamkap">
    <a id="building-the-streaming-pipeline" />

    源端和目标端都已设置好，现在到了最有意思的部分——开始流式传输数据！

    #### 管道设置

    1. 前往 Streamkap 中的 Pipelines 选项卡。

    2. 创建一个新管道。

    3. 选择你的 SQL Server 源 (sqlserver-demo-source) 。

    4. 选择你的 ClickHouse 目标端 (clickhouse-tutorial-destination) 。

    5. 选择你要流式传输的表——这里假设是 events。

    6. 配置 Change Data Capture (CDC) 。

    * 本次我们将流式传输新数据 (刚开始可以先跳过回填，重点关注 CDC 事件) 。

    管道设置截图——选择源端、目标端和表。

    #### 需要回填吗？

    <Image img="https://mintcdn.com/private-7c7dfe99/pIetLsS_hOGHqoPJ/images/integrations/data-ingestion/etl-tools/image2.webp?fit=max&auto=format&n=pIetLsS_hOGHqoPJ&q=85&s=116f56b3a29c08de2bbd85c5cbbfa00f" size="lg" width="1999" height="563" data-path="images/integrations/data-ingestion/etl-tools/image2.webp" />

    你可能会问：需要回填旧数据吗？

    在很多分析场景中，你可能只想从现在开始流式传输变更；不过之后你也随时可以回过头来加载历史数据。

    除非你有明确需求，否则目前选择“不要回填”即可。
  </Step>

  <Step title="查看数据流" id="step-4-watch-the-data-stream">
    <a id="streaming-in-action-what-to-expect" />

    现在你的管道已配置完成并开始运行！

    以下是具体过程：

    * 当新数据进入 SQL Server 中的源表时，Streamkap 管道会捕获变更并将其发送到 ClickHouse。
    * ClickHouse (借助 ReplacingMergeTree 和分片合并) 会摄取这些行，并合并更新。
    * schema 也能保持同步——在 SQL Server 中新增列后，这些列也会出现在 ClickHouse 中。

    实时仪表板或日志会显示 ClickHouse 和 SQL Server 中的行数持续实时增长。

    你可以直观地看到，随着 SQL Server 接收到数据，ClickHouse 中的行数也会不断上升。

    ```sql theme={null}
    -- Example: Checking rows in ClickHouse 
    SELECT COUNT(*) FROM analytics.events; |
    ```

    在高负载场景下，可能会有一定延迟，但大多数用例都能实现接近实时的流式传输。
  </Step>
</Steps>

<div id="under-the-hood-whats-streamkap-actually-doing">
  ## 底层原理：Streamkap 实际在做什么？
</div>

让你大致了解一下它的工作方式：

* Streamkap 会监控 SQL Server 的二进制日志 (也就是用于复制的那种日志) 。
* 只要你的表中有行被插入、更新或删除，Streamkap 就会捕获这个事件。
* 它会将该事件转换为 ClickHouse 能理解的内容并发送过去——把变更立即应用到你的分析数据库中。

这不只是 ETL——而是完整的 CDC (变更数据捕获) ，并且是实时流式传输的。

<div id="advanced-options">
  ## 高级选项
</div>

<div id="upsert-vs-insert-modes">
  ### Upsert 与 Insert 模式
</div>

仅插入每一行 (Insert Mode) 与同时确保更新和删除也会同步过来 (Upsert Mode) ，两者有什么区别？

* Insert Mode：每个新行都会被添加——即使它其实是一次更新，也会产生重复数据。
* Upsert Mode：对现有行的更新会覆盖原有内容——更适合让分析数据保持最新且整洁。

<div id="handling-schema-changes">
  ### 处理 schema 变更
</div>

应用会不断变化，schema 也是如此。使用这条管道后：

* 给业务表新增一列？
  Streamkap 会自动识别，并在 ClickHouse 端同步添加这一列。
* 删除一列？
  这取决于具体设置，你可能需要执行迁移——不过大多数新增都能顺利处理。

<div id="real-world-monitoring-keeping-tabs-on-the-pipeline">
  ## 生产环境监控：随时掌握管道运行状态
</div>

<div id="checking-pipeline-health">
  ### 检查管道运行状况
</div>

Streamkap 提供了一个仪表盘，你可以：

* 查看管道滞后情况 (你的数据有多新鲜？)
* 监控行数和吞吐量
* 在出现异常时接收告警

仪表盘示例：滞后图、行数、健康状态指示器。

<div id="common-metrics-to-watch">
  ### 需要重点关注的常见指标
</div>

* 滞后：ClickHouse 比 SQL Server 落后多少？
* 吞吐量：每秒处理的行数
* 错误率：应接近零

<div id="going-live-querying-clickhouse">
  ## 开始使用：查询 ClickHouse
</div>

现在数据已经进入 ClickHouse，你可以使用各种高速分析工具对其进行查询。下面是一个基础示例：

```sql theme={null}
-- 查看过去一小时内活跃度最高的前 10 名用户
SELECT user\_id, COUNT(*) AS actionsFROM analytics.eventsWHERE event\_time >= now() - INTERVAL 1 HOURGROUP BY user\_idORDER BY actions DESCLIMIT 10;
```

将 ClickHouse 与 Grafana、Superset 或 Redash 等仪表盘工具结合使用，可实现功能完善的报表分析。

<div id="next-steps-and-deep-dives">
  ## 后续步骤与深入研究
</div>

本指南只是展示了你可以实现的部分功能。掌握基础之后，接下来你还可以进一步探索：

* 设置带过滤的流 (仅同步部分表/列)
* 将多个数据源流式传输到同一个分析型数据库
* 将其与 S3/数据湖结合用于冷存储
* 在更改表时自动执行 schema 迁移
* 使用 SSL 和防火墙规则保护你的管道

请关注 [Streamkap 博客](https://streamkap.com/blog)，获取更深入的指南。

<div id="faq-and-troubleshooting">
  ## 常见问题与故障排查
</div>

问：这适用于云数据库吗？
答：是的！我们在这个示例中使用了 AWS RDS。只要确保放通了正确的端口即可。

问：性能如何？
答：ClickHouse 速度很快。瓶颈通常在网络或源数据库的 binlog 速度上，但在大多数情况下，延迟都会低于 1 秒。

问：也能处理删除操作吗？
答：当然可以。在 upsert 模式下，删除操作也会被标记，并在 ClickHouse 中处理。

<div id="wrapping-up">
  ## 总结
</div>

以上就是使用 Streamkap 将 SQL Server 数据流式传输到 ClickHouse 的完整介绍。它快速、灵活，非常适合需要近实时分析、又不想给生产数据库带来过大压力的团队。

准备好试试了吗？
前往[注册页面](https://app.streamkap.com/account/sign-up)，如果你希望我们介绍以下主题，也欢迎告诉我们：

* Upsert 与 Insert 的区别，以及两者的技术细节
* 端到端延迟：多久才能获得最终的分析视图？
* 性能调优与吞吐量
* 基于这套技术栈构建的真实场景仪表盘

感谢阅读！祝你流式处理顺利。
