PostgreSQL: Veritabanından sadece bir Şema nasıl yedeklenir ve başka bir sunucuya nasıl geri yüklenir


22

İki şeması "B" ve "C" olan "A" adlı bir veritabanım var. Şema "B" yi farklı bir sunucuda yedeklemek ve geri yüklemek istiyorum? Postgres'te yeni olduğum için bunun nasıl yapıldığından emin değilim. "A" adıyla yeni sunucuda yeni bir DB oluşturmanız ve ardından Şema "B" yi geri yüklemem gerekir mi? pls komutları ile yardım.

--- Peter'ın cevabına ilişkin yorumdan bilgi:

Şema "B" + verilerini yedeklemek ve geri yüklemek istiyorum. İkincisi, Ubuntu 12.04'te çalışan Postgresql 9.1’den bahsetmeyi unuttum.

Yanıtlar:


16

-nPg_dump seçeneğiyle hangi şemaların döküleceğini seçebilirsiniz . B şeması dökümü oluşturun:

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

Dökümü dosyasını geri yükleyin:

pg_restore -d somedb dump.dmp

Hedef veritabanı, asıl ile aynı ada sahip olmak zorunda değildir.

Şema B'nin şema C'ye bağımlı olması durumunda sorun yaşayacağınıza dikkat edin. O zaman ayrı olarak geri yükleyemezsiniz.


Ayrıca, bir şema dump yaparken blobları atmayacağınızı unutmayın (LOB tipi). -bBLOB'larla çıkmak için seçeneği kullanın . İle Not -btüm lekeler tek şema için sadece eklenir.
Nux

7

Parametre ekleyebilirsiniz -n [schema name] Bu parametrenin yorumu şöyledir:

-n schema
--schema=schema

Yalnızca şemaları eşleşen şema dökümü; bu hem şemanın kendisini hem de içerdiği tüm nesneleri seçer. Bu seçenek belirtilmediğinde, hedef veritabanındaki tüm sistem dışı şemalar çöpe atılır.


1
Peter Eisentraut'un cevabında yaptığı şey bu değil miydi?
dezso

3
  • Pg_dump aracını (bkz. Pg_dump doc ) ve pg_restore ( pg_restore doc ) kullanabilirsiniz
  • Yeni sunucuda "A" yeni veritabanı adı oluşturmanıza gerek yoktur.

* Temel örnek:

Dump / restore penceresinde "dump.bat" ve "restore.bat" dosyalarını oluşturuyorum

1 / Yedekleme:

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

Sonuçlar:

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

* Not: Bazı önemli seçenekler:

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

2 / Geri Yükle: "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"(**)

(**) Gerçekte, biçim dosyanız * .sql ise, geri yüklemek için pgAdmin (veya psql) kullanabilirsiniz. Bir dosyayı geri yüklemek için pg_restore kullanmalısınız .tar ( .bakup ...)


1
Yorumunuza cevaben: kullanmadığınızda --schema-only, verilerin dökümde olması gerekir ya da tablo içeriğini seçme ayrıcalığına sahip olmayabilir.
maletin

0

Bunu önemsiz yapan bir senaryo yazdım. SQL fonksiyonlarının ve tablo şemalarının bireysel olarak kolayca dışa aktarılması*.sql dosyalara . Yönetmeyi, yedeklemeyi ve kaynak kontrolünü kolaylaştırır:

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

Bu şema yedeğini almak için kullanılabilir

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

Bu, DB'yi geri yüklemek için kullanılabilir

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

5
Bu soruya cevap vermiyor. Soru, veritabanının tamamında değil, birden fazla şema içeren bir veritabanında sadece bir şema yedeklemeyle ilgilidir.
Mark Sinkinson,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.