PostgreSQL: come eseguire il backup di un solo schema da un database e ripristinarlo su un altro server


22

Ho un database chiamato "A" che ha due schemi "B" e "C". Voglio fare il backup e ripristinare lo schema "B" su un altro server? non sono sicuro di come farlo poiché sono nuovo in Postgres. Devo creare un nuovo DB su un nuovo server a partire dal nome "A" e quindi ripristinare lo schema "B" su di esso. per favore aiuta con i comandi.

--- informazioni dal commento sulla risposta di Peter:

Voglio fare il backup e ripristinare lo schema "B" + dati. In secondo luogo, ho dimenticato di dire che Postgresql 9.1 funziona su Ubuntu 12.04

Risposte:


16

È possibile selezionare gli schemi da scaricare con l' -nopzione di pg_dump. Creare un dump dello schema B:

pg_dump ...other...options... -Fc -n B >dump.dmp

Ripristina il file di dump:

pg_restore -d somedb dump.dmp

Il database di destinazione non deve avere lo stesso nome di quello originale.

Si noti che si avranno problemi se lo schema B ha dipendenze dallo schema C. Quindi non sarà possibile ripristinarlo separatamente.


Si noti inoltre che durante il dumping di uno schema non si eseguiranno il dump di BLOB (tipo LOB). Utilizzare l' -bopzione per eseguire il dump con BLOB. Si noti che con -btutti i BLOB vengono aggiunti non solo un singolo schema.
Nux,

7

È possibile aggiungere un parametro -n [schema name] Il commento di questo parametro è detto:

-n schema
--schema=schema

Scarica solo schemi corrispondenti allo schema; questo seleziona sia lo schema stesso, sia tutti i suoi oggetti contenuti. Se questa opzione non viene specificata, verranno scaricati tutti gli schemi non di sistema nel database di destinazione.


1
Non è quello che ha fatto Peter Eisentraut nella sua risposta?
dezso,

3
  • È possibile utilizzare lo strumento pg_dump (consultare il documento pg_dump ) e pg_restore ( documento pg_restore )
  • Non è necessario creare il nuovo nome di database "A" sul nuovo server.

* Esempio di base:

Creo i file "dump.bat" e "restore.bat" nella finestra per scaricare / ripristinare

1 / Backup:

"C:\Program Files\PostgreSQL\9.1\bin\pg_dump.exe" --host localhost --port 5432 --username "postgres" --role "postgres" --format plain --encoding UTF8 --schema-only  --file "dump_resul.sql" --schema "name_schema_B" "name_database_A" 

risultati:

-- PostgreSQL database dump

-- Dumped from database version 9.1.4
-- Dumped by pg_dump version 9.1.4

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

CREATE TABLE abtb_temp (
    id bigint NOT NULL,
    app_code character varying(100)
); ....

* Nota: alcune opzioni importanti:

--data-only, --format=format (ex: format=tar -> if you have a big database), --schema-only, --table=table (ex: --table=schema_name.table_name) ...

2 / Ripristino: "C:\Program Files\PostgreSQL\9.1\bin\pg_restore.exe" --host localhost --port 5432 --username "postgres" --dbname "any_database" --no-password --no-owner --no-privileges --schema name_schema_B --verbose "C:\dump_resul.sql"(**)

(**) In realtà, se il file di formato è * .sql, è possibile utilizzare pgAdmin (o psql) per ripristinare. Dovresti usare pg_restore per ripristinare un file .tar ( .bakup ...)


1
in risposta al tuo commento: quando non lo usi --schema-only, i dati devono essere nella discarica o potresti non avere il privilegio di selezionare il contenuto della tabella.
Maletin,

0

Ho scritto una sceneggiatura che lo rende banale. Facile esportazione di funzioni SQL e schemi di tabelle in singoli *.sqlfile. Semplifica la gestione, il backup e il controllo del codice sorgente:

#!/bin/sh

# Export all table schemas and functions into individual *.sql files for easy management and source control.

TEMP_WORK_PATH="/tmp/postgres"
BACKUP_ROOT_PATH="/vagrant/backup" # This is where your *.sql files will be exported at
DATABASE_NAME="myapp_db"
DATABASE_TABLES_PREFIX="myapp_"
POSTGRES_USER="postgres"
POSTGRES_PASSWORD="postgres"


[ -d $TEMP_WORK_PATH ] || mkdir -p $TEMP_WORK_PATH
rm -rf $TEMP_WORK_PATH/*

[ -d $BACKUP_ROOT_PATH ] || mkdir -p $BACKUP_ROOT_PATH
rm -rf $BACKUP_ROOT_PATH/*

mkdir $BACKUP_ROOT_PATH/tables
mkdir $BACKUP_ROOT_PATH/routines

export PGPASSWORD=$POSTGRES_PASSWORD

cd $TEMP_WORK_PATH

# Get all table schemas and write to individual files
echo "Export table schemas..."
for table in $(psql -U $POSTGRES_USER -d $DATABASE_NAME -t -c "Select table_name From information_schema.tables Where table_type='BASE TABLE' and table_name like '$DATABASE_TABLES_PREFIX%'");
do pg_dump -st $table -U $POSTGRES_USER $DATABASE_NAME > $BACKUP_ROOT_PATH/tables/$table.sql;
done;

# Get all functions in db and output to one file
echo "Getting stored functions..."
psql -U $POSTGRES_USER -At $DATABASE_NAME > $TEMP_WORK_PATH/db_functions.sql <<EOF
SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';
EOF

# Split function file into separate files per function
echo "Exporting stored functions..."
csplit -f function -b '%d.sql' db_functions.sql '/FUNCTION/' '{*}'

# Rename the function files to match the function name in the file
# then place the files into the target backup directory
counter=1
while [ -f $TEMP_WORK_PATH/function$counter.sql ]
do
  name=$(head -1 function$counter.sql | awk {'print $5'})
  name=$(echo $name | cut -d "." --f 2 | cut -d "(" --f 1)
  mv function$counter.sql $BACKUP_ROOT_PATH/routines/$name.sql
  counter=$((counter+1))
done

echo "done"

https://gist.github.com/dantheman213/aff70ee42a11f2d1fa46983878cd62e1


-3

Questo può essere usato per eseguire il backup dello schema

pg_dump -U UserName -h HostName -s DBName > "file.sql"

Questo può essere usato per ripristinare il DB

psql -d DBName -h HostName -U UserName <  "file.sql"

5
Questo non risponde alla domanda. La domanda riguarda il backup di un solo schema in un database con più schemi, non dell'intero database.
Mark Sinkinson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.