88 lines
2.8 KiB
Markdown
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]].
|