PostgreSQL: cómo hacer una copia de seguridad de un solo esquema de una base de datos y restaurarlo en otro servidor

22

Tengo una base de datos llamada "A" que tiene dos esquemas "B" y "C". ¿Quiero hacer una copia de seguridad y restaurar el esquema "B" en un servidor diferente? No estoy seguro de cómo hacer esto, ya que soy nuevo en Postgres. ¿Tengo que crear una nueva base de datos en un nuevo servidor con el nombre "A" y luego restaurar el esquema "B" en ella. pls ayuda con los comandos.

--- información del comentario sobre la respuesta de Peter:

Quiero hacer una copia de seguridad y restaurar el esquema "B" + datos. En segundo lugar, olvidé mencionar que Postgresql 9.1 se ejecuta en Ubuntu 12.04

usuario30422
fuente

Respuestas:

16

Puede seleccionar qué esquemas volcar con la -nopción de pg_dump. Cree un volcado del esquema B:

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

Restaurar el archivo de volcado:

pg_restore -d somedb dump.dmp

La base de datos de destino no tiene que tener el mismo nombre que la original.

Tenga en cuenta que tendrá problemas si el esquema B tiene dependencias del esquema C. Entonces no podrá restaurarlo por separado.

Peter Eisentraut
fuente
También tenga en cuenta que al volcar un esquema no volcará blobs (tipo LOB). Use la -bopción para volcar con blobs. Tenga en cuenta que con -btodos los blobs se agregan no solo para un solo esquema.
Nux
7

Puede agregar el parámetro -n [schema name] El comentario de este parámetro se dice:

-n schema
--schema=schema

Volcar solo esquemas que coincidan con el esquema; esto selecciona tanto el esquema en sí como todos sus objetos contenidos. Cuando no se especifica esta opción, se volcarán todos los esquemas que no sean del sistema en la base de datos de destino.

yosaku01
fuente
1
¿No es esto lo que hizo Peter Eisentraut en su respuesta?
dezso
3
  • Puede usar la herramienta pg_dump (ver pg_dump doc ) y pg_restore ( pg_restore doc )
  • No necesita crear un nuevo nombre de base de datos "A" en el nuevo servidor.

* Ejemplo básico:

Creo archivos "dump.bat" y "restore.bat" en la ventana para volcar / restaurar

1 / Copia de seguridad:

"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" 

Resultados:

-- 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: algunas opciones importantes:

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

2 / Restaurar: "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"(**)

(**) En realidad, si su archivo de formato es * .sql, puede usar pgAdmin (o psql) para restaurar. Debe usar pg_restore para restaurar un archivo .tar ( .bakup ...)

Luan Huynh
fuente
1
en respuesta a su comentario: cuando no usa --schema-only, los datos deben estar en el volcado o es posible que no tenga el privilegio de seleccionar el contenido de la tabla.
maletin
0

Escribí un guión que hace que esto sea trivial. Exportación fácil de funciones SQL y esquemas de tablas en *.sqlarchivos individuales . Facilita la administración, la copia de seguridad y el control de origen:

#!/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

Dan
fuente
-3

Esto se puede usar para tomar una copia de seguridad del esquema

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

Esto se puede usar para restaurar la base de datos

psql -d DBName -h HostName -U UserName <  "file.sql"
VNP
fuente
55
Esto no responde la pregunta. La pregunta es sobre la copia de seguridad de un solo esquema en una base de datos con múltiples esquemas, no de la base de datos completa.
Mark Sinkinson