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:
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?
La taille peut différer en raison de plusieurs raisons:
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:
É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:
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.