F.45. 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.45.1. Установка

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

CREATE EXTENSION pg_transfer;

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

F.45.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.45.3. Совместимость

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

F.45.4. Авторы

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

F.45. pg_transfer

The pg_transfer extension enables quick transfer of tables between Postgres Pro Enterprise instances.

It may sometimes be required to load large volumes of data into a database, for example, when consolidating data from regional servers into a central one. If your data needs to be uploaded to a server under heavy load, you can use a temporary database on another server to accumulate the data and then transfer it all at once when the main server load is minimal.

If you use pg_dump and pg_restore applications to transfer data, the load on the receiving server is usually higher than that on the sending server. Since the data is loaded using INSERT or COPY commands, it creates a significant impact on the disk subsystem. Besides, you will have to re-build indexes in the target database once all the data is loaded, which will also contribute to the server load.

To achieve a much higher load speed for read-only data, you can use the pg_transfer extension while doing dump/restore, which allows to copy data files directly, without using COPY/INSERT commands. pg_transfer also provides auxiliary functions for pg_dump and pg_restore to transfer tables together with pre-built indexes and collected statistics, so you can avoid extra load on the target server incurred by statistics re-collection.

Note

Postgres Pro Enterprise configuration and the architectures of source and target servers must provide binary-compatible file formats. When restoring data, pg_transfer checks that source and target servers have the same alignment, page and segment sizes, etc.

F.45.1. Installation

pg_transfer is included into Postgres Pro Enterprise. To enable pg_transfer, create its extension in your database using the following SQL command:

CREATE EXTENSION pg_transfer;

You must create pg_transfer extension in both source and target databases.

F.45.2. Usage

To transfer data using the pg_transfer module, do the following:

  1. Prepare source and target systems for data transfer

    Before the actual data transfer, you first need to transfer data schema to the target server:

    1. In the source database, mark the table to be transferred as read-only:

      ALTER TABLE table_name SET CONSTANT;
      

    2. Run the VACUUM (ANALYZE) command to remove dead tuples and refresh statistics:

      VACUUM (ANALYZE) table_name;
      

    3. Take a logical dump of the data schema on the source server and restore it on the target server:

      pg_dump -Fc -t table_name --schema-only -f transfer_dir/archive.out old_database
      pg_restore -d new_database --schema-only transfer_dir/archive.out
      

  2. Prepare TOAST identifiers for the transfer

    This step is only required if the tables to be transferred have toasted values.

    1. Determine TOAST identifiers (reltoastid) in the new database:

      psql new_database -c "SELECT reltoastrelid FROM pg_class WHERE relname='table_name';"
      

    2. Using the received reltoastid identifiers, prepare the table for the transfer and force data flush to disk:

      psql -d old_database -c "SELECT pg_transfer_freeze('table_name'::regclass::oid, reltoastrelid::oid);"
      

  3. Transfer the data to the target system

    1. Copy the data into a separate directory using pg_dump utility:

      pg_dump -Fc -t table_name --transfer-dir transfer_dir/ -f transfer_dir/archive.out old_database
      

    2. Restore the data in the target database:

      pg_restore -d new_database --data-only --transfer-dir transfer_dir/ --copy-mode-transfer transfer_dir/archive.out
      

      When source and target databases are located in the same file system, the --copy-mode-transfer option must be specified at least once (for either pg_dump or pg_restore command) to get an independent copy of data. When restoring data on the primary server, --generate-wal option must be specified for pg_restore for changes to be replicated to a standby server.

F.45.3. Compatibility

The pg_transfer extension is only supported on Linux systems.

F.45.4. Authors

Postgres Professional, Moscow, Russia