跳到主要内容
跳到主要内容

从自管理 ClickHouse 迁移到 ClickHouse Cloud

迁移自管理的 ClickHouse

本指南将展示如何从自管理的 ClickHouse 服务器迁移到 ClickHouse Cloud,以及如何在 ClickHouse Cloud 服务之间进行迁移。 [remoteSecure](/sql-reference/table-functions/remote) 函数用于 SELECTINSERT 查询中,以允许访问远程 ClickHouse 服务器,使表的迁移变得简单,只需编写带有嵌入式 SELECTINSERT INTO 查询。

从自管理的 ClickHouse 迁移到 ClickHouse Cloud

迁移自管理的 ClickHouse
备注

无论源表是否分片和/或复制,在 ClickHouse Cloud 上,您只需创建一个目标表(可以省略此表的 Engine 参数,它将自动成为 ReplicatedMergeTree 表),ClickHouse Cloud 将自动处理垂直和水平扩展。您无需考虑如何复制和分片表。

在此示例中,自管理的 ClickHouse 服务器是 ,ClickHouse Cloud 服务是 目标

概述

该过程为:

  1. 向源服务添加只读用户
  2. 在目标服务上复制源表结构
  3. 根据源的网络可用性,从源提取数据到目标,或将数据从源推送到目标
  4. 从目标的 IP 访问列表中移除源服务器(如果适用)
  5. 从源服务中移除只读用户

从一个系统迁移表到另一个系统:

该示例将一个表从自管理的 ClickHouse 服务器迁移到 ClickHouse Cloud。

在源 ClickHouse 系统上(当前托管数据的系统)

  • 添加一个可以读取源表的只读用户(在此示例中为 db.table
CREATE USER exporter
IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
SETTINGS readonly = 1;
GRANT SELECT ON db.table TO exporter;
  • 复制表定义
SELECT create_table_query
FROM system.tables
WHERE database = 'db' AND table = 'table'

在目标 ClickHouse Cloud 系统上:

  • 创建目标数据库:
CREATE DATABASE db
  • 使用源的 CREATE TABLE 语句创建目标。
提示

在运行 CREATE 语句时,将 ENGINE 更改为 ReplicatedMergeTree,且不带任何参数。ClickHouse Cloud 始终复制表并提供正确的参数。但请保留 ORDER BYPRIMARY KEYPARTITION BYSAMPLE BYTTLSETTINGS 子句。

CREATE TABLE db.table ...
  • 使用 remoteSecure 函数从自管理源提取数据
迁移自管理的 ClickHouse
INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
备注

如果源系统从外部网络不可用,您可以使用推送而不是提取数据,因为 remoteSecure 函数适用于选择和插入。请参阅下一个选项。

  • 使用 remoteSecure 函数将数据推送到 ClickHouse Cloud 服务
迁移自管理的 ClickHouse
将远程系统添加到您的 ClickHouse Cloud 服务 IP 访问列表

为了使 remoteSecure 函数能够连接到您的 ClickHouse Cloud 服务,远程系统的 IP 地址需要在 IP 访问列表中被允许。有关更多信息,请展开此提示下方的 管理您的 IP 访问列表

管理您的 IP 访问列表

从您的 ClickHouse Cloud 服务列表中选择您要使用的服务,并切换到 设置。如果 IP 访问列表中不包含需要连接到您的 ClickHouse Cloud 服务的远程系统的 IP 地址或范围,您可以通过 添加 IP 们 来解决此问题:

检查服务是否允许来自您的 IP 地址的流量在 IP 访问列表中

添加需要连接到您的 ClickHouse Cloud 服务的单个 IP 地址或地址范围。根据需要修改表单,然后 保存

将您的当前 IP 地址添加到 ClickHouse Cloud 的 IP 访问列表中
INSERT INTO FUNCTION
remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table',
'default', 'PASS') SELECT * FROM db.table

在 ClickHouse Cloud 服务之间迁移

迁移自管理的 ClickHouse

以下是将数据在 ClickHouse Cloud 服务之间迁移的一些示例用法:

  • 从恢复的备份中迁移数据
  • 从开发服务复制数据到暂存服务(或从暂存到生产)

在此示例中,有两个 ClickHouse Cloud 服务,它们将分别被称为 目标。数据将从源提取到目标。虽然您可以选择推送,但这里以提取为例,因为它使用了只读用户。

迁移自管理的 ClickHouse

迁移有几个步骤:

  1. 确定一个 ClickHouse Cloud 服务作为 ,另一个作为 目标
  2. 向源服务添加只读用户
  3. 在目标服务上复制源表结构
  4. 暂时允许对源服务的 IP 访问
  5. 从源复制数据到目标
  6. 重新建立目标上的 IP 访问列表
  7. 从源服务中移除只读用户

向源服务添加只读用户

  • 添加一个可以读取源表的只读用户(在此示例中为 db.table
CREATE USER exporter
IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
SETTINGS readonly = 1;
GRANT SELECT ON db.table TO exporter;
  • 复制表定义
select create_table_query
from system.tables
where database = 'db' and table = 'table'

在目标服务上复制表结构

在目标创建数据库(如果尚未存在):

  • 创建目标数据库:
CREATE DATABASE db
  • 使用源的 CREATE TABLE 语句创建目标。

    在目标使用源的 select create_table_query... 输出创建表:

CREATE TABLE db.table ...

允许远程访问源服务

为了从源提取数据到目标,源服务必须允许连接。暂时禁用源服务上的“IP 访问列表”功能。

提示

如果您将继续使用源 ClickHouse Cloud 服务,则在切换到允许来自任何地方的访问之前,请将现有的 IP 访问列表导出为 JSON 文件;这将允许您在数据迁移后导入访问列表。

修改允许列表并暂时允许来自 任何地方 的访问。有关详细信息,请参见 IP Access List 文档。

从源复制数据到目标

  • 使用 remoteSecure 函数从源 ClickHouse Cloud 服务提取数据 连接到目标。在目标的 ClickHouse Cloud 服务上运行此命令:
INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
  • 验证目标服务中的数据

重新建立源上的 IP 访问列表

如果您之前导出了访问列表,则可以使用 Share 重新导入,如果没有,则重新添加您的条目到访问列表中。

移除只读 exporter 用户

DROP USER exporter
  • 切换服务的 IP 访问列表以限制访问