PostgreSQL: วิธีการสำรองข้อมูลเพียงหนึ่ง Schema จากฐานข้อมูลและเรียกคืนบนเซิร์ฟเวอร์อื่น


22

ฉันมีฐานข้อมูลชื่อ "A" ซึ่งมีสองสกีมา "B" และ "C" ต้องการสำรองและกู้คืน Schema "B" บนเซิร์ฟเวอร์อื่นหรือไม่ ไม่แน่ใจว่าจะทำอย่างไรเมื่อฉันยังใหม่กับ Postgres ฉันต้องสร้าง DB ใหม่ในเซิร์ฟเวอร์ใหม่เป็นชื่อ "A" แล้วเรียกคืน Schema "B" ในนั้น กรุณาช่วยด้วยคำสั่ง

--- ข้อมูลจากความคิดเห็นต่อคำตอบของปีเตอร์:

ฉันต้องการสำรองและกู้คืนข้อมูล Schema "B" + ประการที่สองฉันลืมที่จะพูดถึงว่า Postgresql 9.1 ทำงานบน Ubuntu 12.04

คำตอบ:


16

คุณสามารถเลือกสกีมาที่จะถ่ายโอนข้อมูลด้วย-nตัวเลือกของ pg_dump สร้างดัมพ์ของสกีมา B:

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

กู้คืนไฟล์ดัมพ์:

pg_restore -d somedb dump.dmp

ฐานข้อมูลเป้าหมายไม่จำเป็นต้องมีชื่อเหมือนกับชื่อเดิม

โปรดทราบว่าคุณจะมีปัญหาหาก schema B มีการพึ่งพา schema C จากนั้นคุณจะไม่สามารถกู้คืนแยกต่างหาก


โปรดทราบด้วยว่าเมื่อดัมพ์หนึ่งสกีมาคุณจะไม่ดัมพ์ blobs (ชนิด LOB) ใช้-bตัวเลือกเพื่อถ่ายโอนข้อมูลด้วย blobs โปรดทราบว่า-bมีการเพิ่ม blobs ทั้งหมดไม่เพียง แต่สำหรับสคีมาเดียว
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"

สิ่งนี้สามารถใช้เพื่อกู้คืนฐานข้อมูล

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

5
นี่ไม่ได้ตอบคำถาม คำถามคือเกี่ยวกับการสำรองเพียงหนึ่ง schema ในฐานข้อมูลที่มีหลาย schema ไม่ใช่ฐานข้อมูลทั้งหมด
Mark Sinkinson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.