postgres

postgres Basics

psql Cheat Sheet: https://tomcam.github.io/postgres/

thommie@db2b:~$ sudo su postgres
\l

listet alle Datenbanken

  • \c verbindet zu einer Datenbank
  • \dt zeigt die Tabellen nach einer Verbindung
  • \d und \d+ zeigt die Spalten einer Tabelle
  • \du Benutzerrollen
create database sqlmail;

create user sqlmail with encrypted password 'xxxxxxxxxxxx';

grant all privileges on database sqlmail to sqlmail;

WER greift gerade auf die DB zu?

SELECT usename, datname, state FROM pg_stat_activity WHERE usename='discourse2';

Alle aktiven Verbindungen zu dieser DB trennen

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'discourse2' AND leader_pid IS NULL;

Danach kann man die Datenbank duplizieren, indem man die Quelldatenbank als Template benutzt

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

dt listet alle Tabellen in einer Datenbank auf

Nach "\c discourse2": alle Tabellen in einer DB löschen

DO $$ DECLARE
  r RECORD;
BEGIN
  FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
    EXECUTE 'DROP TABLE ' || quote_ident(r.tablename) || ' CASCADE';
  END LOOP;
END $$;

q beendet die Verbindung

\du listet alle User

neuen User anlegen ("ROLE")

postgres=# CREATE ROLE discourse2;
CREATE ROLE
postgres=#

Passwort setzen

ALTER ROLE [username] WITH PASSWORD 'xxxx';

nur login

ALTER ROLE discourse2 LOGIN;

Weitere Privilegien:

GRANT privilege_list | ALL
ON  table_name
TO  role_name;

privilege_list kann SELECT'' , INSERT'',UPDATE'', DELETE'',TRUNCATE''etc. sein. Mit ALL geht alles (lesen, schreiben, löschen usw.

GRANT ALL ON DATABASE [dbname] TO [username];

postgres=# GRANT ALL ON DATABASE keycloak TO keycloak;
GRANT

Löschen eines Users

drop user IF EXISTS dendrite;

Alle Tabellen löschen

DO $$
DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP
   EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

check

SELECT tablename FROM pg_tables WHERE schemaname = 'public';
do $$ declare
   r record;
begin
   for r in (select tablename from pg_tables where schemaname = 'my-schema-name') loop
   execute 'drop table if exists ' || quote_ident(r.tablename) || ' cascade';
   end loop;
end $$;

Komplette Datenbank löschen

drop DATABASE onlyoffice;

\s command history

beenden

\q DB shell beenden

Dump einer Datenbank als sql file

  • Login auf postgres Server
  • sudo nach postgres
  • Wechsel ins Home Dir von postgres (wg. Schreibrechten für sql File)
root@db2b:/home/thommie# sudo su postgres
postgres@db2b:/home/thommie$ cd ~
postgres@db2b:~$ pwd
/var/lib/postgresql

mit psql \l Namen aller DBs auflisten

postgres@db2b:~$ psql
psql (13.6 (Ubuntu 13.6-1.pgdg20.04+1))
Type "help" for help.
postgres=# \l

Danach die Datenbanken dumpen:

pg_dump pixelfed>> pixelfed_tokoeka.sql

Datenbank löschen

$ dropdb your_database​

Verbindungstest zum postgresql Server

Test einer postgres Verbindung: pg_isready ist Teil von postgresql-client

pg_isready -d <db_name> -h <host_name> -p <port_number> -U <db_user>

Praktisch:

root@docker2:/var/discourse# pg_isready -d Discoursedev -h 10.10.10.18 -p 5432 -U Discourse
10.10.10.18:5432 - Verbindungen werden angenommen
root@docker2:/var/discourse#

Import der Datenbanken

psql -U postgres -W -d keycloak -f keycloak_tokoeka.sql

Standardmässig werden neue Datenbanken mit der Zeichenkondierung SQL_ASCIIangelegt. Das passt meistens, aber nicht immer. Mit dieser Methode werden DBs mit UTF8 Kodierung angelegt:

https://www.shubhamdipt.com/blog/how-to-change-postgresql-database-encoding-to-utf8/

postgres=# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
postgres=# DROP DATABASE template1;
postgres=# CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UTF8';
postgres=# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
postgres=# \c template1;
You are now connected to database "template1" as user "postgres".
template1=# VACUUM FREEZE;

Neu angelegte DBs auf Basis von template1 haben danach utf8 encoding

  • postgres.txt
  • Zuletzt geändert: 11/05/2025 - 16:46
  • von thommie_netzwissen.de