ClickHouse Cloud теперь предлагает ClickPipes для миграции внешней базы данных PostgreSQL в сервис Managed Postgres. Эта встроенная интеграция упрощает подключение к исходной базе данных, экспорт схемы, её импорт в Managed Postgres и настройку непрерывной репликации.
Предварительные требования
- Доступ к вашей исходной базе данных PostgreSQL с учетной записью пользователя, у которой есть права на репликацию. Следуйте руководству по настройке для соответствующего источника:
- Amazon RDS Postgres
- Amazon Aurora Postgres
- Supabase Postgres
- Google Cloud SQL Postgres
- Azure Flexible Server for Postgres
- Neon Postgres
- Crunchy Bridge Postgres
- TimescaleDB
- Универсальный источник Postgres для любого другого провайдера или самоуправляемого экземпляра
- Сервис ClickHouse Managed Postgres в качестве целевого сервиса для миграции. Если у вас его еще нет, см. руководство по быстрому началу.
- На локальной машине должны быть установлены
pg_dumpиpsql. Оба входят в стандартный набор клиентских инструментов PostgreSQL.
Что нужно учесть перед миграцией
- Распространение DDL: непрерывная репликация (CDC) фиксирует операции DML и
ADD COLUMN. Другие изменения DDL, такие какDROP COLUMNиALTER COLUMN, не распространяются автоматически, и их нужно применять на целевой стороне вручную.
Шаг 1: Подключитесь к исходной базе данных
Откройте консоль ClickHouse Cloud и выберите свой сервис Managed Postgres.

На левой боковой панели нажмите источник данных.

Нажмите Start import.

Заполните сведения о подключении к исходной базе данных PostgreSQL: host, port, username, password и имя базы данных. Включите TLS, если это требуется для исходной базы.
Если вам нужно приватное подключение к исходной базе данных, можно выбрать SSH tunneling и указать необходимые параметры SSH. Это позволит миграции безопасно подключаться к базам данных, которые недоступны из публичной сети.
Выберите метод ингестии:
- Initial load + CDC — копирует существующие данные, а затем поддерживает синхронизацию целевой системы с последующими изменениями.
- Initial load only — однократное копирование без дальнейшей репликации.
- CDC only — пропускает начальное копирование и реплицирует только новые изменения, начиная с этого момента.

Нажмите Next.
Автоматизированная миграция схемы

При выборе этого варианта ClickPipe автоматически получит схему исходной базы данных и применит её к сервису Managed Postgres на этапе Setup после создания ClickPipe.
Эта возможность предполагает пустую целевую базу данных, поскольку переносит из исходной базы данных все объекты независимо от того, какие таблицы вы выберете позже в мастере. Если целевая база данных уже содержит данные или требуется более гибкая настройка, выберите режим Manual.
Выберите целевую базу данных в раскрывающемся списке или нажмите Create a new database, чтобы создать её.

Мониторинг
Ход миграции схемы можно отслеживать в представлении сведений о ClickPipes. В разделе Журналы отображаются статус миграции схемы и все возникшие ошибки.
Этот режим имеет следующие ограничения:
- Пайпы, использующие SSH tunneling, не поддерживают автоматическую миграцию схемы. Схему необходимо экспортировать и импортировать вручную.
Ручная миграция схемы
Если в целевой базе данных уже есть данные или вам нужна более индивидуальная настройка, а не чистое состояние, которое предполагает автоматический режим, выберите режим Manual.

Экспортируйте схему базы данных
Мастер покажет команду pg_dump, уже заполненную сведениями о подключении к исходной базе данных. Выполните её в терминале:

pg_dump \
-h <source_host> \
-U <source_user> \
-d <source_database> \
--schema-only \
-f pg.sqlВ результате в текущем каталоге будет создан файл pg.sql.

Нажмите Next.
Импортируйте схему в свой сервис Managed Postgres
Выберите целевую базу данных в раскрывающемся списке или нажмите Create a new database, чтобы создать новую.
Мастер покажет команду psql для применения дампа схемы к вашему сервису Managed Postgres. Выполните её в терминале:

psql \
-h <target_host> \
-p 5432 \
-U <target_user> \
-d <target_database> \
-f pg.sql
Нажмите Next.
Шаг 4: Настройка параметров ингестии
Укажите публикацию, которую нужно использовать для логической репликации. Если оставить это поле пустым, публикация будет создана автоматически.
Разверните Расширенные настройки репликации, чтобы настроить пропускную способность:
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
| Интервал синхронизации (секунды) | 10 | Как часто опрашивается слот репликации |
| Параллельные потоки для начальной загрузки | 4 | Количество потоков для этапа пакетной загрузки |
| Размер батча Pull | 100,000 | Количество строк, извлекаемых за один батч репликации |
| Количество строк снимка на партицию | 100000 | Размер партиции для снимков больших таблиц |
| Количество таблиц для снимков в параллельном режиме | 1 | Количество таблиц, для которых снимки создаются одновременно |

Нажмите Далее.
Шаг 5: Выберите таблицы
Выберите таблицы, которые нужно реплицировать. Таблицы сгруппированы по схемам. Вы можете выбрать отдельные таблицы или развернуть схему, чтобы выбрать все таблицы в ней.

Нажмите Create migration.
Отслеживание миграции
После создания миграции она появится в списке источников данных со статусом Running.

Нажмите на миграцию, чтобы открыть подробное представление. На вкладке Tables отображается ход начальной загрузки для каждой таблицы, включая количество обработанных строк, число партиций и среднее время на партицию. На вкладке Metrics после запуска CDC отображаются задержка репликации и пропускная способность.

Задачи после миграции
После завершения начальной загрузки и, если используется CDC, когда задержка репликации близка к нулю:
Проверьте количество строк. Выборочно сверьте критически важные таблицы в исходной и целевой системах, прежде чем переключать трафик:
SELECT COUNT(*) FROM public.orders;Остановите запись в источнике. Приостановьте запись со стороны приложения. Чтобы принудительно перевести систему в режим только для чтения во время переключения:
ALTER DATABASE <source_db> SET default_transaction_read_only = on;Убедитесь, что репликация синхронизирована. Сравните последнюю строку в источнике и в целевой системе:
-- Выполните на источнике и целевой базе данных
SELECT MAX(id), MAX(updated_at) FROM public.orders;Сбросьте последовательности. Приведите последовательности в соответствие с текущими максимальными значениями в каждой таблице:
DO $$
DECLARE r RECORD;
BEGIN
FOR r IN
SELECT
n.nspname AS schema_name,
c.relname AS table_name,
a.attname AS column_name,
pg_get_serial_sequence(format('%I.%I', n.nspname, c.relname), a.attname) AS seq_name
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_attribute a ON a.attrelid = c.oid
WHERE c.relkind = 'r'
AND a.attnum > 0
AND NOT a.attisdropped
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
LOOP
IF r.seq_name IS NOT NULL THEN
EXECUTE format(
'SELECT setval(%L, COALESCE((SELECT MAX(%I) FROM %I.%I), 0) + 1, false)',
r.seq_name, r.column_name, r.schema_name, r.table_name
);
END IF;
END LOOP;
END $$;Переключите трафик приложения. Направьте операции чтения и записи на сервис Managed Postgres и отслеживайте ошибки, нарушения ограничений и состояние репликации.
Выполните очистку. После переключения и подтверждения, что новый сервис работает нормально, удалите миграцию из раздела Источники данных. Если вы использовали CDC, удалите слот репликации в источнике, чтобы освободить ресурсы:
SELECT pg_drop_replication_slot('<slot_name>');