Skip to content

Commit 0703f7a

Browse files
committed
Merge branch 'PGPROEE9_6-15-64-xid' into PGPROEE9_6
2 parents 6666f18 + 9db4dd0 commit 0703f7a

File tree

165 files changed

+4420
-2414
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

165 files changed

+4420
-2414
lines changed

.gitlab-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ test:ubuntu-16.04:
1515
only:
1616
- PGPROEE9_6
1717
before_script:
18-
- apt-get update && apt-get install -y sudo gcc make flex bison libreadline-dev zlib1g-dev openjade libzstd0 libzstd-dev opensp docbook docbook-xml docbook-xsl libxml2-utils xsltproc python-dev libicu-dev
18+
- apt-get update && apt-get install -y sudo gcc make flex bison libreadline-dev zlib1g-dev openjade libzstd-dev opensp docbook docbook-xml docbook-xsl libxml2-utils xsltproc python-dev libicu-dev
1919
script:
2020
- ./configure --prefix=/opt/pgproee --with-zstd --with-icu --with-python
2121
- make -j $CORES world

contrib/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ SUBDIRS = \
3636
pg_query_state \
3737
pg_standby \
3838
pg_stat_statements \
39+
pg_transfer \
3940
pg_trgm \
4041
pgcrypto \
4142
pgrowlocks \

contrib/hstore/hstore_io.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,7 @@ hstore_from_record(PG_FUNCTION_ARGS)
833833
ItemPointerSetInvalid(&(tuple.t_self));
834834
tuple.t_tableOid = InvalidOid;
835835
tuple.t_data = rec;
836+
HeapTupleSetInvalidEpoch(&tuple);
836837

837838
values = (Datum *) palloc(ncolumns * sizeof(Datum));
838839
nulls = (bool *) palloc(ncolumns * sizeof(bool));
@@ -978,6 +979,7 @@ hstore_populate_record(PG_FUNCTION_ARGS)
978979
ItemPointerSetInvalid(&(tuple.t_self));
979980
tuple.t_tableOid = InvalidOid;
980981
tuple.t_data = rec;
982+
HeapTupleSetInvalidEpoch(&tuple);
981983
}
982984

983985
/*

contrib/pageinspect/btreefuncs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ bt_page_stats(PG_FUNCTION_ARGS)
221221
values[j++] = psprintf("%d", stat.free_size);
222222
values[j++] = psprintf("%d", stat.btpo_prev);
223223
values[j++] = psprintf("%d", stat.btpo_next);
224-
values[j++] = psprintf("%d", (stat.type == 'd') ? stat.btpo.xact : stat.btpo.level);
224+
values[j++] = psprintf(XID_FMT, (stat.type == 'd') ? stat.btpo.xact : stat.btpo.level);
225225
values[j++] = psprintf("%d", stat.btpo_flags);
226226

227227
tuple = BuildTupleFromCStrings(TupleDescGetAttInMetadata(tupleDesc),

contrib/pageinspect/heapfuncs.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,16 +192,19 @@ heap_page_items(PG_FUNCTION_ARGS)
192192
lp_offset == MAXALIGN(lp_offset) &&
193193
lp_offset + lp_len <= raw_page_size)
194194
{
195+
HeapTupleData tup;
195196
HeapTupleHeader tuphdr;
196197
bytea *tuple_data_bytea;
197198
int tuple_data_len;
198199

199200
/* Extract information from the tuple header */
200201

201202
tuphdr = (HeapTupleHeader) PageGetItem(page, id);
203+
tup.t_data = tuphdr;
204+
HeapTupleCopyEpochFromPage(&tup, page);
202205

203-
values[4] = UInt32GetDatum(HeapTupleHeaderGetRawXmin(tuphdr));
204-
values[5] = UInt32GetDatum(HeapTupleHeaderGetRawXmax(tuphdr));
206+
values[4] = TransactionIdGetDatum(HeapTupleGetXmin(&tup));
207+
values[5] = TransactionIdGetDatum(HeapTupleGetRawXmax(&tup));
205208
/* shared with xvac */
206209
values[6] = UInt32GetDatum(HeapTupleHeaderGetRawCommandId(tuphdr));
207210
values[7] = PointerGetDatum(&tuphdr->t_ctid);

contrib/pageinspect/pageinspect--1.5.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ CREATE FUNCTION page_header(IN page bytea,
2828
OUT special smallint,
2929
OUT pagesize smallint,
3030
OUT version smallint,
31+
OUT xid_epoch xid,
32+
OUT multi_epoch xid,
3133
OUT prune_xid xid)
3234
AS 'MODULE_PATHNAME', 'page_header'
3335
LANGUAGE C STRICT PARALLEL SAFE;

contrib/pageinspect/rawpage.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ page_header(PG_FUNCTION_ARGS)
175175

176176
Datum result;
177177
HeapTuple tuple;
178-
Datum values[9];
179-
bool nulls[9];
178+
Datum values[11];
179+
bool nulls[11];
180180

181181
PageHeader page;
182182
XLogRecPtr lsn;
@@ -225,7 +225,9 @@ page_header(PG_FUNCTION_ARGS)
225225
values[5] = UInt16GetDatum(page->pd_special);
226226
values[6] = UInt16GetDatum(PageGetPageSize(page));
227227
values[7] = UInt16GetDatum(PageGetPageLayoutVersion(page));
228-
values[8] = TransactionIdGetDatum(page->pd_prune_xid);
228+
values[8] = TransactionIdGetDatum(page->pd_xid_epoch);
229+
values[9] = TransactionIdGetDatum(page->pd_multi_epoch);
230+
values[10] = TransactionIdGetDatum(page->pd_prune_xid);
229231

230232
/* Build and return the tuple. */
231233

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