[Документация Yandex Cloud](../../index.md) > [Практические руководства](../index.md) > [Построение Data Platform](index.md) > Миграция кластера PostgreSQL

# Миграция кластера PostgreSQL

Чтобы перенести вашу базу данных в сервис Yandex Managed Service for PostgreSQL, нужно непосредственно перенести данные, закрыть старую базу данных на запись и переключить нагрузку на кластер БД в Yandex Cloud.

{% note warning %}

Пользователи автоматически не переносятся в кластер Managed Service for PostgreSQL. Их нужно [создать](../../managed-postgresql/operations/cluster-users.md#adduser) в новом кластере заново.

{% endnote %}

Миграция с помощью Data Transfer позволяет:

* обойтись без создания промежуточной [виртуальной машины](../../glossary/vm.md) или разрешения доступа к вашему кластеру-приемнику Managed Service for PostgreSQL из интернета;
* минимизировать время недоступности базы данных при миграции;
* мигрировать со старых версий PostgreSQL на более новые.

Подробнее в разделе [Какие задачи решает сервис Yandex Data Transfer](../../data-transfer/concepts/use-cases.md).

Чтобы использовать эти способы миграции, разрешите подключение к кластеру-источнику из интернета.

## Перенос данных {#data-transfer}

# Миграция данных с использованием сервиса Yandex Data Transfer {#data-transfer}

{% note info %}

В [регионе Казахстан](../../overview/concepts/region.md) доступна только [зона доступности](../../overview/concepts/geo-scope.md) `kz1-a`.

{% endnote %}


### Необходимые платные ресурсы {#paid-resources}

* Кластер Managed Service for PostgreSQL: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий ([тарифы Managed Service for PostgreSQL](../../managed-postgresql/pricing.md)).
* Публичные IP-адреса, если для хостов кластера включен публичный доступ ([тарифы Virtual Private Cloud](../../vpc/pricing.md)).
* Каждый трансфер: использование вычислительных ресурсов и количество переданных строк данных ([тарифы Data Transfer](../../data-transfer/pricing.md)).


### Перенесите данные {#transfer-data}

1. [Подготовьте кластер-источник](../../data-transfer/operations/prepare.md#source-pg).
1. Подготовьте инфраструктуру:

    {% list tabs group=instructions %}

    - Вручную {#manual}

        1. [Создайте кластер-приемник Managed Service for PostgreSQL](../../managed-postgresql/operations/cluster-create.md) любой подходящей конфигурации. Включите те же [расширения PostgreSQL](../../managed-postgresql/operations/extensions/cluster-extensions.md), что и в кластере-источнике.
        1. [Подготовьте кластер-приемник](../../data-transfer/operations/prepare.md#target-pg).
        1. [Создайте эндпоинт для источника](../../data-transfer/operations/endpoint/index.md#create) со следующими параметрами:

             * **Тип базы данных** — `PostgreSQL`.
             * **Параметры эндпоинта** → **Настройки подключения** — `Пользовательская инсталляция`.

           Укажите параметры подключения к кластеру-источнику.

        1. [Создайте эндпоинт для приемника](../../data-transfer/operations/endpoint/index.md#create) со следующими параметрами:

             * **Тип базы данных** — `PostgreSQL`.
             * **Параметры эндпоинта** → **Настройки подключения** — `Кластер Managed Service for PostgreSQL`.

           Укажите идентификатор кластера-приемника.

        1. [Создайте трансфер](../../data-transfer/operations/transfer.md#create) типа _**Копирование и репликация**_, использующий созданные эндпоинты.
        1. [Активируйте трансфер](../../data-transfer/operations/transfer.md#activate).

            {% note warning %}

            Избегайте любых изменений в схеме данных в кластере-источнике и кластере-приемнике во время работы трансфера. Подробнее в разделе [Работа с базами данных во время трансфера](../../data-transfer/operations/db-actions.md).

            {% endnote %}

    - Terraform {#tf}

        1. Если у вас еще нет Terraform, [установите его](../infrastructure-management/terraform-quickstart.md#install-terraform).
        1. [Получите данные для аутентификации](../infrastructure-management/terraform-quickstart.md#get-credentials). Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
        1. [Настройте и инициализируйте провайдер](../infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).
        1. Поместите конфигурационный файл в отдельную рабочую директорию и [укажите значения параметров](../infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

        1. Скачайте в ту же рабочую директорию файл конфигурации [data-transfer-pgsql-mpg.tf](https://github.com/yandex-cloud-examples/yc-data-transfer-from-on-premise-postgresql-to-cloud/blob/main/data-transfer-pgsql-mpg.tf).

            В этом файле описаны:

            * [сеть](../../vpc/concepts/network.md#network);
            * [подсеть](../../vpc/concepts/network.md#subnet);
            * [группа безопасности](../../vpc/concepts/security-groups.md) и правило, необходимое для подключения к кластеру;
            * кластер-приемник Managed Service for PostgreSQL;
            * эндпоинт для источника;
            * эндпоинт для приемника;
            * трансфер.

        1. Укажите в файле `data-transfer-pgsql-mpg.tf`:

            * [параметры эндпоинта-источника](../../data-transfer/operations/endpoint/source/postgresql.md#on-premise);
            * `pg-extensions` – список [расширений PostgreSQL](../../managed-postgresql/operations/extensions/cluster-extensions.md) в кластере-источнике;
            * параметры кластера-приемника, которые используются и как [параметры эндпоинта-приемника](../../data-transfer/operations/endpoint/target/postgresql.md#managed-service):

                * `target_pgsql_version` — версия PostgreSQL, она должна быть не ниже, чем в кластере-источнике;
                * `target_user` и `target_password` — имя и пароль пользователя-владельца базы данных.

        1. Проверьте корректность файлов конфигурации Terraform с помощью команды:

            ```bash
            terraform validate
            ```

            Если в файлах конфигурации есть ошибки, Terraform на них укажет.

        1. Создайте необходимую инфраструктуру:

            1. Выполните команду для просмотра планируемых изменений:
            
               ```bash
               terraform plan
               ```
            
               Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
            
            1. Если вас устраивают планируемые изменения, внесите их:
               1. Выполните команду:
            
                  ```bash
                  terraform apply
                  ```
            
               1. Подтвердите изменение ресурсов.
               1. Дождитесь завершения операции.

            В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в [консоли управления](https://kz.console.yandex.cloud).

            Трансфер активируется автоматически после создания.

    {% endlist %}

1. Дождитесь перехода трансфера в статус **Реплицируется**.
1. Снимите пишущую нагрузку с кластера-источника.
1. На странице [мониторинга трансфера](../../data-transfer/operations/monitoring.md) дождитесь снижения до нуля характеристики **Maximum data transfer delay**. Это значит, что на кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
1. Переключите нагрузку на кластер-приемник.
1. [Деактивируйте](../../data-transfer/operations/transfer.md#deactivate) трансфер и дождитесь его перехода в статус **Остановлен**.

    Подробнее о статусах трансфера смотрите в разделе [Жизненный цикл трансфера](../../data-transfer/concepts/transfer-lifecycle.md#statuses).


1. Чтобы снизить потребление ресурсов, которые вам не нужны, удалите их:

    {% list tabs group=instructions %}

    - Ресурсы созданы вручную {#manual}

        1. [Удалите кластер Managed Service for PostgreSQL](../../managed-postgresql/operations/cluster-delete.md).
        1. [Удалите остановленный трансфер](../../data-transfer/operations/transfer.md#delete).
        1. [Удалите эндпоинты](../../data-transfer/operations/endpoint/index.md#delete) для источника и приемника.

    - Ресурсы созданы с помощью Terraform {#tf}

        1. В терминале перейдите в директорию с планом инфраструктуры.
        
            {% note warning %}
        
            Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
        
            {% endnote %}
        
        1. Удалите ресурсы:
        
            1. Выполните команду:
        
                ```bash
                terraform destroy
                ```
        
            1. Подтвердите удаление ресурсов и дождитесь завершения операции.
        
            Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.

    {% endlist %}


## Упрощенный перенос данных в новый кластер {#quick-transfer}

После создания кластера Managed Service for PostgreSQL вы можете сразу перенести в него данные из другого кластера Managed Service for PostgreSQL или пользовательской инсталляции базы данных.

При таком способе миграции:

* Трансфер и эндпоинты создаются автоматически.
* С источника на приемник однократно переносится снапшот данных.

### Необходимые платные ресурсы {#paid-resources}

* Кластер Managed Service for PostgreSQL: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий ([тарифы Managed Service for PostgreSQL](../../managed-postgresql/pricing.md)).
* Публичные IP-адреса, если для хостов кластера включен публичный доступ ([тарифы Virtual Private Cloud](../../vpc/pricing.md)).
* Каждый трансфер: использование вычислительных ресурсов и количество переданных строк данных ([тарифы Data Transfer](../../data-transfer/pricing.md)).

### Перенесите данные {#transfer-data-quickly}

1. Откройте страницу **Обзор** нового кластера Managed Service for PostgreSQL.
1. В верхней части экрана нажмите кнопку **Мигрировать данные**.
1. Задайте настройки источника:

    {% list tabs %}

    - Пользовательская инсталляция

      * **Подключение**:

          * **Выбрать существующее** — выберите, чтобы использовать существующее подключение.

            * **Идентификатор подключения** — выберите подключение [Yandex Connection Manager](../../metadata-hub/quickstart/connection-manager.md).
            
            * **База данных** — введите имя БД.
          
          * **Создать новое** — выберите, чтобы создать новое подключение.

            * **Хосты** — укажите IP-адрес или FQDN хоста-мастера. Если на хостах открыты разные порты для подключения, то вы можете задать несколько значений хостов в формате `хост:порт`, при этом значение поля **Порт** не будет учитываться.

            * **Имя пользователя** — введите имя пользователя для подключения к БД.

            * **Пароль** — введите пароль для доступа к БД.

            * **База данных** — введите имя БД.

            * **TLS** — включите, чтобы использовать TLS-соединение.

              * **Сертификат CA** — добавьте содержимое файла сертификата.
      
    - Кластер Managed Service for PostgreSQL

      * **Подключение**:

        * **Выбрать существующее** — выберите, чтобы использовать существующее подключение.

          * **Идентификатор кластера** — выберите кластер, к которому необходимо подключиться.

          * **Идентификатор подключения** — выберите подключение [Yandex Connection Manager](../../metadata-hub/quickstart/connection-manager.md).

          * **База данных** — укажите имя БД в выбранном кластере.

        * **Создать новое** — выберите, чтобы создать новое подключение.

          * **Идентификатор кластера** — выберите кластер, к которому необходимо подключиться.

          * **Имя пользователя** — введите имя пользователя для подключения к БД кластера.

          * **Пароль** — введите пароль пользователя для доступа к БД кластера.

          * **База данных** — укажите имя БД в выбранном кластере.

    {% endlist %}

   {% note warning %}
   
   Чтобы использовать подключение из Connection Manager, у пользователя должны быть [права доступа](../../metadata-hub/operations/connection-access.md) не ниже `connection-manager.user` к этому подключению.
   
   {% endnote %}

1. Задайте настройки приемника:

    * **Идентификатор подключения** — выберите подключение Connection Manager.

    * **База данных** — укажите имя БД в кластере-приемнике.

1. (Опционально) Задайте дополнительные настройки:

    * **Политика очистки** — выберите способ очистки данных в базе-приемнике:

      * `Drop` — полное удаление таблиц, участвующих в трансфере (вариант по умолчанию).

      * `Truncate` — удалить только данные из таблиц, участвующих в трансфере, но оставить схему.

    * **Список включённых таблиц** — будут передаваться данные только из таблиц этого списка.

    * **Список исключённых таблиц** — данные таблиц из этого списка передаваться не будут.

      Списки включают имя [схемы](https://www.postgresql.org/docs/current/ddl-schemas.html) (описание содержания, структуры и ограничений целостности базы данных) и имя таблицы. Для обоих списков поддерживаются выражения вида:

      * `<имя_схемы>.<имя_таблицы>` — полное имя таблицы;
      * `<имя_схемы>.*` — все таблицы в указанной схеме.

      Имена таблиц должны соответствовать регулярному выражению:

      ```text
      ^"?[-_a-zA-Z0-9.]+"?\\."?[$-_a-zA-Z0-9.*]+"?$
      ```

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

    * **Перенос схемы** — выберите элементы схемы БД, которые будут перенесены в процессе активации или деактивации трансфера.

1. Нажмите кнопку **Создать**, чтобы создать трансфер и эндпоинты.

1. [Активируйте](../../data-transfer/operations/transfer.md#activate) трансфер.

1. Дождитесь перехода трансфера в статус **Завершен**.

1. Чтобы снизить потребление ресурсов, которые вам не нужны, удалите их:

    1. [Удалите кластер Managed Service for PostgreSQL](../../managed-postgresql/operations/cluster-delete.md), если данные переносились из него.
    1. [Удалите трансфер](../../data-transfer/operations/transfer.md#delete).
    1. [Удалите эндпоинты](../../data-transfer/operations/endpoint/index.md#delete) для источника и приемника.
  

## Перенос таблиц с типами данных из расширений PostgreSQL

Сервис Data Transfer поддерживает копирование таблиц, содержащих столбцы с типами данных, определенных в расширениях PostgreSQL, а также копирование таблиц с производными типами (массивами таких типов и композитными типами с полями таких типов). Однако на данный момент есть ограничение — тип данных должен реализовывать __функции двоичного ввода и вывода__. То есть, для типа данных в системной таблице [pg_type](https://www.postgresql.org/docs/current/catalog-pg-type.html) значения в колонках `typsend` и `typreceive` должны быть отличны от нуля.

Например, для расширения [PostGIS](https://postgis.net/) перенос колонок с типами [`GEOMETRY`](https://postgis.net/docs/geometry.html), [`GEOMETRY_DUMP`](https://postgis.net/docs/geometry_dump.html) и [`GEOGRAPHY`](https://postgis.net/docs/geography.html) поддержан, а перенос типов [`BOX2D`](https://postgis.net/docs/box2d_type.html) и [`BOX3D`](https://postgis.net/docs/box3d_type.html) на данный момент не поддержан.

## Полезные ссылки {#see-also}

Другие способы миграции описаны в [документации Yandex Managed Service for PostgreSQL](../../managed-postgresql/tutorials/data-migration.md).