1 | psql | ||
2 | Constraints | ||
3 | DB-Server | ||
4 | Unsortiert | ||
5 | ALTER ... | ||
6 | Introspection | ||
7 | Backup / Restore | ||
8 | Volltextsuche | ||
9 | Permissions | ||
10 | MySQL | ||
11 | Links |
psql -1 -f mycommands.sql
ALTER TABLE mytable ADD UNIQUE(mycolumn);
foo=# ALTER TABLE foo_table ADD UNIQUE (ref_id, col1, col2); HINWEIS: ALTER TABLE / ADD UNIQUE erstellt implizit einen Index »foo_table_ref_id_key« für Tabelle »foo_table« FEHLER: konnte Unique Index nicht erstellen DETAIL: Tabelle enthält duplizierte Werte.Aber welche Werte sind doppelt?
SELECT ref_id, col1, col2, COUNT(*) FROM foo_table GROUP BY ref_id, col1, col2 HAVING COUNT(*)>1;
# Datei postgresql.conf: lc_messages = 'C'
postgres@host:~> pg_controldata data/
pg_control-Versionsnummer: 822 Katalog-Versionsnummer: 200611241 Datenbanksystemidentifikation: 5167133601488526335 Datenbank-Cluster-Status: im Produktionsmodus pg_control zuletzt geändert: Mi 26 Mär 2008 08:41:44 CET Aktuelle Logdatei-ID: 1 Nächstes Logdatei-Segment: 119 Letzter Checkpoint-Ort: 1/760CB188 Voriger Checkpoint-Ort: 1/760CB138 REDO-Ort des letzten Checkpoints: 1/760CB188 UNDO-Ort des letzten Checkpoints: 0/0 TimeLineID des letzten Checkpoints: 1 NextXID des letzten Checkpoints: 0/341639 NextOID des letzten Checkpoints: 225928 NextMultiXactId des letzten Checkpoints: 1 NextMultiOffset des letzten Checkpoints: 0 Zeit des letzten Checkpoints: Di 25 Mär 2008 16:55:05 CET Minimaler Wiederherstellungsendpunkt: 0/0 Maximale Datenausrichtung (Alignment): 8 Datenbank-Blockgröße: 8192 Blöcke pro Segment: 131072 WAL-Blockgröße: 8192 Bytes pro WAL-Segment: 16777216 Höchstlänge von Namen: 64 Maximale Spalten in einem Index: 32 Speicherung von Datum/Zeit-Typen: 64-Bit Ganzzahlen Maximallänge eines Locale-Namens: 128 LC_COLLATE: de_DE@euro LC_CTYPE: de_DE@euro
log_destination = 'syslog' # anstatt 'stderr' silent_mode = off
postgres@host> /usr/bin/postgres --single -D ~/data
SELECT pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_activity(s.backendid) AS current_query FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;Siehe Postgres Doku Monitoring
user@host> psql -t -c "SELECT 'DROP TABLE ' || tablename || ' CASCADE ;' FROM pg_catalog.pg_tables where tablename like 'xyz_%'" > droptables user@host> less droptables # Vertrauen ist gut, Kontrolle ist besser user@host> psql -f droptables
Leerzeichen am Anfang und am Ende entfernen: UPDATE foo_table SET name=regexp_replace(name, E'^ *(.*?) *$', E'\\1');
ALTER TABLE mytable ALTER COLUMN "name" TYPE VARCHAR(100);
BEGIN; ALTER TABLE ... ROLLBACK;
Mit der Option -E (--echo-hidden) werden die Befehle angezeigt, die psql an den Server schickt, wenn Backslash-Befehle ausgeführt werden. So erfährt man mit welchen internen Tabellen Postgres arbeitet.
### Bsp: \d --> Zeige Infos zur Tabelle 'relayrace_raceteam' traverse=> \d relayrace_raceteam ******** ANFRAGE ********* SELECT c.oid, n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ~ '^(relayrace_raceteam)$' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 2, 3; ************************** ...
psql -tA -c "SELECT tablename FROM pg_catalog.pg_tables WHERE tablename ILIKE 'myname%'" -t: tuples only: Nur die Ergebniszeilen ausgeben, nicht die Spaltennamen. -A: no align: Keine Einrückung, keine führenden Leerzeichen.
Das Postgres-Format ist einiges flexibler als die anderen Formate. Es gibt eigentlich keinen Grund diese Angabe nicht immer zu verwenden.
Mit der Option -0 (--no-owner) werden bei einem Restore die ALTER TABLE ... ALTER OWNER Ausgaben nicht ausgeführt. Bei meinen Anwendungen gehört dem Datenbankbesitzer auch alle Tabellen und Views. Wenn man zB aus der DB db_produktiv die Daten nach db_test kopieren möchte, sollen die Daten im Testsystem nicht dem DB-Nutzer des Produktivsystem gehören. Ähnlich ist auch die Option -x (--no-privileges).
Das Einspielen des Datenbank Dumps wird in einer Transaktion ausgeführt. Falls ein Fehler auftritt werden alle Änderungen zurückgenommen.
pg_restore -l db.dump > db.list vi db.list pg_restore -L db.list db.dump(Siehe auch "man pg_restore" ganz unten)
# Hintergrund: Es wird empfohlen das Programm pg_dumpall von dem neueren System zu nehmen. # Wenn man die Daten von old-server zu new-server kopieren will, und der Server aber # nur per Unix-Domain-Socket erreichbar ist, kann man sich zB mit dem Kommando "socat" helfen, # um den Unix-Domain-Socket per TCP verfügbar zu machen. Es wird in diesem Beispiel direkt # über das Netzwerk kopiert (ohne dump-Datei). postgres@old-server:~> socat TCP-LISTEN:15432,reuseaddr,fork UNIX-CLIENT:/tmp/.s.PGSQL.5432 postgres@new-server:~> pg_dumpall -h old-server -p 15432 | psql template1 Achtung: Der TCP Socket auf Port 15432 lässt in dieser Zeit den passwortfreien Zugang zu der alten Datenbank zu (falls ident-auth verwendet wird).
FEHLER: could not find tsearch config by locale
-- lc_collate steht ggf. auf de_DE@euro. Diesen Wert als Default eintragen. UPDATE pg_ts_cfg SET locale=current_setting('lc_collate') WHERE ts_name='default';
\du | Liste aller Rollen. |
---|---|
\dp | Zeige die Zugriffsrechte der aktuellen Datenbank |
PostgreSQL | MySQL | |
---|---|---|
Welche Datenbanken gibt es? | shell> psql -l | mysql> show databases |
Welche Tabellen gibt es? | psql> \d TABTAB | mysql> show tables |
Wie ist die Tabelle aufgebaut? | psql> \d mytable | mysql> describe mytable |