Расширение pg_transfer предоставляет возможность быстрого перемещения таблиц между экземплярами Postgres Pro Enterprise.
Для некоторых приложений узким местом является загрузка большего объёма данных в базу, например, при переносе данных с региональных серверов в центральный. Стандартным методом является перенос схемы и данных при помощи утилит pg_dump и pg_restore. При этом большая часть нагрузки приходится на принимающий сервер. Загрузка данных осуществляется командами INSERT или COPY, что значительно нагружает дисковую подсистему. Построение индексов и сбор статистики необходимо выполнить в целевой базе уже после загрузки данных.
С помощью расширения pg_transfer можно подготовить таблицу (построить индексы и собрать статистику) без участия целевого сервера и обеспечить большую скорость добавления данных только для чтения. Это расширение содержит дополнительные функции для использования утилитами pg_dump и pg_restore.
Для установки расширения необходимо выполнить следующую SQL-команду:
CREATE EXTENSION pg_transfer;
Перед переносом таблицы необходимо перевести её в режим «только чтение».
ALTER TABLE имя_таблицы SET CONSTANT;
После этого нужно выполнить VACUUM (ANALYZE) для удаления устаревших записей и обновления статистики.
VACUUM (ANALYZE) имя_таблицы;
Перенос таблицы происходит в два этапа. Сначала логическая резервная копия схемы данных выполняется на вспомогательном сервере и восстанавливается на целевом. Затем данные на вспомогательном сервере подготавливаются к переносу, используя информацию о восстановленной схеме, после чего выполняется собственно перенос.
Когда исходная и целевая базы расположены в одной файловой системе, нужно как минимум один раз (при pg_dump или pg_restore) использовать ключ --copy-mode-transfer, чтобы получить независимую копию данных. Чтобы при переносе данных на ведущий сервер изменения реплицировались на ведомый, необходимо указать ключ --generate-wal для команды pg_restore.
Архитектура и конфигурация обеих систем Postgres Pro Enterprise должны обеспечивать идентичность бинарного формата данных. При восстановлении выполняется проверка совпадения выравнивания, размеров страницы и сегмента и т. п.
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='имя_таблицы';"
В обеих базах должно быть установлено расширение pg_transfer.
Используя полученный на предыдущем шаге идентификатор TOAST-таблицы (ид_таблицы_toast), подготовьте таблицу к переносу и выполните сброс данных на диск.
psql -dстарая_база-c "SELECT pg_transfer_freeze('имя_таблицы'::regclass::oid,id_таблицы_toast::oid);"
Подготовка данных завершена. Теперь можно перенести данные в отдельный каталог, используя утилиту pg_dump.
pg_dumpстарая_база-Fc -tимя_таблицы--transfer-dirкаталог_для_переноса/ -fкаталог_для_переноса/archive.out
И наконец, можно восстановить данные в целевой базе данных.
pg_restore -dновая_база--data-only --transfer-dirкаталог_для_переноса/каталог_для_переноса/archive.out --copy-mode-transfer
Это расширение совместимо с серверами Postgres Pro 9.6 и новее в Unix-подобных системах.