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?
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:
UPDATE
est équivalent à un INSERT
avec un DELETE
, avec la surcharge (au moins en termes d'espace utilisé) associé aux deux.INSERT
ing, UPDATE
ing ou DELETE
ing, vous avez simultanément plusieurs copies de chaque rangée impliquée.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 .