Zum Hauptinhalt springen
  1. Braindump/

psql: Ein paar nützliche Befehle und Queries

2 min
Marcel Ryser
Autor
Marcel Ryser
Softwarearchitekt und Tech-Enthusiast aus Bern

Was du kennen solltest
#

Dieser Abschnitt sammelt Befehle, die du beim Arbeiten mit PostgreSQLs psql kennen solltest!

An fast jeden Befehl kannst du ein S anhängen, um auch System-Objekte anzuzeigen, und ein +, um mehr Informationen zu sehen!

Datenbank
#

  • \l Alle Datenbanken auflisten
  • \c databasename Mit der Datenbank databasename verbinden

Tabellen/Relationen/Views
#

  • \d Alle Tabellen, Views und Sequences auflisten
  • \d tablename Definition der Tabelle tablename anzeigen
  • \dt Nur Tabellen auflisten
  • \dv Nur Views auflisten
  • \ds Nur Sequences auflisten
  • \dp Berechtigungen für Tabellen, Views und Sequences auflisten

Benutzer
#

  • \du Alle Benutzer auflisten

Aufgaben im Alltag
#

Ein paar Queries für alltägliche Aufgaben an einem PostgreSQL-Server.

Neuen Benutzer mit Passwort anlegen
#

create user myuser with password 'very-secure-password';

Datenbank für einen Benutzer anlegen (der zugleich Owner ist)
#

create database newdatabase with owner myuser;

Statistiken wie Tabellengrössen, Zeilenanzahl und Index-Grösse anzeigen
#

SELECT t.tablename,
    foo.indexname,
    c.reltuples AS num_rows,
    pg_size_pretty(pg_relation_size(quote_ident(t.tablename::text)::regclass)) AS table_size,
    pg_size_pretty(pg_total_relation_size(s.relid::regclass)) AS table_total_size,
    pg_size_pretty(pg_total_relation_size(s.relid::regclass) - pg_relation_size(s.relid::regclass)) AS table_external_size,
    pg_size_pretty(pg_relation_size(quote_ident(foo.indexrelname::text)::regclass)) AS index_size,
        CASE
            WHEN foo.indisunique THEN 'Y'::text
            ELSE 'N'::text
        END AS "index_unique",
    foo.idx_scan AS number_of_scans,
    foo.idx_tup_read AS tuples_read,
    foo.idx_tup_fetch AS tuples_fetched
   FROM pg_tables t
     LEFT JOIN pg_class c ON t.tablename = c.relname
     LEFT JOIN pg_statio_user_tables s ON s.relname = t.tablename
     LEFT JOIN ( SELECT c_1.relname AS ctablename,
            ipg.relname AS indexname,
            x.indnatts AS number_of_columns,
            psai.idx_scan,
            psai.idx_tup_read,
            psai.idx_tup_fetch,
            psai.indexrelname,
            x.indisunique
           FROM pg_index x
             JOIN pg_class c_1 ON c_1.oid = x.indrelid
             JOIN pg_class ipg ON ipg.oid = x.indexrelid
             JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid) foo ON t.tablename = foo.ctablename
  WHERE t.schemaname = 'public'::name
  ORDER BY t.tablename, foo.indexname

Owner für Tabellen/Funktionen/Sequences ändern
#

Mit diesen Statements generierst du nur das SQL, um den Owner dieser Objekte zu ändern. Das generierte SQL musst du danach selbst ausführen. In den Beispielen wird das public-Schema verwendet, passe es nach Bedarf an.

Tabellen

select 'ALTER TABLE '|| tablename ||' OWNER TO {newOwner};' FROM pg_tables WHERE schemaname = 'public';

Funktionen

SELECT 'ALTER FUNCTION '
            || quote_ident(n.nspname) || '.' 
            || quote_ident(p.proname) || '(' 
            || pg_catalog.pg_get_function_identity_arguments(p.oid)
            || ') OWNER TO {newOwner};'
          , E'\n' AS _sql
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  n.nspname = 'public';

Sequences

SELECT 'ALTER SEQUENCE '
            || quote_ident(n.nspname) || '.'
            || quote_ident(c.relname)
            || ' OWNER TO {newOwner};'
FROM   pg_catalog.pg_class c
JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE  n.nspname = 'public' AND c.relkind = 'S';