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 , sonst hängt sich BASH auf-it
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
-Aflag (unaligned output),-F,(field separator comma), and--csvtogether 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.