Ma suggestion sur l'archivage:
- Créer
archive_tablespace
(si vous le souhaitez, vous pouvez séparer le matériel sur l'archive)
Créez des tableaux. Par exemple, nous voulons archiver les articles du tableau.
create table posts_all ( LIKE public.posts) ;
create table posts_archive () inherits ( public.posts_all) ;
alter table public.posts inherits ( public.posts_all ) ;
Après cela, nous aurons 2 nouvelles tables: public.posts_all (avec les mêmes colonnes que dans les articles) pour interroger tous les articles (archives et production) et public.posts_archive pour interroger tous les articles d'archives. Public.posts héritera de posts_all.
Les insertions doivent se faire à l'ancienne (dans le tableau public.posts) à moins que vous n'écriviez des déclencheurs sur posts_all pour rediriger les insertions vers la table des publications. Si vous avez un partitionnement, ce sera plus compliqué. Avec l'application fonctionnelle et avant l'ancienne migration des données, vous n'avez rien à changer dans le code de l'application pour travailler avec cette approche.
Créez une archive de schéma pour la séparation logique. Ma suggestion sera de séparer les données d'archives par une certaine période de temps (année ou mois) si possible (archive_2005).
Créer des tables d'archives dans le schéma archive_year
create table archive_2005.posts (
check(record_date >= '2005-01-01 00:00:00'::timestamp
and record_date < '2006-01-01 00:00:00'::timestamp)
) inherits (posts_archive) tablespace archive_tablesapce;
Après cela, vous aurez de nouveaux messages de table dans le schéma archive_2005 et le planificateur postgresql saura que les données ne s'y trouvent que dans la période de temps prévue. Si vous interrogez sur une autre période, postgresql ne cherchera pas dans ce tableau.
Créez des fonctions / procédures / déclencheurs pour déplacer des données vers des tables d'archives.
- Faites l'archivage une fois pour une période de temps (année ici) et passez l'aspirateur sur l'ancienne table ou faites-le automatiquement par des déclencheurs (plus lourd sur le vide automatique). Les deux techniques présentent de nombreux avantages et inconvénients.
Si mis en œuvre:
- Peut interroger les données d'archive (sélectionnez * dans posts_archive), toutes les données (sélectionnez * dans posts_all) et de production (sélectionnez * dans public.posts) séparément
- Peut faire un vidage des schémas d'archivage séparément et déposer une cascade sur eux de manière simple. pg_dump -s archive_2005 datase_name drop schema archive_2005 cascade; - soyez prudent car il supprime toutes les tables associées
- Anciennes données séparées physiquement par l'espace de table et logiquement par le schéma.
- Structure assez compliquée pour gérer le processus d'archivage
- Peut créer différents index sur les tables de production et d'archivage pour optimiser les requêtes à la fois (index plus petits et spécialisés = requêtes plus rapides et moins d'espace requis)
- Si vous avez des tables partitionnées (par année ou mois), le processus d'archivage consistera simplement à déplacer la table entière
archive_tablespace
ou à la modifier pour hériter de posts_archive (je n'ai pas testé cela)
- Si vous ne souhaitez pas accéder aux anciennes données (archivées), vous n'avez rien à changer dans l'application.
Il s'agit d'une technique générale et vous devez l'adapter à vos besoins. Des suggestions pour améliorer cela?
Lectures complémentaires: héritage PostgreSQL , partitionnement
Create tables (table posts example):
. Pouvez-vous expliquer cette étape spécifique sur le nombre de tables au total et sur la relation entre l'héritage entre les tables?posts
,posts-all
ouposts-archive
), qui existe uniquement pour représenter l'ensemble de données?