PostgreSQL : 데이터베이스에서 하나의 스키마 만 백업하고 다른 서버에 복원하는 방법


22

두 개의 스키마 "B"와 "C"가있는 "A"라는 데이터베이스가 있습니다. 다른 서버에서 스키마 "B"를 백업하고 복원하고 싶습니까? Postgres를 처음 접했을 때 어떻게 해야할지 모르겠습니다. 이름이 "A"인 새 서버에서 새 DB를 작성한 다음 스키마 "B"를 복원해야합니까? pls는 명령을 도와줍니다.

--- 베드로의 답변에 대한 의견 정보 :

Schema "B"+ 데이터를 백업 및 복원하고 싶습니다. 두 번째로 Postgresql 9.1이 Ubuntu 12.04에서 실행되고 있음을 언급하지 않았습니다.

답변:


16

-npg_dump 옵션으로 덤프 할 스키마를 선택할 수 있습니다 . 스키마 B의 덤프를 작성하십시오.

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

덤프 파일을 복원하십시오.

pg_restore -d somedb dump.dmp

대상 데이터베이스는 원래 데이터베이스와 이름이 같을 필요는 없습니다.

스키마 B에 스키마 C에 종속 된 경우 문제가 발생합니다. 그러면 스키마를 별도로 복원 할 수 없습니다.


또한 하나의 스키마를 덤프 할 때 BLOB (LOB 유형)을 덤프하지 않습니다. -b얼룩으로 덤프 하려면 옵션을 사용하십시오 . 와 주 -b그러하지 하나의 스키마뿐 아니라 추가됩니다.
Nux

7

매개 변수를 추가 할 수 있습니다.이 매개 변수 -n [schema name] 의 설명은 다음과 같습니다.

-n schema
--schema=schema

스키마와 일치하는 스키마 만 덤프하십시오. 스키마 자체와 포함 된 모든 개체를 모두 선택합니다. 이 옵션을 지정하지 않으면 대상 데이터베이스의 모든 비 시스템 스키마가 덤프됩니다.


1
Peter Eisentraut가 그의 답변에서 한 일이 아닙니까?
dezso

3
  • pg_dump 도구 ( pg_dump doc 참조 ) 및 pg_restore ( pg_restore doc )를 사용할 수 있습니다
  • 새 서버에서 새 데이터베이스 이름 "A"를 만들 필요는 없습니다.

* 기본 예 :

덤프 / 복원 할 창에 "dump.bat"및 "restore.bat"파일을 만듭니다.

1 / 백업 :

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

결과 :

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

* 참고 : 몇 가지 중요한 옵션 :

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

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

(**) 실제로 포맷 파일이 * .sql 인 경우 pgAdmin (또는 psql)을 사용하여 복원 할 수 있습니다. pg_restore를 사용하여 파일 .tar ( .bakup ...) 를 복원해야합니다.


1
귀하의 의견에 대한 답변으로 :를 사용하지 않으면 --schema-only데이터가 덤프에 있어야하거나 테이블 내용을 선택할 권한이 없을 수 있습니다.
maletin

0

나는 이것을 사소한 것으로 만드는 대본을 썼다. SQL 함수 및 테이블 스키마를 개별 *.sql파일 로 쉽게 내보내기 관리, 백업 및 소스 제어가 쉬워집니다.

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

스키마 백업을 수행하는 데 사용할 수 있습니다

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

이것은 DB를 복원하는 데 사용할 수 있습니다

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

5
이것은 질문에 대답하지 않습니다. 문제는 전체 데이터베이스가 아닌 여러 스키마가있는 데이터베이스에서 하나의 스키마 만 백업하는 것입니다.
Mark Sinkinson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.