pg_dumpall -Fc

Ich bevorzuge, Daten mit

 pg_dump -Fc

zu sichern. Dann kann ich mit

pg_restore -l daten.bak > daten.toc

mir das Inhaltsverzeichniss anzeigen lassen.

Warum gibt es diese Möglichkeit nicht für pg_dumpall?

Gibt es ein Script, welches alle DBs mit pg_dump -Fc sichert, und dann zu einem Archiv zusammenfasst?

Keine Ahnung, warum es das nicht für pg_dumpall gibt.
pg_dumpall sichert den kompletten Cluster, soll also auch alles wiederherstellen. Das custom Format generiert ja im Endeffekt auch wieder nur reines SQL. Also ist das praktisch egal.

Meinst Du jetzt das Fc - Format oder das pg_restore -l für den pg_dumpall - Dump?

pg_dumpall macht ein ASCII-Dump, pg_dump -Fc was binäres.


Gibt es ein Script, welches alle DBs mit pg_dump -Fc sichert, und dann zu einem Archiv zusammenfasst?

Der erste Teil der Frage ist trivial selber machbar, psql -l listet alle Datenbanken auf.


Andreas

sudo -u postgres /usr/lib/postgresql/8.3/bin/pg_dump -Fc datenbank >  backup_$(date +%d).bak

Kenn jemand eine Seite, auf dem das Linux-Scripting gut erklärt wird?

Der obere Code müsste ja in einer Art Schleife stehen, bzw. das Ergebniss von pg_dump -l sollte mehrmals verwendet werden.

Google kennt tausende.

Der obere Code müsste ja in einer Art Schleife stehen, bzw. das Ergebniss von pg_dump -l sollte mehrmals verwendet werden.

Als Anregung:

http://erics-notes.blogspot.com/2008_02_01_archive.html

Andreas

Hab was gefunden.

#!/bin/bash
DIR=/backup/psql
[ ! $DIR ] && mkdir -p $DIR || :
LIST=$(psql -l | awk '{ print $1}' | grep -vE '^-|^List|^Name|template[0|1]')
for d in $LIST
do
  pg_dump $d | gzip -c >  $DIR/$d.out.gz
done

Howto Backup PostgreSQL Databases Server With pg_dump command

Uui, meine hundert Einträge sind voll :slight_smile:

Wie autorisiert ihr euch beim pg_dump?

  • pg_hba.conf: local all postgres trust
  • Eine .pgpass Datei?

Was ist sicherer?

Hier ein Teil vom Script:

# setup environment
PG_PORT=5432
[B]PG_HOME=/usr/postgres/8.2  
PG_VAR=/postgres/8.2[/B]
PG_DATA=$PG_VAR/data
 PG_BACKUPS=$PG_VAR/backup
PG_LOGS=$PG_VAR/logs
PG_BIN=$PG_HOME/bin
PG_DUMPALL=$PG_BIN/pg_dumpall
PG_DUMP=$PG_BIN/pg_dump
PG_PSQL=$PG_BIN/psql
PG_VACUUMDB=$PG_BIN/vacuumdb

Wie finde ich den Ordner für “PG_VAR”?

./backup: line 30: /usr/lib/postgresql/8.3/logs/backup_20091214_154754.log: No such file or directory

Dort, wo Du ihn vorher erstellt hast.

Andreas

muss ein bisschen besser lesen.


  1. PG_DATA=$PG_VAR/data
  2. PG_BACKUPS=$PG_VAR/backup
  3. PG_LOGS=$PG_VAR/logs

Diese Ordner muss ja der Nutzer erstellt haben.

Genau.

Andreas

Wenn du das Datenverzeichnis angelegt hast, wirst nur du allein wissen, wo das ist. Das musst du da eintragen.

Überhaupt frage ich mich, wieso das Skript überhaupt das Datenverzeichnis braucht … das ist zum Dumpen nicht notwendig.

Jetzt bekomme ich wieder eine Fehlermeldung.

Von diesem Beispiel: http://erics-notes.blogspot.com/2008_02_01_archive.html

pg_dump: SQL command failed
pg_dump: Error message from server: FEHLER:  ungültiger regulärer Ausdruck: parentheses () not balanced
pg_dump: The command was: SELECT oid FROM pg_catalog.pg_namespace n
WHERE n.nspname ~ '^((5)$'

Hier die Ausgaben im backup-Ordner. Mit dem letzen Schema hat er Probleme.

backup.20091214_185936.datenbank.tar.bz2
backup.20091214_185938.datenbank.information_schema.tar.bz2
backup.20091214_185939.datenbank.pg_catalog.tar.bz2
backup.20091214_185941.datenbank.pg_toast.tar.bz2
backup.20091214_185941.datenbank.pg_toast_temp_1.tar.bz2
backup.20091214_185941.datenbank.public.tar.bz2
backup.20091214_185943.datenbank.[B](5.[/B]tar.bz2

Ich habe das Script jetzt umgeschrieben, es werden nur die public-Schemas der DBs gesichert.

# #!/bin/bash
#
# # setup environment
PG_PORT=5432

PG_HOME=/usr/lib/postgresql/8.3
PG_VAR=/backup

PG_DATA=/backup/data
PG_BACKUPS=/backup/backup
PG_LOGS=/backup/logs

PG_BIN=/usr/lib/postgresql/8.3/bin
PG_DUMPALL=/usr/lib/postgresql/8.3/bin/pg_dumpall
PG_DUMP=/usr/lib/postgresql/8.3/bin/pg_dump
PG_PSQL=/usr/lib/postgresql/8.3/bin/psql
PG_VACUUMDB=/usr/lib/postgresql/8.3/bin/vacuumdb

PG_BACKUP=/backup/backup/17122009_1400
PG_LOG_FILE=/backup/logs/backup_17122009_1400.log

COMPRESS="bzip2 -9"
DUMPALL_ARGS="-p 5432 -c -g -o -U postgres"
DUMP_ARGS="-p 5432 -c -o -F t -U postgres"
VACUUM_ARGS="-z -p 5432 -d -U postgres"
PSQL_ARGS="-p 5432 -U postgres -q -c"

echo "`date`: Script $0 starting" >> backup_17122009_1400.log 2>&1

# Make the backup directory

mkdir -p /backup/backup/17122009_1400 >> backup_17122009_1400.log 2>&1

# Iterate over all databases
databases=`/usr/lib/postgresql/8.3/bin/psql -p 5432 -U postgres -q -c "\l" 2>> /backup/logs/backup_17122009_1400.log | sed -n 4,/\eof/p | grep -v rows\) | awk {'print $1'}`
for database in $databases
do

#   echo "`date`: Vacuuming database '$database'" >> /backup/logs/backup_17122009_1400.log 2>&1
#   /usr/lib/postgresql/8.3/bin/vacuumdb -z -p 5432 -d -U postgres $database  >> /backup/logs/backup_17122009_1400.log 2>&1
#   echo "`date`: Vacuuming of database '$database' complete" >> /backup/logs/backup_17122009_1400.log 2>&1

    PG_DUMP_DB_FILE=/backup/backup/17122009_1400/backup.17122009_1400.$database.tar.bz2
    echo "`date`: Backing up database '$database' to '$PG_DUMP_DB_FILE'" >> /backup/logs/backup_17122009_1400.log 2>&1
    /usr/lib/postgresql/8.3/bin/pg_dump -p 5432 -c -o -F t -U postgres $database 2>> /backup/logs/backup_17122009_1400.log | bzip2 -9 > $PG_DUMP_DB_FILE 2>> /backup/logs/backup_17122009_1400.log
    echo "`date`: Backing up database '$database' to '$PG_DUMP_DB_FILE' complete" >> /backup/logs/backup_17122009_1400.log 2>&1

    # iterate over all schemas in this database
    schemas=`/usr/lib/postgresql/8.3/bin/psql -p 5432 -U postgres -q -c "\dn public" -d $database 2>> /backup/logs/backup_17122009_1400.log | sed -n 4,/\eof/p | grep -v rows\) | awk {'print $1'}`
    for schema in $schemas
    do
        PG_DUMP_SCHM_FILE=/backup/backup/17122009_1400/backup.17122009_1400.$database.$schema.tar.bz2
        echo "`date`: Backing up schema '$schema' of database '$database' to '$PG_DUMP_SCHM_FILE'" >> /backup/logs/backup_17122009_1400.log 2>&1
        /usr/lib/postgresql/8.3/bin/pg_dump -p 5432 -c -o -F t -U postgres -n $schema $database 2>> /backup/logs/backup_17122009_1400.log |  bzip2 -9 > $PG_DUMP_SCHM_FILE 2>> /backup/backup/logs/backup_17122009_1400.log
        echo "`date`: Backing up schema '$schema' of database '$database' to '$PG_DUMP_SCHM_FILE' complete" >> /backup/logs/backup_17122009_1400.log 2>&1
    done
done

Ein Fehler kommt aber immer noch:

Do 17. Dez 15:33:23 CET 2009: Backing up schema '(1' of database 'alktemplate' to '/backup/backup/17122009_1400/backup.17122009_1400.alktemplate.(1.tar.bz2' complete
Do 17. Dez 15:33:23 CET 2009: Backing up database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.tar.bz2'
Do 17. Dez 15:33:25 CET 2009: Backing up database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.tar.bz2' complete
Do 17. Dez 15:33:25 CET 2009: Backing up schema 'public' of database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.public.tar.bz2'
Do 17. Dez 15:33:27 CET 2009: Backing up schema 'public' of database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.public.tar.bz2' complete
Do 17. Dez 15:33:27 CET 2009: Backing up schema '(1' of database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.(1.tar.bz2'
pg_dump: SQL command failed
pg_dump: Error message from server: FEHLER:  ungültiger regulärer Ausdruck: parentheses () not balanced
pg_dump: The command was: SELECT oid FROM pg_catalog.pg_namespace n
WHERE n.nspname ~ '^((1)$'

 

Kennt jemand hier ein Forum, bei dem shell-Probleme gepostet werden können?

Ich habe das Script jetzt umgeschrieben, es werden nur die public-Schemas der DBs gesichert.

# #!/bin/bash
#
# # setup environment
PG_PORT=5432

PG_HOME=/usr/lib/postgresql/8.3
PG_VAR=/backup

PG_DATA=/backup/data
PG_BACKUPS=/backup/backup
PG_LOGS=/backup/logs

PG_BIN=/usr/lib/postgresql/8.3/bin
PG_DUMPALL=/usr/lib/postgresql/8.3/bin/pg_dumpall
PG_DUMP=/usr/lib/postgresql/8.3/bin/pg_dump
PG_PSQL=/usr/lib/postgresql/8.3/bin/psql
PG_VACUUMDB=/usr/lib/postgresql/8.3/bin/vacuumdb

PG_BACKUP=/backup/backup/17122009_1400
PG_LOG_FILE=/backup/logs/backup_17122009_1400.log

COMPRESS="bzip2 -9"
DUMPALL_ARGS="-p 5432 -c -g -o -U postgres"
DUMP_ARGS="-p 5432 -c -o -F t -U postgres"
VACUUM_ARGS="-z -p 5432 -d -U postgres"
PSQL_ARGS="-p 5432 -U postgres -q -c"

echo "`date`: Script $0 starting" >> backup_17122009_1400.log 2>&1

# Make the backup directory

mkdir -p /backup/backup/17122009_1400 >> backup_17122009_1400.log 2>&1

# Iterate over all databases
databases=`/usr/lib/postgresql/8.3/bin/psql -p 5432 -U postgres -q -c "\l" 2>> /backup/logs/backup_17122009_1400.log | sed -n 4,/\eof/p | grep -v rows\) | awk {'print $1'}`
for database in $databases
do

#   echo "`date`: Vacuuming database '$database'" >> /backup/logs/backup_17122009_1400.log 2>&1
#   /usr/lib/postgresql/8.3/bin/vacuumdb -z -p 5432 -d -U postgres $database  >> /backup/logs/backup_17122009_1400.log 2>&1
#   echo "`date`: Vacuuming of database '$database' complete" >> /backup/logs/backup_17122009_1400.log 2>&1

    PG_DUMP_DB_FILE=/backup/backup/17122009_1400/backup.17122009_1400.$database.tar.bz2
    echo "`date`: Backing up database '$database' to '$PG_DUMP_DB_FILE'" >> /backup/logs/backup_17122009_1400.log 2>&1
    /usr/lib/postgresql/8.3/bin/pg_dump -p 5432 -c -o -F t -U postgres $database 2>> /backup/logs/backup_17122009_1400.log | bzip2 -9 > $PG_DUMP_DB_FILE 2>> /backup/logs/backup_17122009_1400.log
    echo "`date`: Backing up database '$database' to '$PG_DUMP_DB_FILE' complete" >> /backup/logs/backup_17122009_1400.log 2>&1

    # iterate over all schemas in this database
    schemas=`/usr/lib/postgresql/8.3/bin/psql -p 5432 -U postgres -q -c "\dn public" -d $database 2>> /backup/logs/backup_17122009_1400.log | sed -n 4,/\eof/p | grep -v rows\) | awk {'print $1'}`
    for schema in $schemas
    do
        PG_DUMP_SCHM_FILE=/backup/backup/17122009_1400/backup.17122009_1400.$database.$schema.tar.bz2
        echo "`date`: Backing up schema '$schema' of database '$database' to '$PG_DUMP_SCHM_FILE'" >> /backup/logs/backup_17122009_1400.log 2>&1
        /usr/lib/postgresql/8.3/bin/pg_dump -p 5432 -c -o -F t -U postgres -n $schema $database 2>> /backup/logs/backup_17122009_1400.log |  bzip2 -9 > $PG_DUMP_SCHM_FILE 2>> /backup/backup/logs/backup_17122009_1400.log
        echo "`date`: Backing up schema '$schema' of database '$database' to '$PG_DUMP_SCHM_FILE' complete" >> /backup/logs/backup_17122009_1400.log 2>&1
    done
done

Ein Fehler kommt aber immer noch:

Do 17. Dez 15:33:23 CET 2009: Backing up schema '(1' of database 'alktemplate' to '/backup/backup/17122009_1400/backup.17122009_1400.alktemplate.(1.tar.bz2' complete
Do 17. Dez 15:33:23 CET 2009: Backing up database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.tar.bz2'
Do 17. Dez 15:33:25 CET 2009: Backing up database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.tar.bz2' complete
Do 17. Dez 15:33:25 CET 2009: Backing up schema 'public' of database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.public.tar.bz2'
Do 17. Dez 15:33:27 CET 2009: Backing up schema 'public' of database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.public.tar.bz2' complete
Do 17. Dez 15:33:27 CET 2009: Backing up schema '(1' of database 'augsburg_doms' to '/backup/backup/17122009_1400/backup.17122009_1400.augsburg_doms.(1.tar.bz2'
pg_dump: SQL command failed
pg_dump: Error message from server: FEHLER:  ungültiger regulärer Ausdruck: parentheses () not balanced
pg_dump: The command was: SELECT oid FROM pg_catalog.pg_namespace n
WHERE n.nspname ~ '^((1)$'

 

Kennt jemand hier ein Forum, bei dem shell-Probleme gepostet werden können?

for db in `$PG_BIN/psql $PG_CON -lt | sed /\eof/p | grep -v rows\) | awk {'print $1'}` 

Was macht awk genau? Wenn ich das Script ohne awk in der Konsole ausgebe erscheint eine Liste mit allen DBs. Mit ist die Ausgabe ein “>” (ohne user#)

awk ist ein äusserst mächtiger Textprozessor, in etwa ähnlich sed. Damit kannst du eine Datei zeilenweise in ihre Bestandteile zerlegen und neu zusammensetzen. Hier gibt er dir allerdings nur das erste Wort einer Zeile, den Namen der Datenbank zurück.
Hast du den Befehl mit copy/paste in der Konsole eingefügt? Wenn ja, dann schreib den awk-Part mal von Hand, bei mir gings dann.

Gruß Uwe

bei mir hat es geklappt. kann ein praktischer Befehl sein.

#!/bin/bash

DIR="/backup"
PG_BIN="/usr/lib/postgresql/8.4/bin/"
PG_USER="postgres"

#[ ! $DIR ] && mkdir -p $DIR || :
LIST=$($PG_BIN/psql -U $PG_USER -l | awk '{ print $1}' | grep -vE '^-|^List|^Name|template[0|1]')
for d in $LIST
do
  $PG_BIN/pg_dump -U $PG_USER  $d | gzip -c >  $DIR/$d.out.gz
done



psql: FATAL:  Datenbank >>postgres<< existiert nicht

Warum benötigt es die DB postgres?

Weil Dein awk-Dingens dies liefert. Bei mir liefert psql -l z.B. u.a.:

 template0                        | postgres   | UTF8      | de_DE.UTF-8  | de_DE.UTF-8 | =c/postgres
                                                                                        : postgres=CTc/postgres
 template1                        | postgres   | UTF8      | de_DE.UTF-8  | de_DE.UTF-8 | =c/postgres
                                                                                        : postgres=CTc/postgres

Dein awk macht daraus:

:
:

Da solltest Du nachbessern …

Davon abgesehen, daß 8.4 eine DB mit diesem Namen normalerweise hat.

Andreas