PostgreSQL: Как сделать резервную копию только одной схемы из базы данных и восстановить ее на другом сервере

22

У меня есть база данных с именем "A", которая имеет две схемы "B" и "C". Я хочу сделать резервную копию и восстановить схему "B" на другом сервере? не уверен, как это сделать, так как я новичок в Postgres. Нужно ли создавать новую БД на новом сервере с именем «А», а затем восстанавливать схему «Б» на нем. Пожалуйста, помогите с командами.

--- информация из комментария к ответу Петра:

Я хочу сделать резервную копию и восстановить схему "B" + данные. Во-вторых, я забыл упомянуть, что Postgresql 9.1 работает на Ubuntu 12.04

user30422
источник

Ответы:

16

Вы можете выбрать, какие схемы выгружать с -nопцией pg_dump. Создайте дамп схемы B:

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

Восстановите файл дампа:

pg_restore -d somedb dump.dmp

Целевая база данных не обязательно должна иметь то же имя, что и исходная.

Обратите внимание, что у вас будут проблемы, если схема B будет зависеть от схемы C. Тогда вы не сможете восстановить ее отдельно.

Питер Айзентраут
источник
Также обратите внимание, что при выводе одной схемы вы не будете создавать дампы (тип LOB). Используйте -bопцию для сброса с каплями. Обратите внимание, что со -bвсеми каплями добавляются не только для одной схемы.
Nux
7

Вы можете добавить параметр -n [schema name] Комментарий этого параметра:

-n schema
--schema=schema

Дамп только схемы, соответствующие схеме; это выбирает как саму схему, так и все содержащиеся в ней объекты. Если эта опция не указана, все несистемные схемы в целевой базе данных будут выгружены.

yosaku01
источник
1
Разве это не то, что сделал Питер Эйзентраут в своем ответе?
Дезсо
3
  • Вы можете использовать инструмент pg_dump (см. Документ pg_dump ) и pg_restore ( документ pg_restore )
  • Вам не нужно создавать новую базу данных с именем «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"

Это можно использовать для восстановления БД

psql -d DBName -h HostName -U UserName <  "file.sql"
VNP
источник
5
Это не отвечает на вопрос. Речь идет о резервном копировании только одной схемы в базе данных с несколькими схемами, а не всей базы данных.
Марк Синкинсон