Commande Postgres DB Size

324

Existe-t-il une commande pour trouver toute la taille des bases de données dans Postgres?

Je peux trouver la taille d'une base de données spécifique en utilisant la commande suivante:

select pg_database_size('databaseName');
Bel esprit
la source
1
Mais quelle est son unité? Est-ce en octets?
Abel Callejo
Ce sont des octets. :-)
john16384

Réponses:

365

Et ... Si au cas où vous ne voudriez pas taper une requête entière ... vous pouvez également taper ...

\l+ <database_name>

et vous obtiendrez quelques détails sur la base de données, y compris la taille de la base de données.

Et ... Pour obtenir la taille de toutes les bases de données.

vous pouvez simplement taper ...

\l+

Vous devrez peut-être accéder à l'invite de commandes postgresql pour effectuer une requête avec ces commandes d'assistance postgresql.

Vérifiez les autres commandes d'assistance postgresql en tapant

\?

à l'invite de commande postgresql.

Ashish
la source
193

Vous pouvez obtenir les noms de toutes les bases de données auxquelles vous pouvez vous connecter à partir de la table système "pg_datbase". Appliquez simplement la fonction aux noms, comme ci-dessous.

select t1.datname AS db_name,  
       pg_size_pretty(pg_database_size(t1.datname)) as db_size
from pg_database t1
order by pg_database_size(t1.datname) desc;

Si vous souhaitez que la sortie soit consommée par une machine au lieu d'un humain, vous pouvez couper la fonction pg_size_pretty ().

Mike Sherrill 'Cat Recall'
la source
Parfois, la base de données contient également des index. Il a une certaine valeur de stockage. Je recherche une commande qui fournira la taille de la base de données complète.
Beautiful Mind
11
@ user2151087: pg_database_size() inclut les tailles des index
a_horse_with_no_name
Au cas où quelqu'un se demanderait, cette requête fournit exactement les mêmes valeurs que \l+. Le format de sortie est cependant plus facile à lire (moins de colonnes). Compromis entre écriture et lisibilité…
Skippy le Grand Gourou
158
-- Database Size
SELECT pg_size_pretty(pg_database_size('Database Name'));
-- Table Size
SELECT pg_size_pretty(pg_relation_size('table_name'));
Srinivasreddy Jakkireddy
la source
5
En quoi cette réponse est-elle différente de celle de Mike?
a_horse_with_no_name
3
Pour l'avenir, moi et les autres atterrissant ici, je vous éviterai le problème: celui-ci est plus court et pour la base de données / table nommée où Mike est pour toutes les bases de données sur le serveur dont ce dernier répond mieux à la question d'origine.
James Brown
78

Basé sur la réponse ici de @Hendy Irawan

Afficher les tailles de base de données:

\l+

par exemple

=> \l+
 berbatik_prd_commerce    | berbatik_prd     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 19 MB   | pg_default | 
 berbatik_stg_commerce    | berbatik_stg     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 8633 kB | pg_default | 
 bursasajadah_prd         | bursasajadah_prd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1122 MB | pg_default | 

Afficher les tailles de table:

\d+

par exemple

=> \d+
 public | tuneeca_prd | table | tomcat | 8192 bytes | 
 public | tuneeca_stg | table | tomcat | 1464 kB    | 

Fonctionne uniquement en psql.

owyongsk
la source
1
Pour moi, seulement \d+ *travaillé, plaine \d+est revenueDid not find any relations.
phil pirozhkov
1
@philpirozhkov Connectez-vous d'abord à une base de données ( \c dbname), puis faites \d+.
chappjc
Est-ce un numéro un ou un L minuscule?
dman
28

Oui, il existe une commande pour trouver la taille d'une base de données dans Postgres. C'est le suivant:

SELECT pg_database.datname as "database_name", pg_size_pretty(pg_database_size(pg_database.datname)) AS size_in_mb FROM pg_database ORDER by size_in_mb DESC;
Anoop Sharma
la source
3
L'ordre est incorrect dans cette fonction. Il ne peut pas faire la différence entre les formats lisibles par l'homme. Par exemple, la base de données de taille 7151 Ko précède la base de données de taille 7 Go.
onnimonni du
Corrigé:SELECT database_name, pg_size_pretty(size) from (SELECT pg_database.datname as "database_name", pg_database_size(pg_database.datname) AS size FROM pg_database ORDER by size DESC) as ordered;
Michael
1
Je pense que vous avez besoin de la taille "brute" pour le tri uniquement. J'ai utilisé cela au lieu d'une sous-requête SELECT pg_database.datname AS "DB Name", pg_size_pretty(pg_database_size(pg_database.datname)) AS "Size" FROM pg_database ORDER BY (pg_database_size(pg_database.datname)) DESC;.
M-Dahab
20
SELECT pg_size_pretty(pg_database_size('name of database'));

Vous donnera la taille totale d'une base de données particulière, mais je ne pense pas que vous puissiez faire toutes les bases de données sur un serveur.

Cependant, vous pouvez le faire ...

DO
$$
DECLARE
r   RECORD;
db_size TEXT;
BEGIN
FOR r in
SELECT datname FROM pg_database
WHERE datistemplate = false
LOOP
db_size:= (SELECT pg_size_pretty(pg_database_size(r.datname)));

RAISE NOTICE 'Database:% , Size:%', r.datname , db_size;

END LOOP;
END;
$$
Shaun McCready
la source
pourquoi ne peut-il pas s'agir d'une seule requête pg_databaseplutôt que de ce hideux pl / pgsql?
MozenRath
12

À partir du wiki PostgreSQL .


REMARQUE: les bases de données auxquelles l'utilisateur ne peut pas se connecter sont triées comme si elles étaient de taille infinie.

SELECT d.datname AS Name,  pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
        ELSE 'No Access'
    END AS Size
FROM pg_catalog.pg_database d
    ORDER BY
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_database_size(d.datname)
        ELSE NULL
    END DESC -- nulls first
    LIMIT 20

La page contient également des extraits pour trouver la taille de vos plus grandes relations et de vos plus grandes tables.

GollyJer
la source
4

Vous pouvez utiliser la requête ci-dessous pour trouver la taille de toutes les bases de données de PostgreSQL.

La référence est tirée de ce blog.

SELECT 
    datname AS DatabaseName
    ,pg_catalog.pg_get_userbyid(datdba) AS OwnerName
    ,CASE 
        WHEN pg_catalog.has_database_privilege(datname, 'CONNECT')
        THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(datname))
        ELSE 'No Access For You'
    END AS DatabaseSize
FROM pg_catalog.pg_database
ORDER BY 
    CASE 
        WHEN pg_catalog.has_database_privilege(datname, 'CONNECT')
        THEN pg_catalog.pg_database_size(datname)
        ELSE NULL
    END DESC;
Anvesh
la source
3

Démarrez pgAdmin, connectez-vous au serveur, cliquez sur le nom de la base de données et sélectionnez l'onglet Statistiques. Vous verrez la taille de la base de données au bas de la liste.

Ensuite, si vous cliquez sur une autre base de données, elle reste sur l'onglet Statistiques afin que vous puissiez facilement voir de nombreuses tailles de base de données sans trop d'effort. Si vous ouvrez la liste des tableaux, elle affiche tous les tableaux et leurs tailles.

SPRBRN
la source
1
Et si vous cliquez sur le Databasesnœud de l' arborescence (attaché à une connexion DB) et sélectionnez l' Statisticsonglet, vous serez présenté avec un joli résumé de toutes les bases de données et leurs tailles (troisième colonne).
zloster
2
du -k /var/lib/postgresql/ |sort -n |tail
Jon Carnes
la source
2
Vous voudrez peut-être ajouter plus de contexte sur les hypothèses que cela fait concernant l'emplacement où la base de données stocke ses données, à quoi ressemblera la sortie de cela, etc.
fzzfzzfzz
3
Bien que cela puisse être une réponse précise, il est préférable d'inclure des explications.
sniperd
La commande correcte sur CentOS est celle-ci: du -k /var/lib/pgsql/ | sort -n | tail
Feriman