পোস্টগ্রিএসকিউএল: কীভাবে একটি ডাটাবেস থেকে কেবল একটি স্কিমার ব্যাকআপ নেবেন এবং অন্য সার্ভারে এটি পুনরুদ্ধার করবেন


22

আমার কাছে "এ" নামে একটি ডাটাবেস রয়েছে যার দুটি স্কিম "বি" এবং "সি" রয়েছে। আমি আলাদা সার্ভারে স্কিমা "বি" ব্যাকআপ এবং পুনরুদ্ধার করতে চাই? পোস্টগ্র্রেসে আমি নতুন হওয়ায় এটি কীভাবে করবেন তা নিশ্চিত নন। আমাকে কি "এ" নাম হিসাবে নতুন সেভারে একটি নতুন ডিবি তৈরি করতে হবে এবং তারপরে স্কিমার "বি" পুনরুদ্ধার করতে হবে। pls কমান্ড সাহায্য।

--- পিটার এর উত্তর মন্তব্য থেকে তথ্য:

আমি স্কিমা "বি" + ডেটা ব্যাকআপ এবং পুনরুদ্ধার করতে চাই। দ্বিতীয়ত আমি উবুন্টু 12.04 এ চলমান পোস্টগ্র্যাস্কল 9.1 উল্লেখ করতে ভুলে গিয়েছি

উত্তর:


16

-nPg_dump বিকল্পের সাহায্যে কোন স্কিমার ডাম্প করতে হবে তা আপনি চয়ন করতে পারেন । স্কিমা বি এর একটি ডাম্প তৈরি করুন:

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

ডাম্প ফাইলটি পুনরুদ্ধার করুন:

pg_restore -d somedb dump.dmp

লক্ষ্য ডাটাবেসের মূল নামটির মতো একই নাম থাকতে হবে না।

মনে রাখবেন যে স্কীমা বিতে স্কিমা সি এর উপর নির্ভরশীলতা থাকলে আপনার সমস্যা হবে Then


আরও মনে রাখবেন যে একটি স্কিমা ডাম্প করার সময় আপনি ব্লবগুলি (এলওবি টাইপ) ডাম্প করবেন না। -bব্লবসের সাথে ডাম্প করার জন্য বিকল্পটি ব্যবহার করুন । মনে রাখবেন যে -bসমস্ত ব্লগের সাথে কেবল একটি একক স্কিমার জন্য নয়।
নাক্স

7

আপনি প্যারামিটার যুক্ত করতে পারেন -n [schema name] এই প্যারামিটারের মন্তব্যটি বলা হয়:

-n schema
--schema=schema

শুধুমাত্র স্কিমার সাথে স্কিমার মিল রয়েছে; এটি স্কিমা নিজেই এবং এর মধ্যে থাকা সমস্ত বস্তু উভয়ই নির্বাচন করে। যখন এই বিকল্পটি সুনির্দিষ্ট করা হয় না, লক্ষ্য ডাটাবেসের সমস্ত নন-সিস্টেম স্কিমাগুলি ফেলে দেওয়া হবে।


1
পিটার আইসেন্ট্রাট কি তার উত্তরে এটি করেছিলেন?
dezso

3
  • আপনি pg_dump সরঞ্জাম ( pg_dump ডক দেখুন ) এবং pg_restore ( pg_restore ডক ) ব্যবহার করতে পারেন
  • আপনাকে নতুন সার্ভারে নতুন একটি ডাটাবেস নাম "এ" তৈরি করার দরকার নেই।

* বেসিক উদাহরণ:

আমি ডাম্প / পুনরুদ্ধার করতে উইন্ডোতে "ডাম্প.বাট" এবং "পুনরুদ্ধার"। ফাইলগুলি তৈরি করি

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" (**)

(**) বাস্তবে, যদি আপনার ফর্ম্যাট ফাইলটি *। এসকিউএল হয়, আপনি পুনরুদ্ধার করতে পিজএডমিন (বা পিএসকিএল) ব্যবহার করতে পারেন। একটি ফাইল .tar ( .bakup ...) পুনরুদ্ধার করার জন্য আপনার পিজি_রেস্টোর ব্যবহার করা উচিত


1
আপনার মন্তব্যের জবাবে: আপনি যখন ব্যবহার করবেন না --schema-only, তখন ডেটা অবশ্যই ডাম্পের মধ্যে থাকতে হবে বা টেবিলের সামগ্রীগুলি নির্বাচন করার জন্য আপনার প্রাইভেলিজ নাও থাকতে পারে।
maletin

0

আমি একটি স্ক্রিপ্ট লিখেছিলাম যা এই তুচ্ছ করে তোলে। পৃথক *.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
এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি হ'ল একাধিক স্কিমার সাথে একটি ডাটাবেসে কেবল একটি স্কিমা ব্যাক আপ করা, পুরো ডাটাবেস নয়।
মার্ক সিনিংসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.