Skip to content

Commit aea1acc

Browse files
committed
Merge branch 'PGPROEE9_6' into PGPROEE9_6_sha2_scram_port_v3_task_CORE-416-merge
2 parents 5cb5893 + a45e506 commit aea1acc

File tree

209 files changed

+11529
-2510
lines changed

Some content is hidden

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

209 files changed

+11529
-2510
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,6 @@ lib*.pc
4444
/contrib/*/results/
4545
/contrib/*/tmp_check/
4646
/contrib/pg_query_state/isolation_output/
47+
/contrib/pg_hint_plan/expected/ut-fdw.out
48+
/contrib/pg_hint_plan/sql/ut-fdw.sql
49+

.gitlab-ci.yml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,9 @@ 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
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:
20-
- ./configure --prefix=/opt/pgproee
20+
- ./configure --prefix=/opt/pgproee --with-zstd --with-icu --with-python
2121
- make -j $CORES world
22-
- sudo make install-world
23-
- make check
24-
- cd contrib
25-
- make check
22+
- make check-world
2623
when: always

contrib/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ SUBDIRS = \
2929
oid2name \
3030
pageinspect \
3131
passwordcheck \
32+
pgpro_scheduler \
3233
pg_buffercache \
3334
pg_freespacemap \
3435
pg_prewarm \
3536
pg_query_state \
3637
pg_standby \
3738
pg_stat_statements \
39+
pg_transfer \
3840
pg_trgm \
3941
pgcrypto \
4042
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_probackup/.gitignore

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
.deps
2020

2121
# Binaries
22-
/pg_arman
22+
/pg_probackup
2323

2424
# Generated by test suite
2525
/regression.diffs
@@ -30,3 +30,9 @@
3030
/datapagemap.c
3131
/datapagemap.h
3232
/xlogreader.c
33+
/logging.h
34+
/receivelog.c
35+
/receivelog.h
36+
/streamutil.c
37+
/streamutil.h
38+

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)