PostgreSQL: Cara mencadangkan hanya Satu Skema dari database dan mengembalikannya di server lain


22

Saya memiliki database bernama "A" yang memiliki dua skema "B" dan "C". Saya ingin mencadangkan dan memulihkan Skema "B" di server yang berbeda? tidak yakin bagaimana melakukan ini karena saya baru di Postgres. Apakah saya harus membuat DB baru pada server baru pada nama "A" dan kemudian mengembalikan Skema "B" di atasnya. tolong bantu dengan perintah.

--- informasi dari komentar pada jawaban Peter:

Saya ingin mencadangkan dan memulihkan Skema "B" + data. Kedua saya lupa menyebutkan bahwa Postgresql 9.1 berjalan di Ubuntu 12.04

Jawaban:


16

Anda dapat memilih skema mana yang akan dibuang dengan -nopsi pg_dump. Buat dump skema B:

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

Pulihkan file dump:

pg_restore -d somedb dump.dmp

Basis data target tidak harus memiliki nama yang sama dengan yang asli.

Perhatikan bahwa Anda akan mengalami masalah jika skema B memiliki dependensi pada skema C. Maka Anda tidak akan dapat mengembalikannya secara terpisah.


Juga perhatikan bahwa ketika membuang satu skema Anda tidak akan membuang gumpalan (tipe LOB). Gunakan -bopsi untuk membuang dengan gumpalan. Perhatikan bahwa dengan -bsemua gumpalan ditambahkan bukan hanya untuk skema tunggal.
Nux

7

Anda dapat menambahkan parameter -n [schema name] Komentar parameter ini dikatakan:

-n schema
--schema=schema

Skema pencocokan hanya Dump skema; ini memilih skema itu sendiri, dan semua objek yang terkandung. Ketika opsi ini tidak ditentukan, semua skema non-sistem dalam database target akan dibuang.


1
Bukankah ini yang dilakukan Peter Eisentraut dalam jawabannya?
dezso

3
  • Anda dapat menggunakan alat pg_dump (lihat pg_dump doc ) dan pg_restore ( pg_restore doc )
  • Anda tidak perlu membuat nama database baru "A" di server baru.

* Contoh dasar:

Saya membuat file "dump.bat" & "restore.bat" di jendela untuk dump / restore

1 / Cadangan:

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

Hasil:

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

* Catatan: beberapa opsi penting:

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

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

(**) Pada kenyataannya, jika file format Anda adalah * .sql, Anda dapat menggunakan pgAdmin (atau psql) untuk memulihkan. Anda harus menggunakan pg_restore untuk mengembalikan file .tar ( .bakup ...)


1
sebagai tanggapan atas komentar Anda: ketika Anda tidak menggunakan --schema-only, data harus di dump atau Anda mungkin tidak memiliki hak istimewa untuk memilih isi tabel.
maletin

0

Saya menulis skrip yang membuat ini sepele. Mudah mengekspor fungsi SQL dan skema tabel ke *.sqlfile individual . Memudahkan untuk mengelola, mencadangkan, dan mengontrol sumber:

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

Ini dapat digunakan untuk mengambil cadangan skema

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

Ini dapat digunakan untuk mengembalikan DB

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

5
Ini tidak menjawab pertanyaan. Pertanyaannya adalah tentang membuat cadangan hanya satu skema dalam database dengan banyak skema, bukan seluruh database.
Mark Sinkinson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.