====== postgres Basics ====== [[https://computingforgeeks.com/how-to-install-postgresql-13-on-ubuntu/|https://computingforgeeks.com/how-to-install-postgresql-13-on-ubuntu/]] ===== Shell Zugang ===== psql Cheat Sheet: [[https://tomcam.github.io/postgres/|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 ===== Datenbank und User anlegen ===== create database sqlmail; create user sqlmail with encrypted password 'xxxxxxxxxxxx'; grant all privileges on database sqlmail to sqlmail; ===== Datenbank duplizieren ===== 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; ===== Schemata ===== [[https://www.postgresqltutorial.com/postgresql-administration/postgresql-schema/|https://www.postgresqltutorial.com/postgresql-administration/postgresql-schema/]] Das Standard Schema ist public ===== Arbeiten an der Datenbank ===== 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 ===== Benutzeraktionen ===== \du listet alle User neuen User anlegen ("ROLE") postgres=# CREATE ROLE discourse2; CREATE ROLE postgres=# Passwort setzen ALTER ROLE [username] WITH PASSWORD 'xxxx'; ==== GRANT Statement ==== nur login ALTER ROLE discourse2 LOGIN; Weitere Privilegien: GRANT privilege_list | ALL ON table_name TO role_name; privilege_list kann ''[[https://neon.tech/postgresql/postgresql-tutorial/postgresql-select|SELECT'']]'' , ''[[https://neon.tech/postgresql/postgresql-tutorial/postgresql-insert|INSERT'']]'',''[[https://neon.tech/postgresql/postgresql-tutorial/postgresql-update|UPDATE'']]'', ''[[https://neon.tech/postgresql/postgresql-tutorial/postgresql-delete|DELETE'']]'',''[[https://neon.tech/postgresql/postgresql-tutorial/postgresql-truncate-table|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; ===== Tabellen-Aktionen ===== 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'; ===== Daten-Aktionen ===== 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; ===== Historie der Kommandos in psql ===== \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 -h -p -U 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 ===== Templates und UTF8 encoding ===== 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/|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