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

88 lines
2.8 KiB
Markdown

Abfrage auf Datenbank Tabelle
```bash
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
```bash
docker ps
```
und dann
```bash
docker exec -it <container_name> psql -U <username> -d <dbname>
```
-> interaktive Session
oder
```bash
docker exec -it <container_name> psql -U <username> -d <dbname> -c "SELECT <fields> FROM <table>;"
```
### Export Ergebnisse
```bash
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
```bash
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:
```bash
psql -h <host> -p <port> -U <username> -d <dbname>
```
Beispiel:
```bash
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:
```bash
# 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:
```bash
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]].