Skip to content

Commit 9db4dd0

Browse files
committed
Added pg_transfer extension
1 parent eaf5f70 commit 9db4dd0

File tree

5 files changed

+580
-0
lines changed

5 files changed

+580
-0
lines changed

contrib/pg_transfer/Makefile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# pg_transfer/Makefile
2+
MODULE_big = pg_transfer
3+
OBJS = pg_transfer.o
4+
EXTENSION = pg_transfer
5+
DATA = pg_transfer--1.0.sql
6+
7+
ifdef USE_PGXS
8+
PG_CONFIG = pg_config
9+
PGXS := $( shell $( PG_CONFIG ) --pgxs )
10+
include $(PGXS)
11+
else
12+
subdir = contrib/pg_transfer
13+
top_builddir = ../..
14+
include $(top_builddir)/src/Makefile.global
15+
include $(top_srcdir)/contrib/contrib-global.mk
16+
endif

contrib/pg_transfer/README.rus.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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+
```
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
2+
\echo Use ”CREATE EXTENSION pg_transfer” to load this file. \quit
3+
4+
CREATE FUNCTION pg_transfer_wal(oid)
5+
RETURNS void
6+
AS 'MODULE_PATHNAME', 'pg_transfer_wal'
7+
LANGUAGE C;
8+
9+
CREATE FUNCTION pg_transfer_cleanup_shmem(oid)
10+
RETURNS void
11+
AS 'MODULE_PATHNAME', 'pg_transfer_cleanup_shmem'
12+
LANGUAGE C;
13+
14+
CREATE FUNCTION pg_transfer_freeze(oid, oid)
15+
RETURNS void
16+
AS 'MODULE_PATHNAME', 'pg_transfer_freeze'
17+
LANGUAGE C;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy