Перейти к основному содержимому

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

Вы можете перенести таблицы из одной или нескольких баз данных ClickHouse® в облачную базу данных ClickHouse® с помощью облака для Trino. Такой способ подходит, если нужно перенести отдельные таблицы, отфильтровать или преобразовать данные при переносе.

Сервер с исходной базой данных и кластер ClickHouse® с целевой базой данных подключаются к облаку для Trino как два каталога с помощью коннектора ClickHouse. Каждая база данных отображается в каталоге как схема. Trino читает данные из исходной базы данных и записывает их в целевую в одном SQL-запросе, без промежуточных файлов и выгрузок.

При переносе данных с помощью Trino действуют ограничения.

Ограничения

Гарантия переноса данных

Облако для Trino находится на стадии публичного тестирования (public preview):

  • продукт предоставляется без SLA;
  • доступность сервисов не гарантируется;
  • возможны сбои в работе продукта.

Перед переносом критичных данных сделайте резервную копию исходных таблиц

Типы данных

Trino поддерживает часть типов данных ClickHouse®: целые и дробные числа, Decimal, Bool, String, FixedString, Date, DateTime, Enum, UUID, IPv4 и IPv6. Столбцы с другими типами данных (например, Array, Map, Tuple и DateTime64) Trino по умолчанию не поддерживает, и запрос SELECT * их не покажет. Если в таблице есть столбцы с неподдерживаемыми типами данных, перечислите в запросах INSERT и SELECT только поддерживаемые столбцы — остальные получат значения по умолчанию. Подробнее в разделе Type mapping документации Trino.

Если нужно перенести столбцы всех типов, используйте стандартные средства ClickHouse®, например функцию remoteSecure. Подробнее о переносе данных с помощью remoteSecure в инструкции Миграция баз данных ClickHouse® в облачные базы данных ClickHouse®

Строки

Trino читает столбцы String как VARBINARY. На перенос данных это не влияет — в целевую таблицу записываются те же строки. Чтобы посмотреть строки в Trino в читаемом виде, используйте функцию from_utf8()

Объекты базы данных

Trino переносит только данные таблиц. Материализованные представления, словари, пользователей, роли и профили настроек создайте в целевом кластере вручную

Шардирование

Инструкция рассчитана на целевой кластер с одним шардом: Trino записывает данные на ноду, адрес которой указан в каталоге. Для кластера из нескольких шардов записывайте данные в таблицу с движком Distributed

Согласованность данных

Каждая таблица читается в определенный момент времени. Если не остановить запись в исходной базе данных на время переноса, СУБД продолжит операции записи в таблицы, из-за чего часть данных окажется несогласованной. Остановите запись в исходной базе данных на время переноса данных или повторно перенесите изменившиеся данные перед переключением приложения

Таблицы с фоновым слиянием строк

В таблицах ReplacingMergeTree, CollapsingMergeTree и похожих количество строк в исходной базе данных и целевом кластере может отличаться до завершения фоновых слияний

Место на диске

При записи через временную таблицу на диске целевого кластера должно быть достаточно места для объема переносимых данных

Перенос данных через интернет

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

Если вы хотите перенести данные из Trino в ClickHouse® через приватную подсеть, целевой кластер ClickHouse® и кластер Trino должны находиться в одном пуле и одной приватной подсети

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

  1. Подготовьте сервер с исходной базой данных ClickHouse®.
  2. Подготовьте целевой кластер ClickHouse®.
  3. Создайте кластер Trino с каталогами.
  4. Подключитесь к кластеру Trino.
  5. Проверьте каталоги.
  6. Перенесите данные с помощью Trino.
  7. Проверьте результат.
  8. Переключите сервисы.

1. Подготовить сервер с исходной базой данных ClickHouse®

Чтобы защитить данные от изменения в исходной базе данных, Trino будет подключаться к ней от имени отдельного пользователя с правами только на чтение.

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

  2. Создайте нового пользователя и выдайте ему права только на чтение с помощью привилегии SELECT:

    CREATE USER <user_name> IDENTIFIED WITH sha256_password BY '<password>';
    GRANT SELECT ON <source_database>.* TO <user_name>;

    Укажите:

    • <user_name> — имя пользователя;
    • <password> — пароль пользователя;
    • <source_database> — имя базы данных, из которой нужно перенести данные.

    Если вам нужно перенести данные из нескольких баз данных, выдайте привилегию SELECT на каждую.

  3. Убедитесь, что сервер доступен из интернета по публичному IP-адресу или DNS-адресу.

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

  5. Если на сервере используется фильтрация трафика, разрешите входящие подключения на HTTPS-порт ClickHouse® в файрволе или группах безопасности облачного провайдера.

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

к сведению

Облако для Trino доступно только в пуле ru-7. Если вы хотите перенести данные из Trino в облачную базу данных ClickHouse® через приватную подсеть, создайте кластер ClickHouse® в пуле ru-7 и используйте одну подсеть для кластеров ClickHouse® и Trino.

Если кластеры ClickHouse® и Trino будут находиться в разных пулах, Trino сможет подключаться к ClickHouse® только через интернет по публичному IP-адресу.

  1. Создайте кластер ClickHouse®. При создании кластера:

    • если хотите перенести данные через приватную подсеть, выберите локацию — пул ru-7;

    • в блоке Конфигурация групп нод выберите конфигурацию с размером диска, достаточным для объема переносимых данных.

  2. Если хотите перенести данные через интернет, подключите публичный IP-адрес к шарду кластера. Публичные IP-адреса подключаются ко всем нодам шарда одновременно — для каждой ноды отдельный адрес.

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

Используйте инструкцию Создать кластер Trino. При создании кластера:

  • в блоке Сеть:

    • если целевой кластер ClickHouse® создан в пуле ru-7, выберите подсеть целевого кластера;

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

  • в блоке Каталоги добавьте два каталога с типом коннектора ClickHouse для исходной и целевой баз данных. При добавлении каталогов используйте параметры подключения:

ПараметрКаталог сервера с исходной базой данныхКаталог целевого кластера
ХостПубличный IP-адрес или DNS-адрес сервера
  • если кластер ClickHouse® в пуле ru-7 — приватный IP-адрес ноды кластера, можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения → строка ноды → столбец IP-адрес;

  • если кластер ClickHouse® не в пуле ru-7 — публичный IP-адрес ноды кластера, можно скопировать в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения → строка ноды → в столбце IP-адрес нажмите рядом с публичным IP-адресом

ПортПорт для подключения через HTTP-интерфейс, обычно 84438443
База данныхИмя исходной базы данныхdefault
Имя пользователяИмя пользователя, которого вы создали при подготовке сервера с исходной базой данных ClickHouse® на шаге 2admin
ПарольПароль пользователя, которого вы создали при подготовке сервера с исходной базой данных ClickHouse® на шаге 2

Пароль пользователя-администратора — задается при создании кластера. После создания кластера пароль нельзя посмотреть в панели управления, но можно изменить

4. Подключиться к кластеру Trino

Вы можете подключиться к кластеру через графический интерфейс Trino, консольный клиент Trino CLI и DBeaver.

  1. В панели управления в верхнем меню нажмите Продукты и выберите Trino.

  2. В карточке кластера в столбце GUI нажмите .

  3. Введите логин — admin.

  4. Введите пароль администратора — задается при создании кластера. После создания кластера пароль нельзя посмотреть в панели управления, но можно изменить.

  5. Нажмите Log In.

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

Выведите список каталогов, схем и таблиц исходной базы данных и схем целевой базы данных:

SHOW CATALOGS;
SHOW SCHEMAS FROM <source_catalog>;
SHOW TABLES FROM <source_catalog>.<source_database>;
SHOW SCHEMAS FROM <target_catalog>;

Укажите:

  • <source_catalog> — имя каталога сервера с исходной базой данных;
  • <source_database> — имя исходной базы данных;
  • <target_catalog> — имя каталога целевого кластера.

В списке каталогов должны быть оба созданных каталога, а в схеме <source_catalog>.<source_database> — таблицы исходной базы данных.

6. Перенести данные с помощью Trino

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

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

    CALL <target_catalog>.system.execute(query => 'CREATE DATABASE IF NOT EXISTS <target_database>');

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных.
  2. Получите определение со структурой исходной таблицы:

    SHOW CREATE TABLE <source_database>.<source_table>;

    Укажите:

    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы.

    Скопируйте результат запроса.

  3. Создайте таблицу в целевом кластере:

    CALL <target_catalog>.system.execute(query => '
    <create_table_query>
    ');

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <create_table_query> — определение со структурой исходной таблицы, которое вы получили и скопировали на шаге 2.

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

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

    SET SESSION <target_catalog>.non_transactional_insert = true;

    Укажите <target_catalog> — имя каталога целевого кластера.

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

    INSERT INTO <target_catalog>.<target_database>.<target_table>
    SELECT * FROM <source_catalog>.<source_database>.<source_table>;

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы;
    • <source_catalog> — имя каталога сервера с исходной базой данных;
    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы.

    В выводе появится количество записанных строк.

  6. Если на шаге 4 вы отключили запись через временную таблицу и при записи данных в целевую таблицу возникла ошибка, в ней останется только часть строк. Чтобы заново перенести все данные:

    6.1. Очистите целевую таблицу:

    TRUNCATE TABLE <target_catalog>.<target_database>.<target_table>;

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.

    6.2. Повторите шаг 5.

  7. Повторите шаги 2–6 для каждой таблицы.

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

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

    SELECT
    (SELECT count(*) FROM <source_catalog>.<source_database>.<source_table>) AS source_rows,
    (SELECT count(*) FROM <target_catalog>.<target_database>.<target_table>) AS target_rows;

    Укажите:

    • <source_catalog> — имя каталога сервера с исходной базой данных;
    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы;
    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.
  2. Найдите дни, за которые количество строк не совпадает:

    SELECT <column>, count(*) AS rows FROM <source_catalog>.<source_database>.<source_table> GROUP BY <column>
    EXCEPT
    SELECT <column>, count(*) AS rows FROM <target_catalog>.<target_database>.<target_table> GROUP BY <column>;

    Укажите:

    • <column> — столбец с датой, по которому сверяется количество строк;
    • <source_catalog> — имя каталога сервера с исходной базой данных;
    • <source_database> — имя исходной базы данных;
    • <source_table> — имя исходной таблицы;
    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.

    Пустой вывод означает, что количество строк совпадает за все дни.

  3. Выведите список столбцов целевой таблицы:

    SHOW COLUMNS FROM <target_catalog>.<target_database>.<target_table>;

    Укажите:

    • <target_catalog> — имя каталога целевого кластера;
    • <target_database> — имя целевой базы данных;
    • <target_table> — имя целевой таблицы.
  4. Сверьте столбцы целевой таблицы, которые вы получили на шаге 3, со структурой исходной таблицы, которую вы получили при переносе данных на шаге 2.

8. Переключить сервисы

  1. Переключите сервисы на целевой кластер — подробнее в инструкции Подключиться к кластеру ClickHouse®.

  2. Если в кластере ClickHouse® вы подключали публичный IP-адрес и он больше не нужен, отключите его.

  3. Если кластер Trino больше не нужен, удалите его.

  4. Если сервер с исходной базой данных ClickHouse® больше не нужен, удалите его.

ClickHouse® является зарегистрированным товарным знаком ClickHouse®, Inc. https://clickhouse.com.