Je voudrais partitionner une table avec 1M + lignes par plage de dates. Comment cela se fait-il généralement sans nécessiter beaucoup de temps d'arrêt ou risquer de perdre des données? Voici les stratégies que j'envisage, mais ouvertes aux suggestions:
La table existante est le maître et les enfants en héritent. Au fil du temps, déplacez les données du maître vers l'enfant, mais il y aura une période de temps où certaines des données seront dans la table principale et d'autres dans les enfants.
Créez une nouvelle table principale et des tables enfants. Créez une copie des données dans la table existante dans les tables enfants (pour que les données résident à deux endroits). Une fois que les tables enfants ont les données les plus récentes, modifiez toutes les insertions à l'avenir pour pointer vers la nouvelle table principale et supprimez la table existante.
la source
DELETE FROM ONLY master_table
est la solution.Réponses:
Étant donné que le n ° 1 nécessite la copie des données du maître vers l'enfant alors qu'il se trouve dans un environnement de production actif, j'ai personnellement opté pour le n ° 2 (création d'un nouveau maître). Cela empêche les perturbations de la table d'origine pendant qu'elle est activement utilisée et s'il y a des problèmes, je peux facilement supprimer le nouveau maître sans problème et continuer à utiliser la table d'origine. Voici les étapes pour le faire:
Créez une nouvelle table principale.
Créez des enfants qui héritent du maître.
Copiez toutes les données historiques dans une nouvelle table principale
Suspendre temporairement les nouvelles insertions / mises à jour de la base de données de production
Copiez les données les plus récentes dans la nouvelle table principale
Renommez les tables pour que new_master devienne la base de données de production.
Ajoutez une fonction pour les instructions INSERT à old_master afin que les données soient transmises à la partition correcte.
Ajouter un déclencheur pour que la fonction soit appelée sur INSERTS
Définissez l'exclusion des contraintes sur ON
Réactivez les MISES À JOUR et INSERTS sur la base de données de production
Configurez le déclencheur ou le cron afin que de nouvelles partitions soient créées et que la fonction soit mise à jour pour affecter de nouvelles données à la partition correcte. Référencez cet article pour des exemples de code
Supprimer old_master_backup
la source
vacuum
ne pas rattraper le retard ou d'être empêchées en raison de sessions "inactives en transaction".Il existe un nouvel outil appelé pg_pathman ( https://github.com/postgrespro/pg_pathman ) qui le ferait automatiquement pour vous.
Donc, quelque chose comme le suivant le ferait.
la source