F.58. 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.58.1. Установка #
Расширение pg_transfer
входит в состав Postgres Pro Enterprise. Чтобы включить pg_transfer
, создайте объект расширения в вашей базе данных следующей командой SQL:
CREATE EXTENSION pg_transfer;
Создавать расширение pg_transfer
нужно и в целевой, и в исходной базе данных.
F.58.2. Использование #
Чтобы перенести данные с применением pg_transfer
, выполните следующие действия:
Подготовьте исходную и целевую систему к переносу данных
Прежде чем собственно переносить данные, перенесите схему данных на целевой сервер:
В исходной базе переведите таблицу, подлежащую переносу, в режим «только чтение»:
ALTER TABLE
имя_таблицы
SET CONSTANT;Выполните команду
VACUUM (ANALYZE)
для удаления устаревших записей и обновления статистики:VACUUM (ANALYZE)
имя_таблицы
;Получите логическую копию схемы данных на исходном сервере и восстановите её на целевом:
pg_dump -Fc -t
имя_таблицы
--schema-only -fкаталог_для_переноса
/archive.outстарая_база
pg_restore -dновая_база
--schema-onlyкаталог_для_переноса
/archive.out
Подготовка идентификаторов TOAST для переноса данных
Это действие нужно выполнять, только если переносимые таблицы содержат поля TOAST.
Определите идентификатор TOAST (
reltoastid
) для таблицы в новой базе:psql
новая_база
-c "SELECT reltoastrelid FROM pg_class WHERE relname='имя_таблицы
';"Используя полученный идентификатор (
reltoastid
), подготовьте таблицу к переносу и выполните сброс данных на диск:psql -d
старая_база
-c "SELECT pg_transfer_freeze('имя_таблицы
'::regclass::oid,ид_таблицы_toast
::oid);"
Перенос данных в целевую систему
Скопируйте данные в отдельный каталог, используя утилиту pg_dump:
pg_dump -Fc -t
имя_таблицы
--transfer-dirкаталог_для_переноса
/ -fкаталог_для_переноса
/archive.outстарая_база
Восстановите данные в целевой базе данных:
pg_restore -d
новая_база
--data-only --transfer-dirкаталог_для_переноса
/ --copy-mode-transferкаталог_для_переноса
/archive.outКогда исходная и целевая базы расположены в одной файловой системе, нужно как минимум один раз (для команды pg_dump или pg_restore) использовать ключ
--copy-mode-transfer
, чтобы получить независимую копию данных. Чтобы при переносе данных на ведущий сервер изменения реплицировались на ведомый, необходимо указать ключ--generate-wal
для команды pg_restore.
F.58.3. Совместимость #
Расширение pg_transfer
поддерживается только в системах Linux.
F.58.4. Авторы #
Postgres Professional, Москва, Россия