F.49. pg_transfer

Расширение pg_transfer предоставляет возможность быстрого перемещения таблиц между экземплярами Postgres Pro Enterprise.

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

Если вы будете использовать для переноса данных pg_dump и pg_restore, нагрузка на получающий сервер обычно будет больше, чем на передающий. Так как все данные загружаются командами INSERT или COPY, это значительно нагружает дисковую подсистему. Кроме того, после переноса всех данных вам скорее всего потребуется построить индексы в целевой базе, что также создаст дополнительную нагрузку на сервер.

Однако вы можете значительно увеличить скорость загрузки данных в режиме «только для чтения», воспользовавшись расширением pg_transfer, которое позволяет копировать собственно файлы данных, без применения команд COPY/INSERT. Расширение pg_transfer также предоставляет дополнительные функции для pg_dump и pg_restore, позволяющие переносить таблицы вместе с существующими индексами и статистикой и таким образом исключить дополнительную нагрузку на целевой сервер, связанную с повторным вычислением этой информации.

Примечание

Конфигурации и архитектуры исходного и целевого серверов Postgres Pro Enterprise должны обеспечивать двоичную совместимость форматов файлов. При восстановлении данных pg_transfer проверит совпадение таких свойств, как выравнивание, размер страницы, сегмента и т. п.

F.49.1. Установка

Расширение pg_transfer входит в состав Postgres Pro Enterprise. Чтобы включить pg_transfer, создайте объект расширения в вашей базе данных следующей командой SQL:

CREATE EXTENSION pg_transfer;

Создавать расширение pg_transfer нужно и в целевой, и в исходной базе данных.

F.49.2. Использование

Чтобы перенести данные с применением pg_transfer, выполните следующие действия:

  1. Подготовьте исходную и целевую систему к переносу данных

    Прежде чем собственно переносить данные, перенесите схему данных на целевой сервер:

    1. В исходной базе переведите таблицу, подлежащую переносу, в режим «только чтение»:

      ALTER TABLE имя_таблицы SET CONSTANT;
    2. Выполните команду VACUUM (ANALYZE) для удаления устаревших записей и обновления статистики:

      VACUUM (ANALYZE) имя_таблицы;
    3. Получите логическую копию схемы данных на исходном сервере и восстановите её на целевом:

      pg_dump -Fc -t имя_таблицы --schema-only -f каталог_для_переноса/archive.out старая_база
      pg_restore -d новая_база --schema-only каталог_для_переноса/archive.out
  2. Подготовка идентификаторов TOAST для переноса данных

    Это действие нужно выполнять, только если переносимые таблицы содержат поля TOAST.

    1. Определите идентификатор TOAST (reltoastid) для таблицы в новой базе:

      psql новая_база -c "SELECT reltoastrelid FROM pg_class WHERE relname='имя_таблицы';"

    2. Используя полученный идентификатор (reltoastid), подготовьте таблицу к переносу и выполните сброс данных на диск:

      psql -d старая_база -c "SELECT pg_transfer_freeze('имя_таблицы'::regclass::oid, ид_таблицы_toast::oid);"
  3. Перенос данных в целевую систему

    1. Скопируйте данные в отдельный каталог, используя утилиту pg_dump:

      pg_dump -Fc -t имя_таблицы --transfer-dir каталог_для_переноса/ -f каталог_для_переноса/archive.out старая_база
    2. Восстановите данные в целевой базе данных:

      pg_restore -d новая_база --data-only --transfer-dir каталог_для_переноса/ --copy-mode-transfer каталог_для_переноса/archive.out

      Когда исходная и целевая базы расположены в одной файловой системе, нужно как минимум один раз (для команды pg_dump или pg_restore) использовать ключ --copy-mode-transfer, чтобы получить независимую копию данных. Чтобы при переносе данных на ведущий сервер изменения реплицировались на ведомый, необходимо указать ключ --generate-wal для команды pg_restore.

F.49.3. Совместимость

Расширение pg_transfer поддерживается только в системах Linux.

F.49.4. Авторы

Postgres Professional, Москва, Россия