====== PostgreSQL ====== * [[http://www.postgresql.org/]] * **[[https://www.codeflow.site/de/article/introduction-to-queries-postgresql|Eine Einführung in Abfragen in PostgreSQL]]** * [[http://www.heise.de/ix/news/foren/S-PostgreSQL-9-0-Beta-mit-eingebauter-Replikation/forum-178753/list/]] * [[https://wiki.postgresql.org/wiki/FAQ/de]] * [[http://burger-ag.de/postgresql.whtml]] Seit ''PostgreSQL 9.0 (2010)'' gibt es eine eingebaute Replikation (Streaming Replication: [[::datenbank:PostgreSQL WAL-Shipping]]). * [[http://wiki.postgresql.org/]] * [[http://www.pg-forum.de/|deutsches PostgreSQL Forum]] * **[[http://www.postgresql.de/postgresql_outline.html]]** -> Überblick über die Eigenschaften * **[[http://www.postgresql.de/features.html]]** -> Überblick über die Funktionen * [[http://www.postgresql.sk/docs/books/pghandbuch.html.de|PostgreSQL: Das offizielle Handbuch]] -> [[http://www.amazon.de/PostgreSQL-offizielle-Handbuch-Peter-Eisentraut/dp/3826613376|ISBN 3-8266-1337-6]] * {{::pg-handbuch.pdf|Das offizielle Handbuch als PDF}} * [[http://www.postgresql.de/info.whtml#doc]] * **[[http://www.postgresql.org/docs/]]** ===== Anleitungen bzw. Beispiele ===== * **[[::Datenbank:PostgreSQL Upgrade]]** * [[::Datenbank:PostgreSQL 12]] * [[::Datenbank:PostgreSQL 9.5.2]] * [[::Datenbank:PostgreSQL 8.1]] * [[::Datenbank:PostgreSQL 8.0]] * [[::Datenbank:PostgreSQL 7.1.3]] passwortloser login mit ''[[https://wiki.postgresql.org/wiki/Pgpass|~/.pgpass]]'': > touch ~/.pgpass > chmod 0600 ~/.pgpass > vi ~/.pgpass hostname:port:database:username:password > vi ~/.bashrc PGPASSFILE="$HOME/.pgpass" > echo "\dt;" | psql database individuelle Konfiguration mit ''~/.psqlrc'': > echo "\dt;" | psql postgresql://username:password@address:5432/database > echo '\timing on' >> ~/.psqlrc > echo '\c postgresql://username@address:5432/database' >> ~/.psqlrc PG-User ändert sein eigenes Passwort: > psql -U dbuser -d dbname dbname=> \password Enter new password for user "dbuser": Enter it again: dbname=> quit ''SHOW USERS'': > echo "\du" | psql -U postgres -d postgres ''SHOW DATABASES'': > psql -U postgres -l > echo -e "\l" | psql -U username -d postgres ''SHOW TABLES'': > echo "\dt" | psql -U username -d database > echo "SELECT * FROM pg_catalog.pg_tables;" | psql -U username -d database ''SELECT FROM TABLE'': > echo "echo "SELECT COUNT(*) FROM tabellenname;" | psql -U username -d database ''CREATE DATABASE'': > echo "CREATE DATABASE database OWNER = username;" | psql -U postgres ''CREATE TABLE'': > echo "CREATE TABLE tabellenname (...);" | psql -U username -d database ''CREATE TABLE'' mit "Auto Increment" //("Auto Increment" heißt in PostgreSQL ''SERIAL'' oder ''BIGSERIAL'')//: > echo "CREATE TABLE film (ID BIGSERIAL PRIMARY KEY, verzeichnis varchar(1000), datei varchar(100), name varchar(100), type varchar(100), jahr integer, laufzeit integer, altersfreigabe integer, genre varchar(100), produzent varchar(100), regie varchar(100), schauspieler varchar(10000), handlung varchar(100000), UNIQUE (pfad, dateiname));" | psql -U username -d database Tabellenstruktur anzeigen: > echo "\d+ tabellenname" | psql -U username -d database soll die ''~/.psqlrc'' nicht berücksichtigt werden, dann braucht man ''-X'' > echo "SELECT COUNT(*) FROM tabellenname;" | psql -X -U username -d database ''SHOW CREATE TABLE'': > pg_dump --schema-only -U username -d database -t tabellenname ''ADD PRIMARY KEY'': > ALTER TABLE tabellenname ADD PRIMARY KEY(spalte1, spalte2); ''DROP TABLE'': > echo "DROP TABLE tabellenname;" | psql -U username -d database ''SHOW FULL PROCESSLIST'': > echo "SELECT * FROM pg_stat_activity;" | psql -U postgres > echo "SELECT datname, pid, state, query, age(clock_timestamp(), query_start) AS age FROM pg_stat_activity WHERE state <> 'idle' AND query NOT LIKE '% FROM pg_stat_activity %' ORDER BY age;" | psql -U username -h 10.1.1.10 ==== TEMP TABLE ==== DROP TABLE IF EXISTS TmpTabNamen; BEGIN TRANSACTION; CREATE TEMP TABLE TmpTabNamen AS SELECT ... FROM TabNamen WHERE ...; COMMIT; SELECT * FROM TmpTabNamen WHERE ...; DROP TABLE IF EXISTS TmpTabNamen; ===== PostgreSQL 12 auf Debian 11 installieren ===== Repository einrichten > apt update && apt -y full-upgrade > wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc > /etc/apt/keyrings/pgdg.asc > apt -y install gnupg2 > echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list > apt update den Postgresql-Client installieren > apt install postgresql-client-12 den Postgresql-Server (incl. Client) installieren > apt install postgresql-12 ===== PostgreSQL-Wartung ===== Werkzeug für die PostgreSQL-Leistungsüberwachung, ähnlich top: [root@freebsd12 ~]# cd /usr/ports/www/p5-LWP-UserAgent-WithCache && make clean && make && make install ; make clean [root@freebsd12 ~]# cd /usr/ports/databases/pgtop && make clean && make && make install ; make clean [root@freebsd12 ~]# touch ~/.pgtop [root@freebsd12 ~]# chmod 0600 ~/.pgtop [root@freebsd12 ~]# vi ~/.pgtop user=postgres pass= host=localhost port=5432 db=test [root@erde ~]# su - postgres -c "echo 'CREATE DATABASE test OWNER = postgres;' | psql postgres" CREATE DATABASE [root@erde ~]# su - postgres -c "echo '\l' | psql postgres" List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ----------------+----------+----------+---------+-------------+----------------------- ... test | postgres | UTF8 | C | de_DE.UTF-8 | ... [root@freebsd12 ~]# pgtop Manueller Aufruf für die DB-Wartung, gelöschte Bereiche wieder frei zugeben. __eine einzelne DB:__ [root@freebsd12 ~]# su - postgres -c "echo 'vacuum verbose' | psql DatenbankName" ... ... ... VACUUM __alle DBs:__ [root@freebsd12 ~]# su - postgres -c "vacuumdb -aefz" SELECT pg_catalog.set_config('search_path', '', false) SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1; SELECT pg_catalog.set_config('search_path', '', false) vacuumdb: vacuuming database "postgres" VACUUM (FULL, ANALYZE); SELECT pg_catalog.set_config('search_path', '', false) vacuumdb: vacuuming database "template1" VACUUM (FULL, ANALYZE); ==== PostgreSQL-Datenbank bläht sich auf ==== [[https://medium.com/compass-true-north/dealing-with-significant-postgres-database-bloat-what-are-your-options-a6c1814a03a5|Dealing with significant Postgres database bloat — what are your options?]] Das Aktualisieren eines vorhandenen Datensatzes führt zu einem toten Tupel, der vorherigen Version des Datensatzes sowie einem neuen Datensatz. Wenn die Rate der erstellten toten Tupel die Fähigkeit der Datenbank überschreitet, tote Tupel automatisch zu bereinigen, tritt ein Aufblähen auf. Stellen wir uns ein Szenario vor, in dem eine Anwendung Datensätze mit durchschnittlich 1.000 Datensätzen pro Sekunde aktualisiert oder löscht und der __Autovacuum-Daemon__ tote Tupel mit einer durchschnittlichen Rate von 800 pro Sekunde entfernt. Jede Sekunde treten 200 Tupel Blähungen auf. //Beachten Sie, dass dies ein hypothetisches Szenario ist. Es ist nicht möglich, den Autovakuum-Daemon so einzustellen, dass tote Tupel mit 800/s entfernt werden.// __Autovacuum-Daemon__ aktivieren: > vi /etc/postgresql/10/main/postgresql.conf > cp /usr/local/share/postgresql/postgresql.conf.sample /usr/local/pgsql/data/postgresql.conf > vi /usr/local/pgsql/data/postgresql.conf ... track_counts = on ... autovacuum = on ... ===== erste Schritte in PostgreSQL ===== Übrigens! [[https://chat.openai.com|ChatGPT]] kann einem ruck-zuck die richtigen Befehle nennen und das auch noch wenn man die Frage in umgangssprachlichem Deutsch gestellt hat. ein Backup einer Datenbank anlegen: pg_dump -d filme -f postgres_backup_-_filme.sql einen Benutzer "indy" anlegen: createuser -U postgres --no-superuser --no-createdb --no-createrole indy echo "\du" | psql einem DB-Benutzer Rechte über eine ganze DB erteilen: echo "GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO indy;" | psql -d filme einem DB-Benutzer Rechte über eine Tabelle erteilen: echo "GRANT INSERT, UPDATE, DELETE ON TABLE tabellenname TO indy;" | psql -d filme einen Benutzer löschen: echo "DROP USER indy;" | psql ein Datenbank-Backup in ein leeres DBMS einspielen: echo "CREATE DATABASE filme;" | psql psql -d filme -f postgres_backup_-_filme.sql alle Datenbanken anzeigen: echo "\l" | psql alle Tabellen aus einer Datenbank anzeigen: echo "\dt" | psql database_name Anzeigen der Struktur einer bestimmten Tabelle: echo "\d table_name" | psql database_name eine Tabelle löschen: echo "DROP TABLE table_name;" | psql database_name eine DB löschen: echo "DROP DATABASE database_name;" | psql Indexe anzeigen: \di Fremdschlüssel anzeigen: \dfk VIEWs anzeigen: \dv Funktionen anzeigen: \df psql postgres -l echo "\l" | psql echo "\dt" | psql -U indy -d filme * [[http://www.freebsddiary.org/postgresql.php]] * [[https://www.postgresqltutorial.com/postgresql-update/]] //MySQL:// ''SHOW FULL PROCESSLIST'' SELECT * FROM pg_stat_activity; ==== 1. Benutzer in PostgreSQL anlegen ==== * [[http://www.postgresql.org/docs/9.5/static/sql-grant.html|GRANT]] * [[http://www.postgresql.org/docs/9.5/static/sql-revoke.html|REVOKE]] * [[http://www.postgresql.org/docs/9.5/static/sql-alterdefaultprivileges.html|ALTER DEFAULT PRIVILEGES]] zum PostgreSQL-root-User werden: > su - postgres User anlegen: $ createuser fritz wieder ausloggen und wieder "ich" werden: $ exit User anzeigen: > echo "\dg" | psql postgres Liste der Rollen Rollenname | Attribute | Mitglied von ------------+-----------------------------------------------------------------+-------------- fritz | | {} postgres | Superuser, Rolle erzeugen, DB erzeugen, Replikation, Bypass RLS | {} ==== 2. Benutzer in PostgreSQL anlegen ==== zum PostgreSQL-root-User werden: > su - postgres Syntax anzeigen: $ echo "\h CREATE USER;" | psql postgres Anweisung: CREATE USER Beschreibung: definiert eine neue Datenbankrolle Syntax: CREATE USER Name [ [ WITH ] Option [ ... ] ] wobei Option Folgendes sein kann: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | CREATEUSER | NOCREATEUSER | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMIT Verbindungslimit | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'Passwort' | VALID UNTIL 'Zeit' | IN ROLE Rollenname [, ...] | IN GROUP Rollenname [, ...] | ROLE Rollenname [, ...] | ADMIN Rollenname [, ...] | USER Rollenname [, ...] | SYSID Uid User anlegen: $ echo "CREATE USER fritz;" | psql postgres $ echo "CREATE USER fritz WITH CREATEDB PASSWORD 'geheim';" | psql postgres Passwort ändern: $ echo "ALTER USER fritz WITH PASSWORD 'geheim';" | psql postgres fritz alle Privilegien nehmen: $ echo "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM fritz;" | psql postgres allen Usern alle Privilegien nehmen: $ echo "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC;" | psql postgres User löschen $ echo "DROP USER fritz;" | psql postgres User anlegen: $ echo "CREATE USER fritz WITH CREATEDB;" | psql postgres wieder ausloggen und wieder "ich" werden: $ exit User anzeigen: > echo "\dg" | psql postgres Liste der Rollen Rollenname | Attribute | Mitglied von ------------+-----------------------------------------------------------------+-------------- fritz | DB erzeugen | {} postgres | Superuser, Rolle erzeugen, DB erzeugen, Replikation, Bypass RLS | {} > echo "\du" | psql postgres Liste der Rollen Rollenname | Attribute | Mitglied von ------------+-----------------------------------------------------------------+-------------- fritz | DB erzeugen | {} postgres | Superuser, Rolle erzeugen, DB erzeugen, Replikation, Bypass RLS | {} > echo "ALTER USER fritz RESET tabellen_name;" | psql postgres > echo "GRANT UPDATE ON tabellen_name TO fritz;" | psql postgres > echo "REVOKE ALL PRIVILEGES ON tabellen_name FROM fritz;" | psql postgres > echo "REVOKE ALL PRIVILEGES ON tabellen_name FROM PUBLIC;" | psql postgres > echo "REVOKE ALL PRIVILEGES ON datenbank FROM fritz;" | psql postgres ==== PostgreSQL-Hilfe ==== Datenbanken auflisten: > echo "\l" | psql postgres Liste der Datenbanken Name | Eigentümer | Kodierung | Sortierfolge | Zeichentyp | Zugriffsprivilegien -----------+------------+-----------+--------------+-------------+----------------------- postgres | postgres | UTF8 | C | de_DE.UTF-8 | template0 | postgres | UTF8 | C | de_DE.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | de_DE.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (3 Zeilen) Tabellen auflisten: > echo "\dt" | psql postgres Zugriffsprivilegien für Tabellen, Sichten und Sequenzen auflisten > echo "\dp" | psql postgres alle Konfigurationsparameter anzeigen: > echo "SHOW ALL;" | psql postgres Hilfe: > psql --help > echo "\h" | psql postgres > echo "\?" | psql postgres ... Hilfe \? [commands] Hilfe über Backslash-Befehle anzeigen \? options Hilfe über psql-Kommandozeilenoptionen anzeigen \? variables Hilfe über besondere Variablen anzeigen \h [NAME] Syntaxhilfe über SQL-Anweisung, * für alle Anweisungen ... Verbindungen anzeigen: > echo "\conninfo" | psql postgres Sie sind verbunden mit der Datenbank "postgres" als Benutzer "fritz" via Socket in "/tmp" auf Port "5432". ==== Datenbank in PostgreSQL anlegen ==== Datenbank anlegen: > createdb dbname oder so > echo "CREATE DATABASE dbname OWNER = fritz;" | psql postgres CREATE DATABASE neue DB anzeigen: > echo "\l" | psql postgres Liste der Datenbanken Name | Eigentümer | Kodierung | Sortierfolge | Zeichentyp | Zugriffsprivilegien -----------+------------+-----------+--------------+-------------+--------------------- dbname | fritz | UTF8 | C | de_DE.UTF-8 | postgres | pgsql | UTF8 | C | de_DE.UTF-8 | template0 | pgsql | UTF8 | C | de_DE.UTF-8 | =c/pgsql + | | | | | pgsql=CTc/pgsql template1 | pgsql | UTF8 | C | de_DE.UTF-8 | =c/pgsql + | | | | | pgsql=CTc/pgsql (4 Zeilen) Backup erstellen: > pg_dump dbname > dbname.pgdump Backup zurück spielen: > cat dbname.pgdump | psql dbname ==== Tabelle in PostgreSQL anlegen ==== Tabelle anlegen: > echo "CREATE TABLE film (ID serial, verzeichnis varchar(1000), datei varchar(100), name varchar(100), type varchar(100), jahr integer, laufzeit integer, altersfreigabe integer, genre varchar(100), produzent varchar(100), regie varchar(100), schauspieler varchar(10000), handlung varchar(100000), PRIMARY KEY (ID));" | psql dbname Index (name_idx) in der Tabelle (film) auf eine Spalte (Name) angelegt: > echo "CREATE INDEX name_idx ON film (name);" | psql dbname CREATE INDEX Tabelle löschen: > echo "DROP TABLE film;" | psql dbname DROP TABLE mal reinschauen: > echo "SELECT * FROM film;" | psql filme id | verzeichnis | datei | name | type | jahr | laufzeit | altersfreigabe | genre | produzent | regie | schauspieler | handlung ----+-------------+-------+------+------+------+----------+----------------+-------+-----------+-------+--------------+---------- (0 Zeilen) ==== Datensätze in der Tabelle ==== zwei Datensätze eintragen: INSERT INTO film (verzeichnis, datei, name, type, jahr, laufzeit, altersfreigabe, genre, produzent, regie, schauspieler, handlung) VALUES ('/Filme/','Otto_der_Film.mp4','Otto der Film','Film',1985,5100,0,'Komödie','Horst Wendlandt','Xaver Schwarzenberger, Otto Waalkes','Otto Waalkes',''), ('/Filme/','Grosse_Pointe_Blank.mp4','Ein Mann - ein Mord','Film',1997,6420,16,'Komödie','Susan Arnold, Roger Birnbaum','George Armitage','John Cusack',''); beide Datensätze nacheinander ändern: UPDATE [Tabellenname] SET [Spaltenname1]='Inhalt1', [Spaltenname2] = 'Inhalt2' WHERE [Spaltenname3] = 'Inhalt3'; UPDATE film SET genre='Filmkomödie', handlung = 'Otto wächst im beschaulichen Ostfriesland auf.' WHERE datei = 'Otto_der_Film.mp4'; UPDATE film SET genre='Filmkomödie', handlung = 'Martin Blank ist Profikiller. Nicht immer läuft alles nach Plan, weshalb seine Auftraggeber unzufrieden sind.' WHERE datei = 'Grosse_Pointe_Blank.mp4'; ==== eine Tabelle umbenennen ==== * [[https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-rename-table/|]] ALTER TABLE [alter Tabellenname] RENAME TO [neuer Tabellenname]; ==== eine Spalte zur Tabelle hinzufügen ==== [[https://oracleplsql.info/alter-table-postgresql.html]] ALTER TABLE [Tabellenname] ADD [Spaltenname] [Spaltentyp]; ALTER TABLE order_details ADD sort_datum date; //Es gibt keine Möglichkeit, hier eine Anweisung mit zugeben, um die Spalte an einer bestimmten Stelle einzufügen!// ==== eine neue Tabelle anlegen, die genau die gleichen Spalten hat wie eine bereits vorhandene ==== * [[https://www.postgresql.org/docs/9.1/sql-createtable.html|CREATE TABLE]] CREATE TABLE [neuer Tabellenname] (LIKE [alter Tabellenname]); ==== Volltextsuche (case-insensitive) ==== > echo "SELECT * FROM Tabelle WHERE Spalte ILIKE ('%suchzeichen%');" | psql -U Benutzer -d Datenbank ==== weitere PostgreSQL-Kommandos ==== Verbindungen: echo "\conninfo" | psql postgres User anzeigen: echo "\dg" | psql postgres Zugriffsprivilegien: echo "\dp" | psql dbname Standard-Zugriffsprivilegien: echo "\ddp" | psql dbname Datentypen: echo "\dT" | psql dbname alle Datenbanken anzeigen: echo "\l" | psql postgres alle Relationen (Tabellen+Indizes+...): echo "\d" | psql dbname Tabellen: echo "\dt" | psql dbname Tablespaces: echo "\db" | psql dbname Indizes: echo "\ds" | psql dbname Schemas: echo "\dn" | psql dbname Trigger: echo "\dy" | psql dbname Domänen: echo "\dD" | psql dbname Funktionen: echo "\df" | psql dbname Objektbeschreibungen: echo "\dd" | psql dbname Large Objects: echo "\dl" | psql dbname Operatoren: echo "\do" | psql dbname installierten Erweiterungen: echo "\dx" | psql dbname Aggregatfunktionen: echo "\da" | psql dbname Konversionen: echo "\dc" | psql dbname Textsuchekonfigurationen: echo "\dF" | psql dbname Textsuchewörterbücher: echo "\dFd" | psql dbname Textsucheparser: echo "\dFp" | psql dbname Textsuchevorlagen: echo "\dFt" | psql dbname Liste der prozeduralen Sprachen: echo "\dL" | psql dbname Liste der Operatoren: echo "\do" | psql dbname Liste der Sortierfolgen: echo "\dO" | psql dbname Stringausgabe: echo "\echo" | psql dbname Zeichensatzkodierung: echo "\encoding" | psql dbname Zeldtrennzeichen: echo "\f ' '" | psql dbname Ausgabe direkt in eine Datei: echo "\o '/tmp/datenbankausgabe.txt'" | psql dbname Ausgabe in eine Datei: echo "\w '/tmp/datenbankausgabe.txt'" | psql dbname Ausgabe einem Kommando übergeben: echo "\w '| /bin/systembefehl'" | psql dbname ===== SQL ===== * [[https://www.postgresql.org/docs/8.3/queries-union.html]] ''UNION'' und ''UNION DISTINCT'' entfernen alle doppelten Zeilen, ''UNION ALL'' gibt dagegen auch die doppelten Zeilen aus, um schneller zu sein. (SELECT * FROM tabelle1) UNION (SELECT * FROM tabelle2) ''INTERSECT'' zeigt alle Zeilen, die in beiden Ausgaben vorhanden sind, doppelten Zeilen werden entfernt, ''INTERSECT ALL'' gibt dagegen auch die doppelten Zeilen aus, um schneller zu sein. (SELECT * FROM tabelle1) INTERSECT (SELECT * FROM tabelle2) ''EXCEPT'' gibt alle Zeilen zurück, die im Ergebnis von ''SELECT * FROM tabelle**1**'', aber nicht im Ergebnis von ''SELECT * FROM tabelle**2**'' enthalten sind. (Dies wird manchmal als Unterschied zwischen zwei Abfragen bezeichnet.) Auch hier werden Duplikate entfernt, sofern nicht ''EXCEPT ALL'' verwendet wird. (SELECT * FROM tabelle1) EXCEPT (SELECT * FROM tabelle2) Damit die Gegenüberstellung der beiden Ausgaben funktioniert, müssen beide Ausgaben die gleiche Anzahl an Zeilen haben und vom gleichen Datentyp sein. ==== Mehrfacheinträge in einer Tabelle finden ==== DROP TABLE mehrfach_vorhanden; CREATE TABLE mehrfach_vorhanden ( anzahl INT, zeile VARCHAR(10000) ); DO $$ DECLARE eine_zeile VARCHAR(10000); BEGIN FOR eine_zeile IN SELECT name FROM liste GROUP BY 1 LOOP INSERT INTO mehrfach_vorhanden SELECT COUNT(name), eine_zeile FROM kino WHERE name = eine_zeile; END LOOP; END; $$ LANGUAGE PLPGSQL; DELETE FROM mehrfach_vorhanden WHERE ANZAHL = 1; SELECT anzahl, zeile FROM mehrfach_vorhanden ORDER BY 1 ASC; Am Ende werden in der zweiten Spalte alle mehrfach vorhandenen Einträge (Namen) und in der ersten Spalte die Anzahl dieser Einträge ausgegeben: cat mehrfache.sql | psql -h 192.168.0.100 -p 5432 -U dbnutzer datenbank ==== Summierung von Spesenabrechnungen ==== So können beispielsweise die Gesamtausgaben (Spesen) jeder (mehrfach) eingetragenen Person leicht berechnet werden: echo "SELECT SUM(ausgaben), name FROM spesen GROUP BY 2 ORDER BY 1 ASC;" | psql -h 192.168.0.100 -p 5432 -U buchhaltung db2019 ===== PostgreSQL-Replikation (Cluster) ===== [[https://www.linux-magazin.de/ausgaben/2017/04/postgresql/|PostgreSQL-Replikation: Ein Statusbericht]] - 04/2017 * [[https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling|Replication, Clustering, and Connection Pooling]] * **PgPool:** [[https://wiki.postgresql.org/wiki/Pgpool-II]] * **Citus:** [[https://www.citusdata.com/]] * [[https://www.citusdata.com/blog/2017/05/10/scaling-connections-in-postgres/]] * [[https://hevodata.com/learn/postgresql-cluster/|PostgreSQL Cluster Guide 101: Easy Set-Up and How to Deploy for High Availability]] - //Sharon Rithika • February 25th, 2022// ==== PgPool ==== * [[https://www.pgpool.net/mediawiki/index.php/Main_Page]] * [[https://www.pgpool.net/docs/pgpool-II-3.1/pgpool-de.html]] * [[https://www.pgpool.net/docs/pgpool-II-4.2.12/en/html/]] * [[https://severalnines.com/blog/guide-pgpool-postgresql-part-one]] FreeBSD: > pkg install databases/pgpool-II-42 Debian: > apt install pgpool2