DBA: changer les "éléphants" au croisement

En tant que DBA normaux, nous avons attendu la sortie de quelques versions mineures de PostgreSQL 13, ce qui devrait nous plaire avec beaucoup de choses utiles , et nous sommes maintenant prêts à transférer la base de données de notre service de surveillance pour ce SGBD de la version 12 à 13 .





Mais comment faire cela avec un temps d'arrêt minimal, ou mieux sans cela? La fonctionnalité Foreign Data Wrappers viendra à la rescousse , ou plutôt postgres_fdw .





Structure de base de la source

Quelques détails sur la structure de la base de notre service, qui nous aident à enregistrer très rapidement les données entrantes, j'ai dit dans les articles "Ecrire en PostgreSQL sur le sous-éclairage: 1 hôte, 1 jour, 1 To" et "Économiser un joli centime sur grands volumes dans PostgreSQL " . En un mot, un partitionnement de base de données compétent résout de nombreux problèmes de performances.





, 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



, .








All Articles