PostgreSQL: Cách chỉ sao lưu One Schema từ cơ sở dữ liệu và khôi phục nó trên máy chủ khác


22

Tôi có một cơ sở dữ liệu tên là "A" có hai lược đồ "B" và "C". Tôi muốn sao lưu và khôi phục Schema "B" trên một máy chủ khác? không chắc chắn làm thế nào để làm điều này vì tôi mới biết về Postgres. Tôi có phải tạo DB mới trên sever mới như tên "A" và sau đó khôi phục Schema "B" trên đó không. Xin hãy giúp đỡ với các lệnh.

--- thông tin từ nhận xét về câu trả lời của Peter:

Tôi muốn sao lưu và khôi phục dữ liệu Lược đồ "B" +. Thứ hai, tôi đã quên đề cập rằng Postgresql 9.1 chạy trên Ubuntu 12.04

Câu trả lời:


16

Bạn có thể chọn các lược đồ để kết xuất với -ntùy chọn pg_dump. Tạo một bãi chứa lược đồ B:

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

Khôi phục tệp kết xuất:

pg_restore -d somedb dump.dmp

Cơ sở dữ liệu đích không phải có cùng tên với cơ sở dữ liệu gốc.

Lưu ý rằng bạn sẽ gặp vấn đề nếu lược đồ B có phụ thuộc vào lược đồ C. Sau đó, bạn sẽ không thể khôi phục nó một cách riêng biệt.


Cũng lưu ý rằng khi kết xuất một lược đồ, bạn sẽ không kết xuất các đốm màu (loại LOB). Sử dụng -btùy chọn để đổ với các đốm màu. Lưu ý rằng với -btất cả các đốm màu được thêm vào không chỉ cho một lược đồ.
Nux

7

Bạn có thể thêm tham số -n [schema name] Nhận xét của tham số này được cho biết:

-n schema
--schema=schema

Dump chỉ lược đồ phù hợp với lược đồ; cái này chọn cả lược đồ và tất cả các đối tượng chứa nó. Khi tùy chọn này không được chỉ định, tất cả các lược đồ phi hệ thống trong cơ sở dữ liệu đích sẽ bị loại bỏ.


1
Đây không phải là những gì Peter Eisentraut đã làm trong câu trả lời của mình sao?
dezso 17/2/2016

3
  • Bạn có thể sử dụng công cụ pg_dump (xem tài liệu pg_dump ) và pg_restore ( pg_restore doc )
  • Bạn không cần tạo tên cơ sở dữ liệu mới "A" trên máy chủ mới.

* Ví dụ cơ bản:

Tôi tạo các tệp "dump.bat" & "restore.bat" trong cửa sổ để kết xuất / khôi phục

1 / Sao lưu:

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

Các kết quả:

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

* Lưu ý: một số tùy chọn quan trọng:

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

2 / Khôi phục: "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" (**)

(**) Trong thực tế, nếu tệp định dạng của bạn là * .sql, bạn có thể sử dụng pgAdmin (hoặc psql) để khôi phục. Bạn nên sử dụng pg_restore để khôi phục tệp .tar ( .bakup ...)


1
để đáp lại nhận xét của bạn: khi bạn không sử dụng --schema-only, dữ liệu phải nằm trong kết xuất hoặc bạn có thể không có quyền riêng tư để chọn nội dung bảng.
maletin

0

Tôi đã viết một kịch bản làm cho tầm thường này. Dễ dàng xuất các hàm SQL và lược đồ bảng thành các *.sqltệp riêng lẻ . Giúp dễ dàng quản lý, sao lưu và kiểm soát nguồn:

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

Điều này có thể được sử dụng để sao lưu lược đồ

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

Điều này có thể được sử dụng để khôi phục DB

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

5
Điều này không trả lời câu hỏi. Câu hỏi là về việc chỉ sao lưu một lược đồ trong cơ sở dữ liệu có nhiều lược đồ chứ không phải toàn bộ cơ sở dữ liệu.
Mark Sinkinson 4/2/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.