> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-revert-104359-revert-104251-parquet-single.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Перенос данных PostgreSQL с помощью источников данных в ClickPipes

> Узнайте, как перенести базу данных PostgreSQL в ClickHouse Managed Postgres с помощью ClickPipes.

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

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <span>Бета</span>
            </a>;
  }
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#beta-features" className="betaBadge">
            <span>Возможность в статусе бета</span>
        </a>;
};

<BetaBadge link="https://clickhouse.com/cloud/postgres" galaxyTrack={true} galaxyEvent="docs.managed-postgres.migration-guide-clickhouse-cloud-beta" />

ClickHouse Cloud теперь предлагает ClickPipes для миграции внешней базы данных PostgreSQL в сервис Managed Postgres. Эта встроенная интеграция упрощает подключение к исходной базе данных, экспорт схемы, её импорт в Managed Postgres и настройку непрерывной репликации.

<div id="prerequisites">
  ## Предварительные требования
</div>

* Доступ к вашей исходной базе данных PostgreSQL с учетной записью пользователя, у которой есть права на репликацию. Следуйте руководству по настройке для соответствующего источника:
  * [Amazon RDS Postgres](/ru/integrations/clickpipes/postgres/source/rds)
  * [Amazon Aurora Postgres](/ru/integrations/clickpipes/postgres/source/aurora)
  * [Supabase Postgres](/ru/integrations/clickpipes/postgres/source/supabase)
  * [Google Cloud SQL Postgres](/ru/integrations/clickpipes/postgres/source/google-cloudsql)
  * [Azure Flexible Server for Postgres](/ru/integrations/clickpipes/postgres/source/azure-flexible-server-postgres)
  * [Neon Postgres](/ru/integrations/clickpipes/postgres/source/neon-postgres)
  * [Crunchy Bridge Postgres](/ru/integrations/clickpipes/postgres/source/crunchy-postgres)
  * [TimescaleDB](/ru/integrations/clickpipes/postgres/source/timescale)
  * [Универсальный источник Postgres](/ru/integrations/clickpipes/postgres/source/generic) для любого другого провайдера или самоуправляемого экземпляра
* Сервис ClickHouse Managed Postgres в качестве целевого сервиса для миграции. Если у вас его еще нет, см. [руководство по быстрому началу](/ru/products/managed-postgres/quickstart).
* На локальной машине должны быть установлены `pg_dump` и `psql`. Оба входят в стандартный набор клиентских инструментов PostgreSQL.

<div id="considerations">
  ## Что нужно учесть перед миграцией
</div>

* **Распространение DDL**: непрерывная репликация (CDC) фиксирует операции DML и `ADD COLUMN`. Другие изменения DDL, такие как `DROP COLUMN` и `ALTER COLUMN`, не распространяются автоматически, и их нужно применять на целевой стороне вручную.

<Note>
  Если во время миграции возникнут проблемы, ознакомьтесь с [FAQ по миграциям Managed Postgres](/ru/products/managed-postgres/migrations/faq), где описаны распространённые ошибки и способы их устранения.
</Note>

<div id="step-1-connect">
  ## Шаг 1: Подключитесь к исходной базе данных
</div>

Откройте [консоль ClickHouse Cloud](https://clickhouse.cloud) и выберите свой сервис Managed Postgres.

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/servicecard.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=289741405a0299a5867abc1423c56bc3" alt="Карточка сервиса Managed Postgres в списке сервисов ClickHouse Cloud" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/servicecard.webp" />

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

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/overview.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=5990542940214be859f2a20c494502b2" alt="Пункт источник данных на боковой панели сервиса Managed Postgres" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/overview.webp" />

Нажмите **Start import**.

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/startimport.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=4716cc9d860f2f0d9522b6ea99e0c0e9" alt="Страница источник данных с кнопкой Start import" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/startimport.webp" />

Заполните сведения о подключении к исходной базе данных PostgreSQL: host, port, username, password и имя базы данных. Включите **TLS**, если это требуется для исходной базы.

Если вам нужно приватное подключение к исходной базе данных, можно выбрать **SSH tunneling** и указать необходимые параметры SSH. Это позволит миграции безопасно подключаться к базам данных, которые недоступны из публичной сети.

Выберите метод ингестии:

* **Initial load + CDC** — копирует существующие данные, а затем поддерживает синхронизацию целевой системы с последующими изменениями.
* **Initial load only** — однократное копирование без дальнейшей репликации.
* **CDC only** — пропускает начальное копирование и реплицирует только новые изменения, начиная с этого момента.

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/migrationform.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=79dfe4a2ce35b448c0c59e1ff4e97582" alt="Шаг 1: форма подключения к исходной базе данных с вариантами метода ингестии" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/migrationform.webp" />

Нажмите **Next**.

<div id="automated-schema-migration">
  ## Автоматизированная миграция схемы
</div>

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/76_4bqp95JvxWs34/images/managed-postgres/pg_dump_restore/automated.webp?fit=max&auto=format&n=76_4bqp95JvxWs34&q=85&s=18e2f35e5eb5012e329be8aed22313c4" alt="Шаг 2: автоматизированная миграция схемы с выбором целевой базы данных" size="lg" border width="2632" height="742" data-path="images/managed-postgres/pg_dump_restore/automated.webp" />

При выборе этого варианта ClickPipe автоматически получит схему исходной базы данных и применит её к сервису Managed Postgres на этапе [Setup](/ru/integrations/clickpipes/postgres/lifecycle#setup) после создания ClickPipe.

Эта возможность предполагает **пустую целевую базу данных**, поскольку переносит из исходной базы данных все объекты независимо от того, какие таблицы вы выберете позже в мастере. Если целевая база данных уже содержит данные или требуется более гибкая настройка, выберите режим [**Manual**](#manual-schema-migration).

Выберите целевую базу данных в раскрывающемся списке или нажмите **Create a new database**, чтобы создать её.

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/76_4bqp95JvxWs34/images/managed-postgres/pg_dump_restore/newdb.webp?fit=max&auto=format&n=76_4bqp95JvxWs34&q=85&s=2efc6920d5bac8606aa67669e1d81d77" alt="Диалог создания новой базы данных Postgres" size="lg" border width="1642" height="742" data-path="images/managed-postgres/pg_dump_restore/newdb.webp" />

<div id="monitoring">
  ### Мониторинг
</div>

Ход миграции схемы можно отслеживать в представлении сведений о ClickPipes. В разделе **Журналы** отображаются статус миграции схемы и все возникшие ошибки.

Этот режим имеет следующие ограничения:

* Пайпы, использующие SSH tunneling, не поддерживают автоматическую миграцию схемы. Схему необходимо [экспортировать и импортировать вручную](#manual-schema-migration).

<div id="manual-schema-migration">
  ## Ручная миграция схемы
</div>

Если в целевой базе данных уже есть данные или вам нужна более индивидуальная настройка, а не чистое состояние, которое предполагает автоматический режим, выберите режим **Manual**.

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/76_4bqp95JvxWs34/images/managed-postgres/pg_dump_restore/manual.webp?fit=max&auto=format&n=76_4bqp95JvxWs34&q=85&s=c576b22c0898bcdf971c58091be56a0e" alt="Шаг 2: ручная миграция схемы с помощью команды экспорта pg_dump" size="lg" border width="2632" height="1022" data-path="images/managed-postgres/pg_dump_restore/manual.webp" />

<div id="step-2-export-schema">
  ### Экспортируйте схему базы данных
</div>

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

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/nextexport.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=24b6cd4f45113a8c2df3404de2b38fb2" alt="Шаг 2: команда pg_dump для экспорта схемы" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/nextexport.webp" />

```shell theme={null}
pg_dump \
  -h <source_host> \
  -U <source_user> \
  -d <source_database> \
  --schema-only \
  -f pg.sql
```

В результате в текущем каталоге будет создан файл `pg.sql`.

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/psqlexport.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=964b2087e1cf5957ff507a4287a90b09" alt="Вывод терминала после выполнения pg_dump" size="lg" border width="1452" height="422" data-path="images/managed-postgres/pgpg/psqlexport.webp" />

Нажмите **Next**.

<div id="step-3-import-schema">
  ### Импортируйте схему в свой сервис Managed Postgres
</div>

Выберите целевую базу данных в раскрывающемся списке или нажмите **Create a new database**, чтобы создать новую.

Мастер покажет команду `psql` для применения дампа схемы к вашему сервису Managed Postgres. Выполните её в терминале:

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/nextimport.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=d49484c6fb84089a91ee7cc7e92b3544" alt="Шаг 3: команда psql для импорта схемы" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/nextimport.webp" />

```shell theme={null}
psql \
  -h <target_host> \
  -p 5432 \
  -U <target_user> \
  -d <target_database> \
  -f pg.sql
```

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/psqlimport.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=79ff27ca6baab542a892a954c90f8313" alt="Вывод терминала после выполнения импорта схемы через psql" size="lg" border width="2362" height="762" data-path="images/managed-postgres/pgpg/psqlimport.webp" />

Нажмите **Next**.

<div id="step-4-ingestion-settings">
  ## Шаг 4: Настройка параметров ингестии
</div>

Укажите публикацию, которую нужно использовать для логической репликации. Если оставить это поле пустым, публикация будет создана автоматически.

Разверните **Расширенные настройки репликации**, чтобы настроить пропускную способность:

| Параметр                                            | Значение по умолчанию | Описание                                                     |
| --------------------------------------------------- | --------------------- | ------------------------------------------------------------ |
| Интервал синхронизации (секунды)                    | 10                    | Как часто опрашивается слот репликации                       |
| Параллельные потоки для начальной загрузки          | 4                     | Количество потоков для этапа пакетной загрузки               |
| Размер батча Pull                                   | 100,000               | Количество строк, извлекаемых за один батч репликации        |
| Количество строк снимка на партицию                 | 100000                | Размер партиции для снимков больших таблиц                   |
| Количество таблиц для снимков в параллельном режиме | 1                     | Количество таблиц, для которых снимки создаются одновременно |

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/advancedsettings.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=694cd7a04e7f0b4328d6d3b27f54928d" alt="Шаг 4: форма параметров ингестии с публикацией и расширенными параметрами репликации" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/advancedsettings.webp" />

Нажмите **Далее**.

<div id="step-5-select-tables">
  ## Шаг 5: Выберите таблицы
</div>

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

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/tablepicker.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=f115cc6daa9c88ffdbe0bdcc5c49c3d8" alt="Шаг 5: панель выбора таблиц, сгруппированных по схемам, с кнопкой Create migration" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/tablepicker.webp" />

Нажмите **Create migration**.

<div id="monitor">
  ## Отслеживание миграции
</div>

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

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/migrationlist.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=f48d58085d584d813b98568c3b21f5b8" alt="Список источников данных с миграцией в статусе Running" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/migrationlist.webp" />

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

<Image img="https://mintcdn.com/private-7c7dfe99-revert-104359-revert-104251-parquet-single/g8hpkImHjWTMvqC-/images/managed-postgres/pgpg/initialload.webp?fit=max&auto=format&n=g8hpkImHjWTMvqC-&q=85&s=600899644142bb7b4034953845d86565" alt="Подробное представление миграции со статистикой начальной загрузки по таблицам" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/initialload.webp" />

<div id="post-migration">
  ## Задачи после миграции
</div>

После завершения начальной загрузки и, если используется CDC, когда задержка репликации близка к нулю:

**Проверьте количество строк.** Выборочно сверьте критически важные таблицы в исходной и целевой системах, прежде чем переключать трафик:

```sql theme={null}
SELECT COUNT(*) FROM public.orders;
```

**Остановите запись в источнике.** Приостановьте запись со стороны приложения. Чтобы принудительно перевести систему в режим только для чтения во время переключения:

```sql theme={null}
ALTER DATABASE <source_db> SET default_transaction_read_only = on;
```

**Убедитесь, что репликация синхронизирована.** Сравните последнюю строку в источнике и в целевой системе:

```sql theme={null}
-- Выполните на источнике и целевой базе данных
SELECT MAX(id), MAX(updated_at) FROM public.orders;
```

**Сбросьте последовательности.** Приведите последовательности в соответствие с текущими максимальными значениями в каждой таблице:

```sql theme={null}
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, удалите слот репликации в источнике, чтобы освободить ресурсы:

```sql theme={null}
SELECT pg_drop_replication_slot('<slot_name>');
```

<div id="next-steps">
  ## Следующие шаги
</div>

* [Краткое руководство по Managed Postgres](/ru/products/managed-postgres/quickstart)
* [Сведения о подключении к Managed Postgres](/ru/products/managed-postgres/connection)
* [FAQ по ClickPipes для Postgres](/ru/integrations/clickpipes/postgres/faq)
