---
title: 'Перенести данные из ClickHouse® в облачную базу данных ClickHouse® с помощью Trino'
sidebar_label: 'Перенести данные из ClickHouse® в облачную базу данных ClickHouse® с помощью Trino'
sidebar_position: 1
description: 'Как перенести данные из ClickHouse в облачную базу данных ClickHouse с помощью Trino'
---

import {CustomTable} from '@selectel/docux/components'
import Formbricks from '@theme/MDXComponents/Formbricks'

# Перенести данные из ClickHouse® в облачную базу данных ClickHouse® с помощью Trino

Вы можете перенести таблицы из своего ClickHouse® — на собственном сервере или в другом облаке — в [облачную базу данных ClickHouse®](/managed-databases/clickhouse/about-clickhouse.mdx) с помощью [облака для Trino](/cloud-for-trino/about/about-cloud-for-trino.mdx). Trino читает данные из исходного ClickHouse и записывает их в целевой кластер SQL-запросом, без промежуточных файлов и выгрузок.

Способ подходит, если нужно перенести отдельные базы данных и таблицы, отфильтровать или преобразовать данные при переносе. Trino поддерживает не все типы данных ClickHouse — перед переносом проверьте структуру таблиц по разделу Ограничения.

## Как устроена миграция

Целевой кластер ClickHouse можно создать рядом с Trino или использовать существующий кластер в другом пуле:

* вариант 1 — новый кластер ClickHouse создается в пуле ru-7 в одной приватной подсети с кластером Trino. Trino подключается к нему по приватному IP-адресу;
* вариант 2 — существующий кластер ClickHouse находится в другом пуле. Trino подключается к нему через интернет по [публичному IP-адресу](/managed-databases/clickhouse/public-ip.mdx).

В обоих вариантах к исходному ClickHouse Trino подключается через интернет. Для этого подсеть кластера Trino подключена к облачному роутеру с доступом в интернет — роутер выпускает трафик подсети в интернет через свой внешний IP-адрес. SQL-запросы вы отправляете в Trino со своего компьютера через внешний доступ к кластеру Trino.

Схема миграции: исходный ClickHouse → облачный роутер → кластер Trino → целевой кластер ClickHouse.

Исходный и целевой ClickHouse подключаются к Trino как два [каталога](/cloud-for-trino/manage/catalogs.mdx) с коннектором ClickHouse. Каждая база данных ClickHouse отображается в каталоге как схема. В одном SQL-запросе можно читать данные из одного каталога и записывать их в другой.

## Что нужно для миграции

* исходный ClickHouse, доступный из интернета по публичному IP-адресу или DNS-адресу, с включенным HTTPS-интерфейсом;
* права на создание пользователей в исходном ClickHouse и доступ к файрволу сервера;
* консольный клиент clickhouse-client с доступом к исходному ClickHouse — чтобы получить структуру таблиц;
* компьютер с клиентом для подключения к Trino — [Trino CLI](https://trino.io/docs/current/client/cli.html) или [DBeaver](https://dbeaver.io/download/).

В инструкции используются имена из примера — замените их на свои:

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Ресурс</th>
        <th>Имя в примере</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>Приватная сеть</td>
        <td>trino-migration-net</td>
      </tr>

      <tr>
        <td>Облачный роутер</td>
        <td>trino-migration-router</td>
      </tr>

      <tr>
        <td>Кластер облачных баз данных ClickHouse</td>
        <td>ch-target</td>
      </tr>

      <tr>
        <td>Кластер Trino</td>
        <td>trino-migration</td>
      </tr>

      <tr>
        <td>Каталог Trino для исходного ClickHouse</td>
        <td>ch_source</td>
      </tr>

      <tr>
        <td>Каталог Trino для целевого кластера</td>
        <td>ch_target</td>
      </tr>

      <tr>
        <td>Пользователь исходного ClickHouse</td>
        <td>trino_reader</td>
      </tr>

      <tr>
        <td>База данных и таблица для переноса</td>
        <td>analytics.events</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

## Шаги миграции

1. Настройте сеть.

2. Подготовьте исходный ClickHouse.

3. Подготовьте целевой кластер ClickHouse.

4. Создайте кластер Trino с каталогами.

5. Подключитесь к кластеру Trino и проверьте каталоги.

6. Перенесите данные.

7. Проверьте результат.

### 1. Настроить сеть

Кластер Trino подключается к приватной подсети. Чтобы Trino мог подключиться к исходному ClickHouse и к кластеру в другом пуле через интернет, подключите подсеть к облачному роутеру с доступом в интернет. Подробнее в подразделе [Настроить доступ в интернет через облачный роутер](/cloud-servers/cloud-networks/configure-access-to-internet.mdx#internet-access-via-cloud-router).

1. Создайте приватную сеть:

   1.1. В [панели управления](https://my.selectel.ru/vpc/default/networks/) в верхнем меню нажмите **Продукты** и выберите **Облачные серверы**.

   1.2. Перейдите в раздел **Сеть** → вкладка **Приватные сети**.

   1.3. Нажмите **Создать сеть**.

   1.4. Выберите [локацию](/infrastructure/locations.mdx) — пул ru-7.

   1.5. Введите имя сети — trino-migration-net.

   1.6. Введите CIDR подсети, например `192.168.0.0/24`.

   1.7. Нажмите **Создать**.

2. Создайте облачный роутер с подключением к интернету:

   2.1. В [панели управления](https://my.selectel.ru/vpc/default/routers/) в верхнем меню нажмите **Продукты** и выберите **Облачные серверы**.

   2.2. Перейдите в раздел **Сеть** → вкладка **Облачные роутеры**.

   2.3. Нажмите **Создать роутер**.

   2.4. Выберите локацию — пул ru-7.

   2.5. Выберите тип роутера.

   2.6. Введите имя роутера — trino-migration-router.

   2.7. Отметьте чекбокс **Подключить роутер к интернету** — для роутера будет выделен внешний IP-адрес.

   2.8. Нажмите **Создать**.

3. Подключите подсеть к облачному роутеру:

   3.1. Откройте страницу роутера trino-migration-router.

   3.2. Нажмите **Подключить подсеть**.

   3.3. Выберите подсеть сети trino-migration-net.

   3.4. Введите IP-адрес роутера — [шлюз подсети](/cloud-servers/cloud-networks/private-networks-and-subnets.mdx#default-gateway), например `192.168.0.1`. Если IP-адрес роутера совпадает со шлюзом подсети, устройства в подсети выходят в интернет без дополнительных маршрутов.

   3.5. Нажмите **Подключить**.

4. Скопируйте внешний IP-адрес роутера — с него Trino будет подключаться к исходному ClickHouse и к кластеру в другом пуле. Можно посмотреть на странице роутера.

### 2. Подготовить исходный ClickHouse

Trino подключается к исходному ClickHouse от имени отдельного пользователя с правами только на чтение — так миграция не изменит данные в источнике.

1. Подключитесь к исходному ClickHouse пользователем с правами на управление пользователями.

2. Создайте пользователя, которому разрешено подключаться только с внешнего IP-адреса облачного роутера, и выдайте ему права на чтение:

   ```bash
   CREATE USER trino_reader IDENTIFIED WITH sha256_password BY '<password>' HOST IP '<router_ip>';
   GRANT SELECT ON analytics.* TO trino_reader;
   ```

   Укажите:

   * `<password>` — пароль пользователя;
   * `<router_ip>` — внешний IP-адрес облачного роутера, который вы скопировали на шаге 1.

   Если вы переносите несколько баз данных, выдайте привилегию SELECT на каждую. Если пользователи на сервере задаются в файле `users.xml`, а не SQL-запросами, добавьте пользователя в этот файл и ограничьте адреса подключения в секции `networks`.

3. Убедитесь, что на сервере включен HTTPS-интерфейс ClickHouse: в конфигурации задан параметр `https_port` (обычно 8443) и настроен TLS-сертификат. Trino подключается к ClickHouse через HTTP-интерфейс.

4. В файрволе сервера или в группах безопасности облачного провайдера разрешите входящие подключения на HTTPS-порт ClickHouse с внешнего IP-адреса облачного роутера.

### 3. Подготовить целевой кластер ClickHouse

Создайте новый кластер в пуле ru-7 или используйте существующий кластер в другом пуле. Для подключения Trino используйте порт 8443 — HTTP-интерфейс ClickHouse с SSL. Подробнее о портах в инструкции [Подключиться к кластеру ClickHouse](/managed-databases/clickhouse/connect-to-cluster.mdx).

#### Вариант 1. Создать кластер в пуле ru-7

1. [Создайте кластер ClickHouse](/managed-databases/clickhouse/create-cluster.mdx) с именем ch-target. При создании кластера:

   * выберите локацию — пул ru-7;
   * в блоке **Сеть** выберите подсеть сети trino-migration-net — в ней будет и кластер Trino;
   * в блоке **Конфигурация групп нод** выберите конфигурацию с размером диска с запасом относительно объема переносимых данных;
   * в блоке **Пароль пользователя-администратора** введите пароль или нажмите **Сгенерировать**. Сохраните пароль — его нельзя будет посмотреть в панели управления.

2. Дождитесь, пока кластер будет создан.

3. Скопируйте приватный IP-адрес ноды. Можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/dbaas/): в верхнем меню нажмите **Продукты** → **Облачные базы данных** → вкладка **Активные** → страница кластера → вкладка **Подключение** → блок **Адреса для подключения** → вкладка **группы нод**.

#### Вариант 2. Использовать существующий кластер в другом пуле

Кластер в другом пуле не может находиться в одной подсети с кластером Trino, поэтому Trino подключается к нему через интернет по публичному IP-адресу. Публичные IP-адреса подключаются ко всем нодам шарда одновременно — для каждой ноды отдельный адрес. Подробнее в инструкции [Публичный IP-адрес в кластере ClickHouse](/managed-databases/clickhouse/public-ip.mdx).

1. Подключите публичный IP-адрес к шарду кластера:

   1.1. В [панели управления](https://my.selectel.ru/vpc/default/dbaas/) в верхнем меню нажмите **Продукты** и выберите **Облачные базы данных**.

   1.2. Откройте вкладку **Активные**.

   1.3. Откройте страницу кластера → вкладка **Настройки**.

   1.4. В карточке шарда в строке Публичный доступ нажмите кнопку подключения.

   1.5. Если подсеть кластера соответствует [требованиям](/managed-databases/clickhouse/public-ip.mdx#requirements), нажмите **Подключить**. Если не соответствует — выберите существующий облачный роутер или создайте новый и нажмите **Подключить роутер и адрес**.

2. Ограничьте входящий трафик к публичным IP-адресам: [назначьте кластеру группу безопасности](/managed-databases/clickhouse/network-access-control.mdx), которая разрешает входящие подключения на порт 8443 только с внешнего IP-адреса роутера trino-migration-router и с адресов ваших приложений. После назначения группы прервутся все активные сессии, которые не соответствуют ее правилам.

3. Скопируйте публичный IP-адрес ноды: страница кластера → вкладка **Подключение** → блок **Адреса для подключения** → вкладка **группы нод**.

   Если существующий кластер находится в пуле ru-7, но в другой приватной подсети, публичный IP-адрес не нужен: подключите подсеть кластера к роутеру trino-migration-router и используйте приватный IP-адрес ноды. Если исходный ClickHouse — это тоже кластер облачных баз данных Selectel в другом пуле, подключите к нему публичный IP-адрес так же.

### 4. Создать кластер Trino с каталогами

Для миграции нужны два [каталога](/cloud-for-trino/manage/catalogs.mdx) с коннектором ClickHouse: ch_source — для исходного ClickHouse и ch_target — для целевого кластера. Каталоги можно добавить при создании кластера или [после создания](/cloud-for-trino/manage/catalogs.mdx#add-catalog-in-existing-cluster).

1. В [панели управления](https://my.selectel.ru/data-platform/default/trino/) в верхнем меню нажмите **Продукты** и выберите Trino.

2. Нажмите **Создать кластер**.

3. Введите имя кластера — trino-migration.

4. Выберите локацию — пул ru-7. После создания кластера локацию изменить нельзя.

5. Выберите [версию Trino](/cloud-for-trino/about/about-cloud-for-trino.mdx#versions). После создания кластера версию изменить нельзя.

6. В блоке **Конфигурация** выберите конфигурации координатора и воркеров и количество воркеров. Подробнее в подразделе [Конфигурация](/cloud-for-trino/create-cluster.mdx#configuration) инструкции Создать кластер Trino.

7. В блоке **Сеть**:

   7.1. В поле **Подсеть** выберите подсеть сети trino-migration-net. После создания кластера подсеть изменить нельзя.

   7.2. Отметьте чекбокс **Внешний доступ к графическому интерфейсу**, чтобы подключаться к Trino со своего компьютера через интернет.

8. В блоке **Пароль администратора** введите пароль или нажмите **Сгенерировать**. Скопируйте и сохраните пароль — его нельзя будет посмотреть в панели управления, но можно [изменить](/cloud-for-trino/manage/change-administrator-password.mdx).

9. В блоке **Каталоги** добавьте каталоги ch_source и ch_target. Для каждого каталога:

   9.1. Нажмите **Добавить**.

   9.2. Введите имя каталога. Имя может содержать только строчные латинские буквы, цифры и нижнее подчеркивание, не более 63 символов.

   9.3. Выберите тип коннектора — ClickHouse.

   9.4. Введите параметры подключения из таблицы ниже.

   9.5. Нажмите **Добавить**.

10. Проверьте цену кластера.

11. Нажмите **Создать кластер**.

<CustomTable>
  <table>
    <tbody>
      <tr>
        <th>Параметр</th>
        <th>Каталог ch_source</th>
        <th>Каталог ch_target</th>
      </tr>

      <tr>
        <td>DNS-адрес или IP-адрес</td>
        <td>публичный адрес исходного ClickHouse</td>
        <td>вариант 1 — приватный IP-адрес ноды кластера ch-target; вариант 2 — публичный IP-адрес ноды</td>
      </tr>

      <tr>
        <td>Порт</td>
        <td>HTTPS-порт исходного ClickHouse, обычно 8443 </td>
        <td> 8443 </td>
      </tr>

      <tr>
        <td>Имя базы данных</td>
        <td>база данных исходного ClickHouse, например default</td>
        <td> default</td>
      </tr>

      <tr>
        <td>Имя пользователя</td>
        <td> trino_reader </td>
        <td> admin</td>
      </tr>

      <tr>
        <td>Пароль</td>
        <td>пароль пользователя trino_reader </td>
        <td>пароль пользователя-администратора кластера</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

Для каталога ch_target в примере используется пользователь-администратор admin. Вы можете создать для Trino отдельного пользователя SQL-запросами — подробнее в инструкции [Управление пользователями ClickHouse](/managed-databases/clickhouse/manage-users.mdx).

### 5. Подключиться к кластеру Trino и проверить каталоги

К кластеру Trino подключается пользователь admin с паролем администратора, который вы задали при создании кластера. Подробнее о способах подключения в инструкции [Подключиться к кластеру Trino](/cloud-for-trino/manage/connect-to-cluster.mdx).

#### Через Trino CLI

1. Откройте CLI.

2. Подключитесь к кластеру:

```bash
./trino --server https://<trino_address> --user admin --password
```

Укажите `<trino_address>` — адрес кластера Trino для подключения из интернета. Можно посмотреть в [панели управления](https://my.selectel.ru/data-platform/default/trino/): в верхнем меню нажмите **Продукты** → **Trino** → страница кластера → вкладка **Подключение**.

3. Введите пароль администратора.

#### Через DBeaver

1. Откройте DBeaver.

2. В верхнем меню нажмите **База данных** → **Новое соединение**.

3. Выберите Trino и нажмите **Далее**.

4. В поле **Хост** введите `<trino_address>` без https:// — адрес кластера Trino для подключения из интернета.

5. В поле **Порт** введите `443`.

6. Введите имя пользователя — admin и пароль администратора.

7. Откройте вкладку **Свойства драйвера** и для свойства SSL укажите значение **true**.

8. Нажмите **Тест соединения**, затем **Готово**.

#### Проверьте каталоги

Выполните запросы в Trino CLI или в редакторе SQL DBeaver:

```
SHOW CATALOGS;
SHOW SCHEMAS FROM ch_source;
SHOW TABLES FROM ch_source.analytics;
SHOW SCHEMAS FROM ch_target;
```

В списке каталогов должны быть ch_source и ch_target, а в схеме ch_source.analytics — таблицы исходной базы данных.

Если запрос к каталогу завершается ошибкой подключения, проверьте, что подсеть кластера Trino подключена к облачному роутеру, а внешний IP-адрес роутера разрешен у пользователя trino_reader, в файрволе исходного сервера и — для варианта 2 — в группе безопасности целевого кластера.

### 6. Перенести данные

Trino создает таблицы ClickHouse только с движками Log и MergeTree и без части настроек исходной таблицы. Поэтому сначала создайте в целевом кластере таблицы с той же структурой, что в источнике, а затем перенесите в них данные. Нативные запросы ClickHouse к целевому кластеру выполняйте через процедуру system.execute — так не нужен отдельный доступ к кластеру.

1. Создайте базу данных в целевом кластере:

   ```bash
   CALL ch_target.system.execute(query => 'CREATE DATABASE IF NOT EXISTS analytics');
   ```

2. Получите структуру таблицы: в `clickhouse-client` на исходном сервере выполните запрос:

   ```bash
   SHOW CREATE TABLE analytics.events;
   ```

3. Создайте таблицу в целевом кластере — передайте результат предыдущего запроса в процедуру system.execute:

   ```bash
   CALL ch_target.system.execute(query => '
   CREATE TABLE analytics.events
   (
       event_date Date,
       event_time DateTime,
       user_id UInt64,
       event_type String
   )
   ENGINE = MergeTree
   PARTITION BY toYYYYMM(event_date)
   ORDER BY (event_type, event_time)
   ');
   ```

   Если в структуре таблицы есть одинарные кавычки — например, в значениях DEFAULT или в типе Enum — удвойте их: ''. Удалите из структуры настройки, которых нет в целевом кластере, например `storage_policy`. Если в шарде целевого кластера несколько нод, используйте реплицируемый движок ReplicatedMergeTree.

4. Опционально: чтобы ускорить загрузку, отключите запись через временную таблицу:

   ```bash
   SET SESSION ch_target.non_transactional_insert = true;
   ```

   По умолчанию Trino сначала записывает данные во временную таблицу и только потом переносит их в целевую. С этой настройкой данные записываются сразу в целевую таблицу, но при ошибке в ней останется часть строк — очистите таблицу запросом TRUNCATE TABLE ch_target.analytics.events и повторите перенос.

5. Перенесите данные:

   ```bash
   INSERT INTO ch_target.analytics.events
   SELECT * FROM ch_source.analytics.events;
   ```

   Trino вернет количество записанных строк. Повторите шаги 2, 3 и 5 для каждой таблицы.

### 7. Проверить результат

1. Сравните количество строк в исходной и целевой таблицах:

   ```bash
   SELECT
     (SELECT count(*) FROM ch_source.analytics.events) AS source_rows,
     (SELECT count(*) FROM ch_target.analytics.events) AS target_rows;
   ```

2. Найдите дни, за которые количество строк не совпадает:

   ```bash
   SELECT event_date, count(*) AS rows FROM ch_source.analytics.events GROUP BY event_date
   EXCEPT
   SELECT event_date, count(*) AS rows FROM ch_target.analytics.events GROUP BY event_date;
   ```

   Пустой результат означает, что количество строк совпадает за все дни. Агрегация выполняется на стороне ClickHouse, поэтому запрос работает быстро даже на больших таблицах.

3. Сравните столбцы: выполните запрос SHOW COLUMNS FROM ch_target.analytics.events; и сверьте результат со структурой таблицы в исходном ClickHouse. Столбцы с типами, которые Trino не поддерживает, не видны в каталогах — сверяйте с выводом SHOW CREATE TABLE в источнике.

## Ограничения

Trino переносит данные, но не все объекты базы данных и настройки таблиц.

* типы данных. Trino поддерживает часть типов ClickHouse: целые и дробные числа, Decimal, Bool, String, FixedString, Date, DateTime, Enum, UUID, IPv4 и IPv6. Столбцы других типов — например, Array, Map, Tuple и DateTime64 — Trino по умолчанию не видит, и SELECT \* их не вернет. Если в таблице есть такие столбцы, перечислите в INSERT и SELECT только поддерживаемые столбцы — остальные получат значения по умолчанию. Подробнее в разделе [Type mapping](https://trino.io/docs/current/connector/clickhouse.html#type-mapping) документации Trino. Чтобы перенести такие столбцы, используйте нативные средства ClickHouse, например табличную функцию [remoteSecure](https://clickhouse.com/docs/sql-reference/table-functions/remote);
* строки. Trino читает столбцы String как VARBINARY. На перенос это не влияет — в целевую таблицу записываются те же строки. Чтобы посмотреть строки в Trino в читаемом виде, используйте функцию from_utf8();
* объекты базы данных. Trino переносит только данные таблиц. Материализованные представления, словари, пользователей, роли и профили настроек создайте в целевом кластере вручную;
* шардирование. Пример рассчитан на целевой кластер с одним шардом: Trino записывает данные на ноду, адрес которой указан в каталоге. Для кластера из нескольких шардов записывайте данные в таблицу с движком Distributed;
* согласованность данных. Каждая таблица читается в свой момент времени. Остановите запись в исходный ClickHouse на время переноса или догрузите новые данные перед переключением приложения;
* таблицы с фоновым слиянием строк. В таблицах ReplacingMergeTree, CollapsingMergeTree и похожих количество строк в источнике и в целевом кластере может отличаться до завершения фоновых слияний;
* место на диске. При записи через временную таблицу на диске целевого кластера нужен запас примерно на объем переносимой таблицы;
* перенос через интернет. В варианте 2 скорость переноса зависит от канала между пулами. Трафик шифруется, но публичные IP-адреса кластера доступны из интернета — ограничьте доступ группой безопасности и отключите публичные IP-адреса после миграции, если они не нужны;
* Public preview. Облако для Trino предоставляется без SLA. Перед переносом критичных данных сделайте резервную копию исходных таблиц.

## После миграции

1. Переключите приложение на целевой кластер — подробнее в инструкции [Подключиться к кластеру ClickHouse](/managed-databases/clickhouse/connect-to-cluster.mdx).

2. В исходном ClickHouse удалите пользователя trino_reader запросом DROP USER trino_reader и закройте в файрволе доступ с IP-адреса облачного роутера.

3. Для варианта 2: если публичные IP-адреса больше не нужны, [отключите их](/managed-databases/clickhouse/public-ip.mdx) и удалите правило для роутера Trino из группы безопасности.

4. Если кластер Trino больше не нужен, удалите его или [отключите внешний доступ](/cloud-for-trino/manage/connect-to-cluster.mdx#disable-external-access). Если кластер остается для аналитики, [удалите каталог](/cloud-for-trino/manage/catalogs.mdx#delete-catalog) ch_source.

<Formbricks />
