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

remote, remoteSecure 表函数

表函数 remote 允许动态访问远程服务器,即在不创建 Distributed 表的情况下。表函数 remoteSecureremote 相同,但通过安全连接进行访问。

这两个函数可以在 SELECTINSERT 查询中使用。

语法

参数

参数描述
addresses_expr远程服务器地址或生成多个远程服务器地址的表达式。格式: hosthost:port

host 可以指定为服务器名称或 IPv4 或 IPv6 地址。IPv6 地址必须用方括号括起来。

port 是远程服务器上的 TCP 端口。如果省略端口,则会使用表函数 remote 的服务器配置文件中的 tcp_port(默认为 9000)和表函数 remoteSecuretcp_port_secure(默认为 9440)。

对于 IPv6 地址,端口是必需的。

如果仅指定参数 addresses_exprdbtable 默认将使用 system.one

类型:String
db数据库名称。类型:String
table表名。类型:String
user用户名。如果未指定,则使用 default。类型:String
password用户密码。如果未指定,则使用空密码。类型:String
sharding_key用于支持跨节点分发数据的分片键。例如:insert into remote('127.0.0.1:9000,127.0.0.2', db, table, 'default', rand())。类型:UInt32

参数也可以通过 命名集合 传递。

返回值

位于远程服务器上的表。

用法

由于表函数 remoteremoteSecure 在每次请求时都会重新建立连接,因此建议使用 Distributed 表。如果设置了主机名,则会进行名称解析,并且在与各种副本交互时不会计算错误。当处理大量查询时,始终提前创建 Distributed 表,而不是使用 remote 表函数。

remote 表函数在以下情况下非常有用:

  • 从一个系统迁移数据到另一个系统一次性操作
  • 访问特定服务器进行数据比较、调试和测试,即临时连接。
  • 进行研究目的的各种 ClickHouse 集群之间的查询。
  • 手动进行的不频繁的分布式请求。
  • 每次重新定义服务器集合的分布式请求。

地址

多个地址可以用逗号分隔。在这种情况下,ClickHouse 将使用分布式处理,并将查询发送到所有指定的地址(就像有不同数据的分片)。示例:

示例

从远程服务器选择数据:

或者使用 命名集合

向远程服务器上的表插入数据:

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

此示例使用来自示例数据集的一张表。 数据库为 imdb,表名为 actors

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

  • 验证源数据库和表名称(imdb.actors
  • 从源获取 CREATE TABLE 语句:

响应

在目标 ClickHouse 系统上

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

回到源部署

插入到在远程系统上创建的新数据库和表中。您需要主机名、端口、用户名、密码、目标数据库和目标表。

通配符

大括号 { } 中的模式用于生成一组分片并指定副本。如果有多个成对的大括号,则生成相应集合的笛卡尔积。

支持以下模式类型。

  • {a,b,c} - 表示任意一个替代字符串 abc。该模式在第一个分片地址中替换为 a,在第二个分片地址中替换为 b,依此类推。例如,example0{1,2}-1 生成地址 example01-1example02-1
  • {N..M} - 一系列数字。此模式生成从 N 到(包括)M 的分片地址,索引递增。例如,example0{1..2}-1 生成 example01-1example02-1
  • {0n..0m} - 带有前导零的数字范围。此模式在索引中保留前导零。例如,example{01..03}-1 生成 example01-1example02-1example03-1
  • {a|b} - 由 | 分隔的任意数量的变体。该模式指定副本。例如,example01-{1|2} 生成副本 example01-1example01-2

查询将发送到第一健康副本。然而,对于 remote,副本按当前在 load_balancing 设置中设置的顺序进行迭代。 生成的地址数量受到 table_function_remote_max_addresses 设置的限制。