PostgreSQL: comment sauvegarder un seul schéma à partir d'une base de données et le restaurer sur un autre serveur

22

J'ai une base de données nommée "A" qui a deux schémas "B" et "C". Je veux sauvegarder et restaurer le schéma "B" sur un autre serveur? Je ne sais pas comment faire cela, car je suis nouveau à Postgres. Dois-je créer une nouvelle base de données sur un nouveau serveur portant le nom "A", puis restaurer le schéma "B" dessus. pls aider avec les commandes.

--- informations tirées du commentaire sur la réponse de Peter:

Je souhaite sauvegarder et restaurer les données du schéma "B" +. Deuxièmement, j'ai oublié de mentionner que Postgresql 9.1 fonctionnant sur Ubuntu 12.04

user30422
la source

Réponses:

16

Vous pouvez sélectionner les schémas à vider avec l' -noption de pg_dump. Créez un vidage du schéma B:

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

Restaurez le fichier de vidage:

pg_restore -d somedb dump.dmp

La base de données cible ne doit pas nécessairement avoir le même nom que la base d'origine.

Notez que vous aurez des problèmes si le schéma B a des dépendances sur le schéma C. Vous ne pourrez alors pas le restaurer séparément.

Peter Eisentraut
la source
Notez également que lors du vidage d'un schéma, vous ne viderez pas les blobs (type LOB). Utilisez l' -boption pour vider les blobs. Notez que -btous les blobs sont ajoutés non seulement pour un seul schéma.
Nux
7

Vous pouvez ajouter un paramètre -n [schema name] Le commentaire de ce paramètre est dit:

-n schema
--schema=schema

Vider uniquement les schémas correspondant au schéma; cela sélectionne à la fois le schéma lui-même et tous ses objets contenus. Lorsque cette option n'est pas spécifiée, tous les schémas non système de la base de données cible seront vidés.

yosaku01
la source
1
N'est-ce pas ce que Peter Eisentraut a fait dans sa réponse?
dezso
3
  • Vous pouvez utiliser l'outil pg_dump (voir doc pg_dump ) et pg_restore ( doc pg_restore )
  • Vous n'avez pas besoin de créer un nouveau nom de base de données "A" sur le nouveau serveur.

* Exemple de base:

Je crée des fichiers "dump.bat" et "restore.bat" dans la fenêtre pour vider / restaurer

1 / Sauvegarde:

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

Résultats:

-- 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)
); ....

* Remarque: quelques options 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 / Restaurer: "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 réalité, si votre fichier de format est * .sql, vous pouvez utiliser pgAdmin (ou psql) pour restaurer. Vous devez utiliser pg_restore pour restaurer un fichier .tar ( .bakup ...)

Luan Huynh
la source
1
en réponse à votre commentaire: lorsque vous n'utilisez pas --schema-only, les données doivent être dans le vidage ou vous ne pouvez pas avoir le privilège de sélectionner le contenu de la table.
maletin
0

J'ai écrit un script qui rend cela trivial. Exportation facile des fonctions SQL et des schémas de table dans des *.sqlfichiers individuels . Facilite la gestion, la sauvegarde et le contrôle des sources:

#!/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
la source
-3

Cela peut être utilisé pour effectuer une sauvegarde de schéma

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

Cela peut être utilisé pour restaurer la base de données

psql -d DBName -h HostName -U UserName <  "file.sql"
VNP
la source
5
Cela ne répond pas à la question. La question concerne la sauvegarde d'un seul schéma dans une base de données avec plusieurs schémas, pas la base de données entière.
Mark Sinkinson