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

Миграция данных в Managed PostgreSQL

Вы можете мигрировать данные из стороннего экземпляра PostgreSQL в сервис Managed PostgreSQL.

В этом руководстве рассматривается несколько типов миграции:

Сравнительные характеристики разных типов миграции приведены в таблице.

В руководстве определены следующие термины:

  • БД-источник — база данных PostgreSQL, из которой производится миграция данных;
  • БД-приемникбаза данных Managed PostgreSQL, в которую производится миграция данных.
КритерийОфлайн-миграция с помощью pg_dump и pg_restoreОфлайн-миграция с помощью pgcopydbОнлайн-миграция с помощью pgcopydb
Простой сервисаНа все время миграцииНа все время миграцииТолько на время переключения
Надежность инструментаИнструмент поддерживается разработчиками СУБДСторонний инструментСторонний инструмент
Сложность настройкиПростая: утилиты поставляются с СУБДПростая: нужно установить только утилиту pgcopydbСредняя: требуется настройка сетевой связности и уровня репликации на источнике
Привилегии пользователя на источникеМинимальные: чтение таблиц, последовательностей, использование схемМинимальные: чтение таблиц, последовательностей, использование схемСредние: роль REPLICATION, чтение таблиц, последовательностей, использование схем
Привилегии на приемникеМинимальные: подойдет существующий пользователь с ролью OWNERМинимальные: подойдет существующий пользователь с ролью OWNERПовышенные: требуется пользователь с ролью OWNER и дополнительной ролью MIGRATOR
Скорость миграцииСредняя: требуется последовательно выгрузить дамп, а потом восстановить из него БДБыстрая: снятие дампа и его восстановление происходит параллельно. Индексы по возможности создаются параллельноБыстрая: простой сервисов только на время переключения
Дополнительное хранилищеТребуется дополнительное место для хранения промежуточного файла дампаМинимальное: данные сразу же записываются в БД-приемникТребуется дополнительное место для хранения CDC-файлов
  1. Выберите подходящий вам тип миграции.

  2. Создайте кластер-приемник Managed PostgreSQL подходящей вам конфигурации.

  3. Создайте БД-приемник, в которую будут мигрировать данные. При создании БД:

    • Укажите такие же расширения, как и в БД-источнике.
    • Для владельца БД добавьте роль Migrator с подходящим вам сроком действия роли. Чтобы соблюсти принцип минимальных привилегий, вы можете вручную отвязать роль от пользователя сразу же после завершения миграции.
  4. Для доступа к кластеру вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed PostgreSQL.

  1. В БД-источнике создайте пользователя с минимальными правами, необходимыми для снятия дампа:

    sql
    CREATE USER dumper WITH PASSWORD '<пароль пользователя>';
    GRANT CONNECT ON DATABASE source_db TO dumper;
    GRANT pg_read_all_data TO dumper;

    В этом примере пользователю выданы права на все объекты. Вы можете выдать точечные права только на те объекты, которые должны быть перенесены в БД-приемник.

  2. Для сети, к которой подключен кластер, добавьте правило файрвола для входящего трафика:

    • источник трафика — IP-адрес промежуточного устройства (ВМ или личного компьютера);
    • назначение трафика — внешний IP-адрес кластера-приемника;
    • протокол и порт — TCP:5432.
  3. Проверьте подключение с помощью psql к БД-источнику и БД-приемнику.

  4. Обеспечьте сетевую связность между источником, приемником и промежуточным устройством (ВМ или личным компьютером):

    • Откройте сетевой доступ к серверу, на котором расположена БД кластера-источника. Стандартный порт для подключения к БД PostgreSQL — 5432.

    • Настройте pg_hba.conf, например:

      text
      host all <имя пользователя для миграции в БД-источнике> <IP-адрес промежуточного устройства>/32 scram-sha-256
    • При необходимости настройте SSL-шифрование для безопасной передачи данных.

Мигрируйте данные в сервис Managed PostgreSQL одним из подходящих вам способов.

Во время офлайн-миграции БД-источник будет недоступна на запись.

  1. Остановите рабочую нагрузку на БД-источнике.

  2. Переведите БД-источник в состояние readOnly:

    sql
    ALTER DATABASE <имя БД-источника> SET default_transaction_read_only = true;
  3. Снимите дамп БД-источника:

    sql
    pg_dump --exclude-extension='*' --no-owner --no-privileges --no-publications --no-subscriptions -h source_host -p source_port -U dumper -d source_db -Fc -f offline_pg_dump.dump

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

  4. Скопируйте файл offline_pg_dump.dump на устройство, с которого вы будете подключаться к БД-приемнику.

  5. Восстановите дамп в БД-приемник:

    sql
    pg_restore -U <имя пользователя-владельца БД-приемника> -d <имя БД-приемника> --no-owner -h dest_host -p dest_port --no-privileges --no-publications --no-subscriptions --clean --if-exists offline_pg_dump.dump
  6. Выполните команду ANALYZE; на БД-приемнике для сбора статистики.

  7. Переключите рабочую нагрузку на БД-приемник.

    СущностьОсобенности миграции
    extensionДобавляются вручную
    materilazied viewПереносятся, заполняются после создания с помощью команды REFRESH MATERIALIZED VIEW
    triggerПереносятся после данных, не срабатывают во время миграции
    user, roleСоздаются при развертывании кластера и БД-приемника
    indexПереносятся корректно после схем и данных. Теряют флаг CONCURRENTLY за ненадобностью
    temporary tableНе переносятся
    unlogged tableПереносятся. Могут быть исключены при снятии дампа. При миграции из старых версий секционированные таблицы теряют признак unlogged
    pg_statisticНе переносятся

Во время офлайн-миграции БД-источник будет недоступна на запись.

  1. Остановите рабочую нагрузку на БД-источнике.

  2. Переведите БД-источник в состояние readOnly:

    sql
    ALTER DATABASE <имя БД-источника> SET default_transaction_read_only = true;
  3. На устройстве, с которого будет запущен процесс миграции, установите следующие переменные окружения:

    bash
    export PGCOPYDB_SOURCE_PGURI=postgres://<имя пользователя в БД-источнике>:<пароль пользователя в БД-источнике>@<IP-адрес сервера-источника>:<порт для подключения к БД-источнику>/<имя БД-источника>
    bash
    export PGCOPYDB_TARGET_PGURI=postgres://<имя пользователя-владельца в БД-приемнике>:<пароль пользователя в БД-приемнике>@<IP-адрес сервера-приемника>:<порт для подключения к БД-приемнику>/<имя БД-приемника>
    bash
    export PGCOPYDB_SOURCE_PGURI=postgres://source-user:source-password@62.113.75.203:5432/source-db
    bash
    export PGCOPYDB_TARGET_PGURI=postgres://dest-owner-user:dest-pass@171.22.75.39:5432/dest-db
  4. Выполните команду клонирования БД на промежуточном устройстве:

    sql
    pgcopydb clone --no-owner --skip-extensions --skip-db-properties --no-role-passwords --drop-if-exists --table-jobs 4 --index-jobs 4

    Количество потоков параллельного копирования таблиц и индексов вы можете задать с помощью параметров --table-jobs и --index-jobs.

    Рекомендуется выбирать значения этих настроек исходя из минимального количества ядер CPU на источнике, приемнике и промежуточном устройстве. Например, если на промежуточном устройстве всего 4 ядра CPU, тогда как на источнике и приемнике — 8, то рекомендуется установить значение настроек равным 4.

    Также стоит учитывать, что кластеры источника и приемника во время миграции могут обслуживать и другие БД. Слишком высокое количество потоков миграции может понизить общую производительность кластеров.

  5. Переключите рабочую нагрузку на БД-приемник.

    СущностьОсобенности миграции
    extensionДобавляются вручную
    materilazied viewПереносятся, заполняются после создания с помощью команды REFRESH MATERIALIZED VIEW
    triggerПереносятся после данных, не срабатывают во время миграции
    user, roleСоздаются при развертывании кластера и БД-приемника
    indexПереносятся корректно после схем и данных. Теряют флаг CONCURRENTLY за ненадобностью
    temporary tableНе переносятся
    unlogged tableПереносятся. При миграции из старых версий секционированные таблицы теряют признак unlogged
    pg_statisticНе переносятся

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

  1. Создайте пользователя с нужными для миграции правами на БД-источнике:

    sql
    CREATE USER pgcopydb WITH REPLICATION LOGIN PASSWORD 'password';
    GRANT CONNECT ON DATABASE demo TO pgcopydb;
    GRANT pg_read_all_data TO pgcopydb;
  2. Внесите изменения в настройки postgresql.conf на источнике:

    bash
    wal_level = logical
  3. Чтобы настройки postgresql.conf вступили в силу, перезапустите инстанс PostgreSQL на источнике.

  4. На устройстве, с которого будет запущен процесс миграции, установите следующие переменные окружения:

    bash
    export PGCOPYDB_SOURCE_PGURI=postgres://<имя пользователя в БД-источнике>:<пароль пользователя в БД-источнике>@<IP-адрес сервера-источника>:<порт для подключения к БД-источнику>/<имя БД-источника>
    bash
    export PGCOPYDB_TARGET_PGURI=postgres://<имя пользователя-владельца в БД-приемнике>:<пароль пользователя в БД-приемнике>@<IP-адрес сервера-приемника>:<порт для подключения к БД-приемнику>/<имя БД-приемника>
    bash
    export PGCOPYDB_SOURCE_PGURI=postgres://source-user:source-password@62.113.75.203:5432/source-db
    bash
    export PGCOPYDB_TARGET_PGURI=postgres://dest-owner-user:dest-pass@171.22.75.39:5432/dest-db
  5. Запустите процесс репликации БД:

    sql
    pgcopydb clone --follow --no-owner --skip-extensions --skip-db-properties --no-role-passwords --drop-if-exists
  6. В момент переключения на БД-приемник:

    1. Остановите рабочую нагрузку.

    2. Остановите процесс репликации:

      bash
      pgcopydb stream sentinel set endpos --current
    3. Если процесс репликации на завершается сразу же, выполните команду на БД-источнике:

      bash
      SELECT pg_logical_emit_message(true, 'pgcopydb', 'stop_signal');
    4. Переключите рабочую нагрузку на БД-приемник.

    5. Удалите временные ресурсы:

      bash
      pgcopydb stream cleanup
    СущностьОсобенности миграции
    extensionДобавляются вручную
    materilazied viewОпределения переносятся в момент снятия снапшота, заполняются после создания с помощью команды REFRESH MATERIALIZED VIEW
    triggerОпределения переносятся после данных, не срабатывают во время миграции
    user, roleСоздаются при развертывании кластера и БД-приемника
    temporary tableНе переносятся
    unlogged tableОпределения и данные переносятся в момент снятия снапшота. Новые записи не переносятся в процессе репликации данных. При миграции из старых версий секционированные таблицы теряют признак unlogged
    Таблица без primary keyОпределения переносятся в момент снятия снапшота. Для переноса данных в процессе репликации требуется REPLICA IDENTITY FULL или создание primary key
    pg_statisticНе переносятся

Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:

  1. Удалите кластер Managed PostgreSQL, если вы проходили руководство на тестовых данных, которые вам не нужны.

    Внимание

    Не удаляйте кластер Managed PostgreSQL, если вы мигрировали БД, содержащие реальные данные. Это может привести к потере данных.