Sebagai DBA biasa, kami menunggu rilis beberapa versi minor untuk PostgreSQL 13, yang seharusnya menyenangkan kami dengan banyak hal berguna , dan sekarang kami siap untuk mentransfer database layanan pemantauan kami untuk DBMS ini dari versi 12 ke 13 .
Tetapi bagaimana melakukan ini dengan waktu henti yang minimal, atau lebih baik tanpa itu sama sekali? Fungsionalitas Pembungkus Data Asing akan datang untuk menyelamatkan , atau lebih tepatnya, postgres_fdw .
Struktur dasar sumber
Beberapa detail tentang struktur dasar layanan kami, yang membantu kami merekam data yang masuk dengan sangat cepat, saya memberi tahu di artikel "Menulis di PostgreSQL di sublight: 1 host, 1 hari, 1TB" dan "Menghemat uang volume besar di PostgreSQL " . Singkatnya, partisi database yang kompeten memecahkan banyak masalah kinerja.
, 100-150GB . tst
PostgreSQL 12:
CREATE TABLE archive(
dt
date
, val
integer
)
PARTITION BY RANGE(dt); --
CREATE TABLE archive_20210401 --
PARTITION OF archive
FOR VALUES FROM ('2021-04-01') TO ('2021-04-02');
-- dt >= '2021-04-01' AND dt < '2021-04-02'
CREATE TABLE archive_20210402
PARTITION OF archive
FOR VALUES FROM ('2021-04-02') TO ('2021-04-03');
dt
, PARTITION BY RANGE
FOR VALUES FROM (dt) TO (dt + 1)
PARTITION BY LIST
, - , .
, :
INSERT INTO archive
VALUES
('2021-04-01', 1)
, ('2021-04-02', 2)
RETURNING
tableoid::regclass
, *;
tableoid | dt | val
archive_20210401 | 2021-04-01 | 1
archive_20210402 | 2021-04-02 | 2
tableoid
- , ( - ), . "PostgreSQL Antipatterns: ".
""
, , 1-2 "" "" .
PostgreSQL 13 , . , v12 :5439
, v13 :5440
.
:
CREATE TABLE archive(
dt
date
, val
integer
)
PARTITION BY RANGE(dt);
CREATE TABLE archive_20210403
PARTITION OF archive
FOR VALUES FROM ('2021-04-03') TO ('2021-04-04');
IMPORT FOREIGN SCHEMA, (, , ...). , , :
CREATE EXTENSION postgres_fdw;
CREATE SERVER postgresql_12
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '127.0.0.1', port '5439', dbname 'tst');
CREATE USER MAPPING FOR postgres
SERVER postgresql_12
OPTIONS (user 'postgres', password 'postgres');
, :
CREATE FOREIGN TABLE archive_old
PARTITION OF archive
FOR VALUES FROM ('-infinity') TO ('2021-04-03')
-- dt < '2021-04-03'
SERVER postgresql_12
OPTIONS(table_name 'archive');
PARTITION BY RANGE
BY LIST
, .
, :
INSERT INTO archive
VALUES
('2021-04-01', 1)
, ('2021-04-02', 2)
, ('2021-04-03', 3)
RETURNING
tableoid::regclass
, *;
tableoid | dt | val
archive_old | 2021-04-01 | 1 --
archive_old | 2021-04-02 | 2
archive_20210403 | 2021-04-03 | 3 --
FDW
- , FDW- updatable
, - use_remote_estimate
fetch_size
.
, FDW-, - PARTITION BY HASH
, .