web-dev-qa-db-fra.com

Taille de la base de données réduite après la sauvegarde sur PostgreSQL 8.3 et restauration dans PostgreSQL 9.4

J'ai fait un pg_dump Sur une base de données JIRA que j'avais hébergée dans un serveur PostgreSQL 8.3. Taille de la base de données après vacuum full a été 217132652 (environ 207 Mo).

Ensuite, j'ai restauré cette base de données JIRA sur un serveur PostgreSQL 9.4 avec la commande suivante:

$ psql -X -v ON_ERROR_STOP=1 -d jira2 -U jira -h localhost < jiradb2017_03_12.sql

Je suppose que la restauration quitterait une erreur depuis que j'ai utilisé ON_ERROR_STOP=1, mais le script SQL a terminé correctement (malgré certains avertissements non liés à la restauration de données).

J'ai fini par une base de données avec une taille de 158019348 (environ 151 Mo).

Alors, quelle est l'histoire ici? Puis-je simplement assumer la base de données a été restauré avec succès et PostgreSQL a optimisé son stockage (quelque part entre les versions 8.3 et 9.4) et utilise de l'espace plus efficacement?

8
Pablo Santa Cruz

Lorsque vous restaurez une base de données, vous avez toutes les informations sur elle emballées , sans espace vide entre les lignes (ni les indices), à moins que certains paramètres spécifiques ne soient dans Place (fondamentalement: FILLFACTOR pour les tables et FILLFACTOR pour les indices ).

D'autre part, lorsque votre base de données utilisée est utilisée depuis un certain temps, vous avez eu votre part d'insertions, de mises à jour et de suppression, Un espace inutilisé gratuit apparaîtra . C'est à cause de la façon dont PostgreSQL et contrôle de la combinaison multiversion, A.K.A. MVCC Travail. MVCC permet moins de verres, ce qui signifie fondamentalement que vous enregistrer heure. Mais vous payez un prix en termes de espace:

  1. Chaque UPDATE est équivalent à un INSERT avec un DELETE, avec la surcharge (au moins en termes d'espace utilisé) associé aux deux.
  2. Lorsque vous avez plusieurs transactions en cours d'exécution et que chacun est INSERT ing, UPDATE ing ou DELETE ing, vous avez simultanément plusieurs copies de chaque rangée impliquée.
  3. L'espace alloué à ces versions de ligne ne sera pas libéré immédiatement après commettre, et pendant un certain temps, sera espace non utilisé dans les fichiers où vos données de table (et index) est stocké.

Autovacuum prend soin de cet espace réutilisable par défaut ou une procédure spécifique pour aspirateur de routine .

Ce fait peut déjà expliquer le changement de taille.

Les optimisations entre les versions ont probablement également eu lieu; et peut expliquer d'autres améliorations. Les optimisations auraient également pu être faites pour la vitesse et non pour la taille, et la taille réelle pourrait réellement grandir d'une version à la prochaine. Je ne connais vraiment pas les détails pour pouvoir dire; Bien que le commentaire de @erwin indique que les deux changements rendant vos tables se contractent et que les changements rendant vos tables bouffonnées (grandir) ont eu lieu depuis la version 8.3.

Pour distinguer les deux effets, si vous êtes curieux, vous pouvez simplement, comme @jack Douglas le suggère, restaurez votre base de données sur 8.3. Cela se rétrécira probablement de taille. Si elle se contracte à moins de 151 Mo (une taille plus petite que ce que vous obtenez avec la version 9.4), la suppression de l'espace inutilisé a effectué votre db rétrécir et que la version change de version a réellement effectué votre db croissance .


Pour une meilleure compréhension de MVCC, examinez présentation de Bruce Momjian .

10
joanolo