Files
it-know-how/Linux/psql.md
T
2026-09-28 17:37:46 +02:00

2.8 KiB

Abfrage auf Datenbank Tabelle

psql -U <username> -d <dbname> -c "SELECT * FROM information_schema.tables;"

.. fragt zB alle Tabellen in DB aus Systemtabelle ab

Abfrage in Docker Container

Finde zuerst Namen des Containers heraus mit

docker ps

und dann

docker exec -it <container_name> psql -U <username> -d <dbname>

-> interaktive Session oder

docker exec -it <container_name> psql -U <username> -d <dbname> -c "SELECT <fields> FROM <table>;"

Export Ergebnisse

docker exec -i <container_name> psql -U <username> -d <dbname> -c "SELECT <fields> FROM <table>;" > path/tp/file.txt

==WICHTIG==: Option -i, NICHT -it, sonst hängt sich BASH auf

Export Ergebnisse als CSV

docker exec -i <container_name> psql -U <username> -d <dbname> -A -F, --csv -c "SELECT <fields> FROM <table>;" > path/tp/file.csv

Erklärung:

The -A flag (unaligned output), -F, (field separator comma), and --csv together produce CSV

Verbindung zu einem bestimmten Host und Port

Für eine Verbindung zu einem PostgreSQL-Server auf einem bestimmten Host und Port werden -h und -p verwendet:

psql -h <host> -p <port> -U <username> -d <dbname>

Beispiel:

psql -h 127.0.0.1 -p 15432 -U <username> -d <dbname>

Das ist beispielsweise der lokale Endpunkt eines SSH-Tunnels. Bei einem Docker-Setup kann der Host dagegen eine Container-IP, ein Docker-Service-Name oder die Loopback-Adresse der VM sein. Entscheidend ist, von wo aus die Verbindung hergestellt wird.

PostgreSQL-Verbindung diagnostizieren

Eine schrittweise Prüfung hilft dabei, Netzwerk-, Tunnel- und Authentifizierungsprobleme voneinander zu unterscheiden:

# Ist der TCP-Port erreichbar?
nc -vz <host> <port>

# Lauscht auf der VM ein Prozess auf dem PostgreSQL-Port?
sudo ss -ltnp | grep 5432

# Funktioniert die PostgreSQL-Verbindung mit denselben Parametern?
psql -h <host> -p 5432 -U <username> -d <dbname>

Wenn psql direkt auf der VM funktioniert, ist damit nur bewiesen, dass die VM diesen Endpunkt erreichen kann. Es ist noch nicht bewiesen, dass ein externer Client denselben Weg über den SSH-Tunnel verwendet. Zu prüfen sind deshalb zusätzlich der lokale Tunnel-Port, der entfernte Zielhost, der entfernte Zielport und die SSL-Einstellung des Clients.

Für eine Docker-Datenbank sind außerdem hilfreich:

docker ps
docker inspect <postgres-container>
docker logs --tail 100 <postgres-container>

Eine Container-IP kann sich ändern, wenn der Container neu erstellt wird. Für dauerhafte Konfigurationen sind veröffentlichte Host-Ports oder Docker- Service-Namen meist besser geeignet als eine fest eingetragene Container-IP.

Siehe auch SSH Verbindung in Linux, Docker und DBeaver PostgreSQL via SSH-Tunnel.