web-dev-qa-db-fra.com

Les fichiers de données PostgreSQL ont une taille plus que des données elles-mêmes

Nous avons un système qui accomplit certains données archivant vers un dB PostgreSQL. Nous avons découvert que le stockage de PC était plein à cause de l'archivage de la DB. Le problème est que j'ai vérifié les fichiers de données résidant dans /var/lib/pgsql/data/base/ Et ils avaient environ 70 Go au total, alors que lorsque j'ai largué toutes les bases de données en utilisant pg_dump Les fichiers de sortie n'ont pas dépassé 24 Go. Est-ce que je manque quelque chose ici ou mal comprendre quelque chose? Où est cette grande différence de taille?

EDIT: J'ai fait pg_dump Pour contenir le schéma et les données avec l'option -c Pour permettre la chute et la création.

EDIT 2: J'ai étudié le fichier de schéma de base de données et j'ai découvert que la table contenait près de 23,9 Go de 24 Go (environ 332,4 lignes de milions) de données a un indice à ce sujet. Il y a un autre index sur une autre table, mais la table est vide.

Edit 3: Le programme stocke des valeurs d'environ 1500 variables périodiquement, je veux dire que toutes les variables sont enregistrées de 0,1 seconde à 1 minute ou un peu plus, donc je pense qu'il y a un énorme accès à la DB ici.

Edit 4: J'ai exécuté la deuxième requête ici Pour trouver la taille de chaque relation dans le schéma et j'ai découvert les éléments suivants:

  • 28 Go pour la table principale de données.
  • environ 42 gb pour 3 index uniquement! 24, 9, 9.

Mon but est que je veux faire une sauvegarde et restaurer fréquemment (tous les quelques mois). Devrais-je me soucier de ces indices de DB lors de la sauvegarde et de la restauration ou de la concentration sur mes tables de données?

7
3bdalla

La taille peut différer en raison de plusieurs raisons:

  • les index prennent un espace disque,
  • il peut y avoir plusieurs copies du même enregistrement sur disque,
  • espace de relâchement dans les pages.

Les index prennent de l'espace disque afin de faciliter une recherche plus rapide. Plus vous avez d'index, plus votre DB sera de l'espace DB. Les index gin sont généralement plus petits, mais ne sont pas utiles si vous utilisez des requêtes de la plage.

PostgreSQL prend en charge l'accès simultané, qui est mis en œuvre, ce qui met à jour et supprime les enregistrements ne modifie que la visibilité des enregistrements et non de supprimer ou d'écraser les données, car un enregistrement peut être utilisé par une autre transaction. Avec la mise à jour, une nouvelle copie (mise à jour) reçoit ensuite. Les deux signifient que d'anciennes données sont toujours écrites sur le disque. Pour libérer, PostgreSQL effectue périodiquement l'aspirateur, ce qui supprime réellement les enregistrements supprimés (après qu'aucune transaction ne les utilise).

PostgreSQL a la taille de bloc par défaut de 8 Ko. Si vos archives sont grandes, disons 5 Ko, vous ne pouvez obtenir qu'un enregistrement dans un seul bloc, avoir assez grand (~ 3kb).

Certaines solutions possibles sont:

  • Assurez-vous de savoir comment vérifier l'utilisation du disque dans PostgreSQL ,
  • réévaluer si vous avez vraiment besoin de tous les index,
  • pensez à ce que votre modèle d'accès aux données est - s'il s'agit d'une seule table, il devrait y avoir très peu d'enregistrements invisibles. Si, d'autre part, vos données sont modifiées pendant un temps et sont archivées après une période, il s'agit possible de la citation possible, que plusieurs enregistrements sont sur le disque. Si tel est le cas, puis partitionnez votre table pourrait vous aider, car vous pouvez aspirer des partitions séparément.
  • vous pouvez vide la table manuellement . N'utilisez pas l'aspirateur plein, car il écrira une nouvelle copie de la table et nécessite des quantités appropriées d'espace disque.
  • vous pouvez utiliser une partie de la part des outils en ligne (en ligne que vous n'avez pas besoin d'éteindre les outils de rechange), tels que pg_repack .

Éditer:

pg_dump

pg_dump va bien, si vous spécifiez les données de dépôt, comme vous avez dit que vous l'avez dit. Si vous utilisez le format personnalisé (-FC Drapeaux), pg_restore pourra faire des choses supplémentaires avec elle, telles que la charge uniquement des tables spécifiées, voir la page de l'homme de PG_Dump. Volume de Gzips de format personnalisé par défaut. Cela peut ralentir votre dumping. Vous voudrez peut-être désactiver cela, et si vous voulez toujours des données gzippées, il y a une gzip parallèle (porc).

sauvegardes

Lorsque vous sauvegardez, vous sauvegardez des données dans des tables. Les index sont recréés à partir de données dans des tables. Si vous pouvez vous permettre de lourde IO sur la base de données lorsque vous effectuez des sauvegardes et des restaurations, pg_dump et pg_restore peuvent répondre à vos besoins. Lorsque le dumping, pg_dumpks ne verse que des tables, et lors de la restauration, des index sont reconstruits automatiquement dans le cadre de la restauration. Donc, pour préciser: les sauvegardes ne se soucient pas des index.

Si lourd IO et performances dégradées n'est pas acceptable, vous souhaiterez peut-être avoir un serveur de réplication secondaire, qui aura une copie des données, mais ne servira pas vos requêtes ordinaires, afin que vous puissiez Utilisez-le pour faire des décharges.

Si vous avez besoin d'une capacité de restauration de temps à temps, vous pouvez configurer l'archivage du journal WAL (journal en écriture en écriture), ce qui vous permet ensuite de restaurer une transaction spécifique, mais cela est assez avancé. Il existe des outils pour aider, tels que barman .

gros index

Comme vous avez déjà découvert, les index peuvent prendre beaucoup d'espace. Si vous additionnez vos données et index, vous obtenez votre format de base de données: 28 Go + 42GB = 70 Go.

Avoir de grands index signifie qu'il y a beaucoup d'espace disque supplémentaire utilisé. Les données d'index sont également mises en cache en mémoire, de sorte que les gros index signifie que vous pouvez avoir deux copies de données indexées en RAM, ce qui signifie qu'il y a moins RAM pour la mise en cache des données sur le disque et vous obtenez plus de cachettes. Il existe certaines options pour évaluer pour rendre les indices plus petits:

  • index partiels : Si l'application ne fait que requête qu'un seul champ est défini sur une valeur spécifique, vous pouvez limiter quelles lignes sont indexées avec une clause WHERE INDICE.
  • Utilisez l'analyse d'index : Si vous pouvez inclure toutes les données interrogées dans un index, PostgreSQL peut revenir en lisant uniquement les données d'index. Fonctionne depuis PostgreSQL 9.2, en savoir plus sur Index scan sur wiki .
  • Utilisez un autre type d'index : Si votre application utilise uniquement la recherche d'égalité (où A = 4), les index gin peuvent être beaucoup plus petits, voir - Extension BTTREE_GIN . PostgreSQL 9.5 apportera également des indices Brin, qui sont vraiment utiles pour les champs, qui ont un motif croissant monotone ou décroissant, tel que des horodatages et qu'ils sont vraiment vraiment petits, vous pouvez donc libérer à la fois un espace disque pour plus de stockage et RAM pour la mise en cache plus de données.

Mais ... beaucoup de cela dépend de la manière dont les données sont accessibles, ce qui n'est souvent connu que par le développeur de l'application.

12
hruske