F.46. pg_transfer

F.46.1. Описание
F.46.2. Установка
F.46.3. Использование
F.46.4. Совместимость

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

F.46.1. Описание

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

С помощью расширения pg_transfer можно подготовить таблицу (построить индексы и собрать статистику) без участия целевого сервера и обеспечить большую скорость добавления данных только для чтения. Это расширение содержит дополнительные функции для использования утилитами pg_dump и pg_restore.

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

Для установки расширения необходимо выполнить следующую SQL-команду:

    CREATE EXTENSION pg_transfer;
   

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

Перед переносом таблицы необходимо перевести её в режим «только чтение».

    ALTER TABLE имя_таблицы SET CONSTANT;
   

После этого нужно выполнить VACUUM (ANALYZE) для удаления устаревших записей и обновления статистики.

    VACUUM (ANALYZE) имя_таблицы;
   

Перенос таблицы происходит в два этапа. Сначала логическая резервная копия схемы данных выполняется на вспомогательном сервере и восстанавливается на целевом. Затем данные на вспомогательном сервере подготавливаются к переносу, используя информацию о восстановленной схеме, после чего выполняется собственно перенос.

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

Примечание

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

F.46.3.1. Этап 1

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

После восстановления схемы необходимо получить идентификатор TOAST-таблицы.

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

F.46.3.2. Этап 2

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

Используя полученный на предыдущем шаге идентификатор TOAST-таблицы (ид_таблицы_toast), подготовьте таблицу к переносу и выполните сброс данных на диск.

psql -d старая_база -c "SELECT pg_transfer_freeze('имя_таблицы'::regclass::oid, id_таблицы_toast::oid);"

F.46.3.3. Перенос данных

Подготовка данных завершена. Теперь можно перенести данные в отдельный каталог, используя утилиту pg_dump.

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

И наконец, можно восстановить данные в целевой базе данных.

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

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

Это расширение совместимо с серверами Postgres Pro 9.6 и новее в Unix-подобных системах.