PostgreSQL: एक डेटाबेस से केवल एक स्कीमा का बैकअप कैसे लें और इसे दूसरे सर्वर पर पुनर्स्थापित करें


22

मेरे पास "A" नाम का एक डेटाबेस है जिसमें दो स्कीमा "B" और "C" हैं। मैं एक अलग सर्वर पर स्कीमा "बी" को बैकअप और पुनर्स्थापित करना चाहता हूं? यह सुनिश्चित करने के लिए नहीं कि यह कैसे करना है क्योंकि मैं पोस्टग्रेज के लिए नया हूं। क्या मुझे नाम "ए" के रूप में नए गंभीर पर एक नया डीबी बनाना है और फिर उस पर स्कीमा "बी" को पुनर्स्थापित करना है। कमांड के साथ pls मदद।

--- पीटर के जवाब पर टिप्पणी से जानकारी:

मैं स्कीमा "बी" + डेटा का बैकअप और पुनर्स्थापना करना चाहता हूं। दूसरे मैं यह बताना भूल गया कि Postgresql 9.1 उबंटू 12.04 पर चल रहा है

जवाबों:


16

आप चुन सकते हैं कि कौन सा स्कीमा -npg_dump के विकल्प के साथ डंप करना है । स्कीमा बी का एक डंप बनाएं:

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

डंप फ़ाइल को पुनर्स्थापित करें:

pg_restore -d somedb dump.dmp

लक्ष्य डेटाबेस में मूल नाम के समान नाम होना आवश्यक नहीं है।

ध्यान दें कि यदि स्कीमा B की स्कीमा C पर निर्भरता है, तो आपको समस्याएँ होंगी। तब आप इसे अलग से पुनर्स्थापित नहीं कर पाएंगे।


यह भी ध्यान दें कि एक स्कीमा डंप करते समय आप बूँदें (LOB प्रकार) डंप नहीं करेंगे। -bबूँद के साथ डंप करने के लिए विकल्प का उपयोग करें । ध्यान दें कि -bसभी ब्लॉब्स के साथ न केवल एक स्कीमा के लिए जोड़ा जाता है।
नक्स

7

आप पैरामीटर जोड़ सकते हैं -n [schema name] इस पैरामीटर की टिप्पणी में कहा गया है:

-n schema
--schema=schema

डंपिंग केवल स्कीमा मिलान स्कीमा; यह स्कीमा दोनों को ही चुनता है, और इसके सभी निहित वस्तुओं को। जब यह विकल्प निर्दिष्ट नहीं होता है, तो लक्ष्य डेटाबेस में सभी गैर-सिस्टम स्कीमा डंप हो जाएंगे।


1
क्या पीटर आइजेंट्राउट ने अपने जवाब में ऐसा नहीं किया?
dezso

3
  • आप pg_dump टूल ( pg_dump doc देखें ) और pg_restore ( pg_restore doc ) का उपयोग कर सकते हैं
  • आपको नए सर्वर पर नया डेटाबेस नाम "ए" बनाने की आवश्यकता नहीं है।

* मूल उदाहरण:

मैं डंप / रिस्टोर करने के लिए विंडो में "dip.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) का उपयोग कर सकते हैं। फ़ाइल ( .bakup ...) को पुनर्स्थापित करने के लिए आपको pg_restore का उपयोग करना चाहिए


1
आपकी टिप्पणी के जवाब में: जब आप उपयोग नहीं करते हैं --schema-only, तो डेटा डंप में होना चाहिए या आपके पास तालिका सामग्री का चयन करने के लिए प्राइवेटिलिज नहीं हो सकता है।
मलटीन

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
इस सवाल का जवाब नहीं है। प्रश्न एक डेटाबेस में केवल एक स्कीमा का समर्थन करने के बारे में है जिसमें कई स्कीमा हैं, संपूर्ण डेटाबेस नहीं।
मार्क सिंकिनसन 11
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.