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
, выполните следующие действия:
Подготовьте исходную и целевую систему к переносу данных
Прежде чем собственно переносить данные, перенесите схему данных на целевой сервер:
В исходной базе переведите таблицу, подлежащую переносу, в режим «только чтение»:
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.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:
Prepare source and target systems for data transfer
Before the actual data transfer, you first need to transfer data schema to the target server:
In the source database, mark the table to be transferred as read-only:
ALTER TABLE
table_name
SET CONSTANT;Run the
VACUUM (ANALYZE)
command to remove dead tuples and refresh statistics:VACUUM (ANALYZE)
table_name
;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 -ftransfer_dir
/archive.outold_database
pg_restore -dnew_database
--schema-onlytransfer_dir
/archive.out
Prepare TOAST identifiers for the transfer
This step is only required if the tables to be transferred have toasted values.
Determine TOAST identifiers (
reltoastid
) in the new database:psql
new_database
-c "SELECT reltoastrelid FROM pg_class WHERE relname='table_name
';"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);"
Transfer the data to the target system
Copy the data into a separate directory using pg_dump utility:
pg_dump -Fc -t
table_name
--transfer-dirtransfer_dir
/ -ftransfer_dir
/archive.outold_database
Restore the data in the target database:
pg_restore -d
new_database
--data-only --transfer-dirtransfer_dir
/ --copy-mode-transfertransfer_dir
/archive.outWhen 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