ich habe ein kleines tcl-Skript geschrieben, welches den Datenbestand einer Produktivumgebung in die Testumgebung kopieren soll. Das ganze sieht so aus:
- Code: Alles auswählen
;proc pg_copy:copy_db {} {
puts ""
puts "---------------------------------------------------------------------"
puts "Action: copy_db invoked by option $::argv"
puts "---------------------------------------------------------------------"
puts ""
puts "NOTICE: See $::PG_COPY(logfile) for further information."
puts ""
puts ""
puts "Source: $::PG_COPY(sourcedb)"
puts "Target: $::PG_COPY(targetdb)"
puts ""
puts "exporting TARGET (backup): $::PG_COPY(targetdb) --> [file join $::env(MEDITEC) install pg_copy_$::PG_COPY(targetdb).sql]"
if {[catch {
eval exec pg_dump -Fp -c -h $::PG_COPY(dbhost) -p $::PG_COPY(dbport) -U $::PG_COPY(dbuser) $::PG_COPY(targetdb) > [file join $::env(MEDITEC) install pg_copy_$::PG_COPY(targetdb).sql]
} err]} {
puts "ERROR: $err"
puts " program abort..."
exit
}
puts ""
puts "exporting SOURCE: $::PG_COPY(sourcedb) --> [file join $::env(MEDITEC) install pg_copy_$::PG_COPY(sourcedb).sql]"
if {[catch {
eval exec pg_dump -Fp -c -h $::PG_COPY(dbhost) -p $::PG_COPY(dbport) -U $::PG_COPY(dbuser) $::PG_COPY(sourcedb) > [file join $::env(MEDITEC) install pg_copy_$::PG_COPY(sourcedb).sql]
} err]} {
puts "ERROR: $err"
puts " program abort..."
exit
}
puts ""
puts "checking existing connections on $::PG_COPY(targetdb)"
if {[catch {
eval exec psql -d postgres -c \"SELECT client_addr, datname, current_query FROM pg_stat_activity WHERE datname = '$::PG_COPY(targetdb)' ORDER BY client_addr\"
} err]} {
puts "ERROR: $err"
puts " program abort..."
exit
}
puts ""
puts "waiting 10sec..."
after 10000
puts ""
puts "importing: $::PG_COPY(targetdb) <-- [file join $::env(MEDITEC) install pg_copy_$::PG_COPY(sourcedb).sql]"
if {[catch {
eval exec psql --host $::PG_COPY(dbhost) --port $::PG_COPY(dbport) --username $::PG_COPY(dbuser) --dbname=$::PG_COPY(targetdb) -L $::PG_COPY(logfile) -f [file join $::env(MEDITEC) install pg_copy_$::PG_COPY(sourcedb).sql]
} err]} {
puts "ERROR: $err"
puts " program abort..."
exit
}
puts ""
puts "deleting files (except the backup-file)"
if {[catch {
file delete [file join $::env(MEDITEC) install pg_copy_$::PG_COPY(sourcedb).sql]
} err]} {
puts "ERROR: $err"
puts " program abort..."
exit
}
puts ""
puts "done..."
}
Im Prinzip geht das auch, wenn ich die Schritte einzeln laufen lassen. Lasse ich das ganze Skript laufen, erhalte ich folgenden Fehler:
- Code: Alles auswählen
psql:/meditec/install/pg_copy_mediprod.sql:4407: ERROR: cannot drop schema public because other objects depend on it
TIP: Use DROP ... CASCADE to drop the dependent objects too.
psql:/meditec/install/pg_copy_mediprod.sql:4419: ERROR: schema "public" already exists
Vielen Dank! murphy
