> ## 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.

# Миграция между самоуправляемым ClickHouse и ClickHouse Cloud с помощью remoteSecure

> Страница с описанием миграции между самоуправляемым ClickHouse и ClickHouse Cloud

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>;
};

<Image img="https://mintcdn.com/private-7c7dfe99/B2SPNiDHMxYV1gTC/images/integrations/migration/self-managed-01.webp?fit=max&auto=format&n=B2SPNiDHMxYV1gTC&q=85&s=8007ed5959028547503a7811ed0d3084" size="lg" alt="Миграция самоуправляемого ClickHouse" width="2048" height="936" data-path="images/integrations/migration/self-managed-01.webp" />

В этом руководстве показано, как выполнить миграцию с самоуправляемого сервера ClickHouse в ClickHouse Cloud, а также как переносить данные между сервисами ClickHouse Cloud.
Функция [`remoteSecure`](/docs/ru/reference/functions/table-functions/remote) используется в запросах `SELECT` и `INSERT` для доступа к удалённым серверам ClickHouse, что позволяет переносить таблицы так же просто, как выполнить запрос `INSERT INTO` со встроенным `SELECT`.

<div id="migrating-from-self-managed-clickhouse-to-clickhouse-cloud">
  ## Миграция с самоуправляемого ClickHouse в ClickHouse Cloud
</div>

<Image img="https://mintcdn.com/private-7c7dfe99/B2SPNiDHMxYV1gTC/images/integrations/migration/self-managed-02.webp?fit=max&auto=format&n=B2SPNiDHMxYV1gTC&q=85&s=177a7c5d307386ed999905995a255130" size="lg" alt="Миграция самоуправляемого ClickHouse" width="2048" height="936" data-path="images/integrations/migration/self-managed-02.webp" />

Независимо от того, разбита ли ваша исходная таблица на сегменты и/или реплицируется ли она, в ClickHouse Cloud вам нужно только создать целевую таблицу (параметр Engine для этой таблицы можно не указывать — `SharedMergeTree` будет автоматически выбран в качестве движка таблицы),
а ClickHouse Cloud автоматически позаботится о вертикальном и горизонтальном масштабировании.
Вам не нужно думать о том, как реплицировать таблицу и разбивать её на сегменты.

В этом примере самоуправляемый сервер ClickHouse является *источником*, а сервис ClickHouse Cloud — *пунктом назначения*.

<div id="overview">
  ### Обзор
</div>

Процесс выглядит следующим образом:

1. Добавьте в исходный сервис пользователя только для чтения
2. Продублируйте структуру исходной таблицы в целевом сервисе
3. Перенесите данные из источника в целевой сервис методом Pull или Push — в зависимости от сетевой доступности источника
4. Удалите исходный сервер из IP Access List целевого сервиса (если применимо)
5. Удалите из исходного сервиса пользователя только для чтения

<div id="migration-of-tables-from-one-system-to-another">
  ### Миграция таблиц из одной системы в другую:
</div>

В этом примере показана миграция одной таблицы с самоуправляемого сервера ClickHouse в ClickHouse Cloud.

<Info>
  **Совместимость**

  Если вы замечаете различия в поведении между самоуправляемым развертыванием ClickHouse и сервисом ClickHouse Cloud,
  это может быть связано с [настройкой совместимости](/docs/ru/reference/settings/session-settings#compatibility).
  В Cloud совместимость задается при создании сервиса и не меняется на уровне сервиса, чтобы клиенты получали предсказуемое поведение даже по мере обновления сервиса.
  Если вы хотите изменить совместимость, вы можете отправить запрос через [службу поддержки](https://clickhouse.com/support/program).
</Info>

<div id="on-the-source-clickhouse-system-the-system-that-currently-hosts-the-data">
  ### В исходной системе ClickHouse (системе, где сейчас хранятся данные)
</div>

* Добавьте пользователя с правами только на чтение, который сможет читать исходную таблицу (`db.table` в этом примере)

```sql theme={null}
CREATE USER exporter
IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
SETTINGS readonly = 1;
```

```sql theme={null}
GRANT SELECT ON db.table TO exporter;
```

* Скопируйте определение таблицы

```sql theme={null}
SELECT create_table_query
FROM system.tables
WHERE database = 'db' AND table = 'table'
```

<div id="on-the-destination-clickhouse-cloud-system">
  ### В целевой системе ClickHouse Cloud:
</div>

* Создайте целевую базу данных:

```sql theme={null}
CREATE DATABASE db
```

* Используя оператор CREATE TABLE для исходной таблицы, создайте таблицу назначения.

<Tip>
  При выполнении оператора CREATE измените ENGINE на ReplicatedMergeTree без каких-либо параметров. В ClickHouse Cloud таблицы всегда реплицируются, и правильные параметры подставляются автоматически. При этом сохраните секции `ORDER BY`, `PRIMARY KEY`, `PARTITION BY`, `SAMPLE BY`, `TTL` и `SETTINGS`.
</Tip>

```sql theme={null}
CREATE TABLE db.table ...
```

* Используйте функцию `remoteSecure`, чтобы pull данные из самоуправляемого источника

<Image img="https://mintcdn.com/private-7c7dfe99/B2SPNiDHMxYV1gTC/images/integrations/migration/self-managed-03.webp?fit=max&auto=format&n=B2SPNiDHMxYV1gTC&q=85&s=c3b3f850953b88fa14a1abf71db66b68" size="lg" alt="Миграция самоуправляемого ClickHouse" width="2048" height="936" data-path="images/integrations/migration/self-managed-03.webp" />

```sql theme={null}
INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
```

<Note>
  Если исходная система недоступна из внешних сетей, данные можно не pull, а push, так как функция `remoteSecure` работает и для выборок, и для вставки. См. следующий вариант.
</Note>

* Используйте функцию `remoteSecure`, чтобы push данные в сервис ClickHouse Cloud

<Image img="https://mintcdn.com/private-7c7dfe99/B2SPNiDHMxYV1gTC/images/integrations/migration/self-managed-04.webp?fit=max&auto=format&n=B2SPNiDHMxYV1gTC&q=85&s=850053e2837cf32fc40020a82eaba085" size="lg" alt="Миграция самоуправляемого ClickHouse" width="2048" height="936" data-path="images/integrations/migration/self-managed-04.webp" />

<Tip>
  **Добавьте удалённую систему в IP Access List сервиса ClickHouse Cloud**

  Чтобы функция `remoteSecure` могла подключиться к вашему сервису ClickHouse Cloud, IP-адрес удалённой системы должен быть разрешён в IP Access List. Разверните раздел **Manage your IP Access List** под этой подсказкой, чтобы получить дополнительную информацию.
</Tip>

<Accordion title="Управление IP Access List">
  В списке сервисов ClickHouse Cloud выберите сервис, с которым будете работать, и перейдите в раздел **Settings**. Если в IP Access List нет IP-адреса или диапазона IP-адресов удалённой системы, которой нужно подключиться к вашему сервису ClickHouse Cloud, это можно исправить с помощью **Add IPs**:

  <div className="ch-image-md">
    <Frame>
      <img src="https://mintcdn.com/private-7c7dfe99/CFFsa2agBPbviR4r/images/_snippets/ip-allow-list-check-list.webp?fit=max&auto=format&n=CFFsa2agBPbviR4r&q=85&s=14fc8b7b7a3e42ebdd45507e630d4702" alt="Проверьте, разрешён ли трафик с вашего IP-адреса в IP Access List сервиса" width="3840" height="2042" data-path="images/_snippets/ip-allow-list-check-list.webp" />
    </Frame>
  </div>

  Добавьте отдельный IP-адрес или диапазон адресов, которым нужно подключаться к вашему сервису ClickHouse Cloud. При необходимости измените поля формы, а затем нажмите **Save**.

  <div className="ch-image-md">
    <Frame>
      <img src="https://mintcdn.com/private-7c7dfe99/CFFsa2agBPbviR4r/images/_snippets/ip-allow-list-add-current-ip.webp?fit=max&auto=format&n=CFFsa2agBPbviR4r&q=85&s=cab1bb3c9ae950e59acdb2cd5daeaea4" alt="Добавьте свой текущий IP-адрес в IP Access List в ClickHouse Cloud" width="1188" height="796" data-path="images/_snippets/ip-allow-list-add-current-ip.webp" />
    </Frame>
  </div>
</Accordion>

```sql theme={null}
INSERT INTO FUNCTION
remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table',
'default', 'PASS') SELECT * FROM db.table
```

<div id="migrating-between-clickhouse-cloud-services">
  ## Миграция между сервисами ClickHouse Cloud
</div>

<Image img="https://mintcdn.com/private-7c7dfe99/B2SPNiDHMxYV1gTC/images/integrations/migration/self-managed-05.webp?fit=max&auto=format&n=B2SPNiDHMxYV1gTC&q=85&s=4f6403d5e2042312f4b14ac9c99b5fcd" size="lg" alt="Миграция самоуправляемого ClickHouse" width="2048" height="356" data-path="images/integrations/migration/self-managed-05.webp" />

Вот несколько примеров, когда может потребоваться миграция данных между сервисами ClickHouse Cloud:

* Миграция данных из восстановленной резервной копии
* Копирование данных из сервиса разработки в staging-сервис (или из staging в production)

В этом примере используются два сервиса ClickHouse Cloud, которые далее будут называться *источник* и *пункт назначения*. Данные будут переноситься из источника в пункт назначения по схеме pull. При желании можно использовать и push, но здесь показан pull, так как в этом случае используется пользователь только для чтения.

<Image img="https://mintcdn.com/private-7c7dfe99/B2SPNiDHMxYV1gTC/images/integrations/migration/self-managed-06.webp?fit=max&auto=format&n=B2SPNiDHMxYV1gTC&q=85&s=9570badf0b96ecac3d9c76570627cfac" size="lg" alt="Миграция самоуправляемого ClickHouse" width="2048" height="356" data-path="images/integrations/migration/self-managed-06.webp" />

Миграция состоит из нескольких шагов:

1. Определите один сервис ClickHouse Cloud как *источник*, а другой — как *пункт назначения*
2. Добавьте пользователя только для чтения в исходный сервис
3. Продублируйте структуру исходной таблицы в целевом сервисе
4. Временно разрешите доступ по IP к исходному сервису
5. Скопируйте данные из источника в пункт назначения
6. Снова настройте IP Access List для пункта назначения
7. Удалите пользователя только для чтения из исходного сервиса

<div id="add-a-read-only-user-to-the-source-service">
  #### Добавьте в исходный сервис пользователя с правом только на чтение
</div>

* Добавьте пользователя с правом только на чтение, которому будет доступно чтение исходной таблицы (`db.table` в этом примере)

  ```sql theme={null}
  CREATE USER exporter
  IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
  SETTINGS readonly = 1;
  ```

  ```sql theme={null}
  GRANT SELECT ON db.table TO exporter;
  ```

* Скопируйте определение таблицы
  ```sql theme={null}
  select create_table_query
  from system.tables
  where database = 'db' and table = 'table'
  ```

<div id="duplicate-the-table-structure-on-the-destination-service">
  #### Продублируйте структуру таблицы в целевом сервисе
</div>

В целевом сервисе создайте базу данных, если она ещё не существует:

* Создайте целевую базу данных:
  ```sql theme={null}
  CREATE DATABASE db
  ```

* Используя оператор CREATE TABLE из исходного сервиса, создайте таблицу в целевом сервисе.

  В целевом сервисе создайте таблицу, используя результат `select create_table_query...` из исходного сервиса:

  ```sql theme={null}
  CREATE TABLE db.table ...
  ```

<div id="allow-remote-access-to-the-source-service">
  #### Разрешите удалённый доступ к сервису-источнику
</div>

Чтобы pull данные из источника в пункт назначения, сервис-источник должен принимать подключения. Временно отключите функцию IP Access List на сервисе-источнике.

<Tip>
  Если вы планируете и дальше использовать исходный сервис ClickHouse Cloud, экспортируйте текущий IP Access List в JSON‑файл, прежде чем открывать доступ отовсюду; это позволит затем импортировать список доступа обратно после переноса данных.
</Tip>

Измените список разрешённых и временно выберите доступ **Anywhere**. Подробности см. в документации [IP Access List](/docs/ru/products/cloud/guides/security/connectivity/setting-ip-filters).

<div id="copy-the-data-from-source-to-destination">
  #### Скопируйте данные из исходного сервиса в целевой сервис
</div>

* Используйте функцию `remoteSecure`, чтобы pull данные из исходного сервиса ClickHouse Cloud
  Подключитесь к целевому сервису. Выполните эту команду на целевом сервисе ClickHouse Cloud:

  ```sql theme={null}
  INSERT INTO db.table SELECT * FROM
  remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
  ```

* Проверьте данные в целевом сервисе

<div id="re-establish-the-ip-access-list-on-the-source">
  #### Повторно настройте IP Access List для исходного сервиса
</div>

Если вы ранее экспортировали список доступа, то можете импортировать его обратно с помощью **Share**; в противном случае снова добавьте свои IP-адреса в список доступа.

<div id="remove-the-read-only-exporter-user">
  #### Удалите пользователя `exporter` только для чтения
</div>

```sql theme={null}
DROP USER exporter
```

* Измените IP Access List сервиса, чтобы ограничить доступ
