|
| 1 | +# pg_transfer |
| 2 | + |
| 3 | +Модуль `pg_transfer` предоставляет возможность быстрого перемещения таблиц между инстансами PostgreSQL. |
| 4 | + |
| 5 | +Расширение совместимо с PgPro9.6.? для *nix систем. |
| 6 | + |
| 7 | +## Для чего нужен pg_transfer? |
| 8 | + |
| 9 | +Для некоторых приложений узким местом является загрузка данных в базу, например, при переносе данных с региональных серверов в центральный. Стандартным методом является перенос схемы и данных при помощи утилит `pg_dump/pg_restore`. При этом большая часть нагрузки приходится на принимающий сервер. Загрузка данных осуществляется командами `INSERT` или `COPY`, что создаёт значительную загрузку дисковой подсистемы. Построение индексов и сбор статистики необходимо выполнить в новой базе уже после загрузки данных. |
| 10 | + |
| 11 | +С помощью расширения `pg_transfer` можно подготовить таблицу (построить индексы и собрать статистику) отдельно от основных серверов и обеспечить фактически очень большую скорость добавления данных только для чтения. Модуль содержит дополнительные функции для использования утилитами `pg_dump/pg_restore`. |
| 12 | + |
| 13 | + |
| 14 | +## Установка |
| 15 | +Для установки расширения необходимо выполнить в psql команду. |
| 16 | + |
| 17 | +``` |
| 18 | +CREATE EXTENSION pg_transfer; |
| 19 | +``` |
| 20 | + |
| 21 | +## Основные опции |
| 22 | + |
| 23 | +Флаги pg_dump: |
| 24 | + |
| 25 | +* **`--transfer-dir $TRANSFER_DIR_PATH`** - директория, в которую будут перемещены файлы таблицы, заданных на ней индексов и TOAST. По умолчанию создаётся жесткая ссылка на файлы в директории указанной в опции --transfer-dir. |
| 26 | +> **Будьте внимательны:** при удалении таблицы командой DROP такие ссылки станут невалидными. |
| 27 | +
|
| 28 | +* **`--copy-mode-transfer`** - В случае когда файлы СУБД и transfer-dir расположены на разных файловых системах нужно использовать опцию --copy-mode-transfer для получения копии файлов. |
| 29 | + |
| 30 | +Флаги pg_restore: |
| 31 | + |
| 32 | +* **`--transfer-dir $TRANSFER_DIR_PATH`** - директория, из которой будут перемещены файлы таблицы, заданных на ней индексов и TOAST. По умолчанию файлы перемещаются в базу командой rename(). |
| 33 | + |
| 34 | +* **`--copy-mode-transfer`** - Копировать файлы из директории `transfer-dir` вместо перемещения. |
| 35 | + |
| 36 | +* **`--generate-wal`** - сгенерировать Xlog записи для всех файлов, для синхронизации с репликой. В случае, когда целевая СУБД реплицируется WAL-логами, флаг обязателен. |
| 37 | + |
| 38 | + |
| 39 | +## Процесс переноса данных. |
| 40 | + |
| 41 | +Перед переносом таблицы необходимо пометить её как доступную только на чтение. |
| 42 | + |
| 43 | +``` |
| 44 | +ALTER TABLE tbl_name SET CONSTANT; |
| 45 | +``` |
| 46 | + |
| 47 | +А также выполнить `VACUUM (ANALYZE)` для удаления устаревших записей и обновления статистики. |
| 48 | + |
| 49 | +``` |
| 50 | +VACUUM (ANALYZE) tbl_name; |
| 51 | +``` |
| 52 | + |
| 53 | +Перенос таблицы осуществляется в два этапа. На первом этапе дамп схемы снимается на вспомогательном сервере и восстанавливается на основном. Затем данные на вспомогательном сервере необходимо подготовить к переносу, используя информацию о восстановленной схеме, и перенести данные. Если исходная и целевая база расположены на одной файловой системе нужно как минимум один раз (при `pg_dump` или `pg_restore`) использовать --copy-mode-transfer опцию, чтобы получить копию данных. Если целевая СУБД реплицируется WAL-логами, то при подключении файлов pg_restore обязательно нужно |
| 54 | +использовать опцию `--generate-wal`. |
| 55 | + |
| 56 | + |
| 57 | +> **Важно:** архитектура обеих систем и настройки инстанса PostgreSQL должны обеспечивать идентичность бинарного формата данных. При восстановлении выполняется проверка вывода `pg_control_init()` - выравнивание, размер блока, размер сегмента и т.д.. |
| 58 | +
|
| 59 | +### Этап 1. |
| 60 | + |
| 61 | +``` |
| 62 | +pg_dump db -t tbl_name --schema-only -f $TRANSFER_DIR/archive.out |
| 63 | +pg_restore -d newdb --schema-only $TRANSFER_DIR/archive.out |
| 64 | +``` |
| 65 | + |
| 66 | +После восстановления схемы необходимо получить идентификатор TOAST таблицы. |
| 67 | + |
| 68 | +``` |
| 69 | +psql newdb -c select reltoastrelid from pg_class where relname='tbl_name' |
| 70 | +``` |
| 71 | + |
| 72 | +### Этап 2. В обеих базах должно быть установлено расширение `pg_transfer`. |
| 73 | + |
| 74 | +Используя полученный в предыдущем шаге идентификатор TOAST таблицы, подготовить |
| 75 | +таблицу к переносу и выполнить сброс данных на диск. |
| 76 | + |
| 77 | +``` |
| 78 | +psql -d db -c select pg_transfer_freeze('tbl_name'::regclass::oid, reltoastrelid::oid); |
| 79 | +psql -d db -c checkpoint; |
| 80 | +``` |
| 81 | + |
| 82 | +Подготовка данных завершена. Теперь можно перенести данные в отдельную директорию, используя утилиту `pg_dump`. |
| 83 | + |
| 84 | +``` |
| 85 | +pg_dump db -Fc -t tbl_name --copy-mode-transfer --transfer-dir $TRANSFER_DIR/ -f $TRANSFER_DIR/archive.out |
| 86 | +``` |
| 87 | + |
| 88 | +И восстановить их на целевой базе данных. |
| 89 | + |
| 90 | +``` |
| 91 | +pg_restore -d newdb --data-only --transfer-dir $TRANSFER_DIR/ $TRANSFER_DIR/archive.out |
| 92 | +``` |
0 commit comments