পোস্টগ্রিএসকিউএল: একই ডাটাবেসে ডাটাবেস স্কিমার সম্পূর্ণ অনুলিপি কীভাবে তৈরি করবেন?


26

আমি কীভাবে আমার publicস্কিমাটি পুরো টেবিল কাঠামো, ডেটা, ফাংশন, এফ, পি, এবং ইত্যাদি দিয়ে একই ডাটাবেসে অনুলিপি করতে পারি পোস্টগ্রিসের
আমার সংস্করণ 8.4
পিএস আমার স্কিমা নোট ডাটাবেস অনুলিপি করতে হবে


আপনার কি আরও স্কিমা আছে, না কেবল public?
a_horse_with_no_name

আমার পাবলিক এবং ডেমো স্কিম রয়েছে। এবং ডেমো অ্যাকাউন্ট তৈরি করার জন্য আমার ডেমো অনুলিপি করা দরকার ...

এটি করতে সক্ষম হবেন এমন একটি সহজ কাজ।
কুবেরচাঁন

উত্তর:


19

পিজি_ডাম্প / পিজি_রেস্টারে নিজেই এটি করার সহজ কোনও উপায় নেই। আপনি অস্থায়ীভাবে ডাটাবেস অপসারণ করতে সক্ষম হন তবে আপনি নিম্নলিখিতগুলি চেষ্টা করতে পারেন।

  1. Pg_dump ব্যবহার করে আপনার সর্বজনীন স্কীমার একটি ডাম্প নিন
  2. "ALLETCHEMA জনসাধারণের পুনরায় নামকরণ সার্বজনীন_কপি করুন" চালান
  3. Pg_restore ব্যবহার করে পদক্ষেপ 1 থেকে আপনার সর্বজনীন স্কিমার ডাম্প পুনরুদ্ধার করুন

কীভাবে আমি পিএইচপি এর মাধ্যমে পিজি_ডাম্প এবং পিজি_রেস্টারে অ্যাক্সেস করতে পারি?

এটি আপনি কোথায় ডাটাবেস চালাচ্ছেন তার উপর নির্ভর করে। আপনি আপনার সার্ভারের শেল থেকে pg_dump এবং pg_restore অ্যাক্সেস করতে পারেন। যদি আপনার শেল অ্যাক্সেস না থাকে তবে আপনি পিএইচপিএস শেল_এক্সেক ব্যবহার করতে চেষ্টা করতে পারেন , অন্যথায় আপনাকে বিকল্প ব্যাকআপ পদ্ধতিটি সন্ধান করতে হবে, সম্ভবত পোস্টগ্রিসকিউএল জিইউআই সরঞ্জাম

1
এটি এখন পর্যন্ত স্মার্ট সমাধান। শেল কমান্ড (ভালো কিছু দেখাবে ম্যানুয়াল আরও ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_dbpostgresপিডাব্লু-কম peerঅনুমোদনের সাথে সুপারভাইজার হিসাবে সবচেয়ে সহজ pg_haba.conf। পুনরুদ্ধার করুন পরে আপনি আসল স্কিমা নতুন নামকরণ হয়েছে: psql my_db -f '/path/to/file.pgsql'। আপনার যদি একটি সরল এসকিউএল ডাম্প থাকে, আপনার প্রয়োজন হবে নাpg_restore
এরউইন ব্র্যান্ডসেটেটার

একটি সহজ উপায় আছে, আমার উত্তর দেখুন। স্কিমা চয়ন করার জন্য pg_dump -n সুইচ সমর্থন করে। তারপরে শুধু ডাম্পের মধ্যে স্কিমা নাম সম্পাদনা করুন এবং পুনরায় লোড করুন।
স্কট মার্লো

2
কেবলমাত্র স্কিমার নাম পরিবর্তন করলে ফাংশনগুলির মধ্যে উল্লেখগুলি আপডেট করা হবে না: gist.github.com/pschultz/5387172 । নামটি প্রতিস্থাপন করা হ'ল ডাম্পটি হ'ল অনেক বেশি নির্ভরযোগ্য যদি আপনি নিজের সন্ধান এবং ডান প্রতিস্থাপন করেন।
পিটার

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

আপনি যদি পিএইচপি দিয়ে আটকে থাকেন তবে ব্যাক টিক ব্যবহার করুন

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

বা exec () কমান্ড। পরিবর্তনের জন্য আপনি একইভাবে সেড ব্যবহার করতে পারেন।

এখানে আরও 6 টি চর রয়েছে


1
স্কিমাটির নতুন নামকরণ এবং ব্যাকআপ হওয়া মূল স্কিমা ব্যাক আপ করা আরও নিরাপদ, বিশেষত যখন স্কিমা নাম সামগ্রী হিসাবে প্রদর্শিত হতে পারে (যেমন public)।
আর্টম

7

PgAdmin ব্যবহার করে আপনি নিম্নলিখিতটি করতে পারেন। এটি বেশ ম্যানুয়াল, তবে আপনার যা প্রয়োজন তা হতে পারে। একটি স্ক্রিপ্ট ভিত্তিক পদ্ধতির অনেক বেশি আকাঙ্ক্ষিত হবে। আপনার যদি অ্যাডমিন অ্যাক্সেস না থাকে এবং আপনার ডাটাবেস বড় হয় তবে এটি কতটা ভাল কাজ করবে তা নিশ্চিত নয় তবে আপনার স্থানীয় কম্পিউটারে আপনার যে ডেভলপমেন্ট ডাটাবেস রয়েছে তা ঠিক ঠিক কাজ করা উচিত।

  1. আপনি অনুলিপি করতে এবং ব্যাকআপ ক্লিক করতে চান স্কিমা নামটি ডান ক্লিক করুন। (আপনি এর থেকে আরও গভীরতর হতে পারেন এবং উভয়ের পরিবর্তে কাঠামোটিকে কেবল ব্যাকআপ করতে বেছে নিতে পারেন)।

  2. ব্যাকআপ ফাইলটিকে একটি নাম দিন এবং একটি ফর্ম্যাটও চয়ন করুন। (আমি সাধারণত টার ব্যবহার করি)

  3. ব্যাকআপ ক্লিক করুন।

  4. আপনি যে ব্যাক আপটি নিয়েছেন সেটি থেকে রাইট ক্লিক করুন এবং বৈশিষ্ট্যগুলি ক্লিক করুন এবং অস্থায়ীভাবে এর অন্য কোনও নামকরণ করুন। (যেমন টেম্প্রেনেম )

  5. স্কিমার মূলটি ক্লিক করুন এবং অবজেক্ট ব্রাউজারে এটিকে ডান ক্লিক করুন এবং নতুন স্কিমা তৈরি করতে ক্লিক করুন এবং স্কিমার নামটি সর্বজনীন দিন । এটি আপনার ব্যাকআপ থেকে অনুলিপি করা স্কিমা হবে।

  6. পদক্ষেপ 5 থেকে নতুন স্কিমা সর্বজনীন ডান ক্লিক করুন এবং পুনরুদ্ধার ক্লিক করুন। পদক্ষেপ 3 এ ব্যাকআপ ফাইল থেকে পুনরুদ্ধার করুন।

  7. নতুন স্কিমা জনসাধারণকে আলাদা নামে (যেমন নিউজচেমা ) নতুন নাম দিন ।

  8. স্কিমা টেম্প্রেনেমের নামটি পুনরায় নামকরণ করুন ৪ ধাপ থেকে আসল নামটিতে


পদক্ষেপ 5 এ তৈরি করা নতুন স্কিমাতে অবশ্যই আপনার ব্যাক আপ করা স্কিমাটির একই নাম থাকতে হবে, অন্যথায় পিজএডমিন কিছুই পুনরুদ্ধার করবে না।
Cao Minh Tu

5

আপনি ব্যবহার করতে পারেন

CREATE DATABASE new_db TEMPLATE = old_db;

তারপরে আপনার প্রয়োজন নেই এমন সমস্ত স্কিমা ফেলে দিন:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

একমাত্র ত্রুটিটি হ'ল পুরানো_ডিবিতে সমস্ত সংযোগগুলি অনুলিপি তৈরি করার আগে অবশ্যই নির্ধারণ করতে হবে (সুতরাং CREATE DATABASEবিবৃতিটি চালিত প্রক্রিয়াটি অবশ্যই টেমপ্লেট 1 এর সাথে সংযুক্ত হতে হবে)

যদি এটি কোনও বিকল্প না হয় তবে pg_dump / pg_restore এটি করার একমাত্র উপায়।


1
আমি এই প্রশ্ন জিজ্ঞাসা করার আগে, আমি একটি ডাটাবেস ক্লোনিং অনুরূপ পদ্ধতি ব্যবহার। তবে এটি অনেক সময় ব্যয় করে এবং আমি মনে করি যে কেবলমাত্র স্কিমার ক্লোনিংটি আরও দ্রুত ...

@sigra: ক্লোনিং এর a_horse এর পদ্ধতি হল ডাটাবেস সবচেয়ে দ্রুত পাওয়া যায়, কারণ প্রকৃত ফাইলগুলি মাত্র অনুলিপি করা যায়, যা মাথার উপরে অনেক পরিমাণ সঞ্চয় হয়। আমি সন্দেহ করি স্কিমাটির একটি ডাম্প এবং পুনরায় লোড দ্রুততর হবে যদি না স্কিমা পুরো ডিবিটির কেবল একটি ছোট অংশ না হয়। সুতরাং, এই উত্তরটির জন্য +1 এমনকি যদি এটি জিজ্ঞাসিত প্রকৃত প্রশ্নের উত্তর না দেয়।
এরউইন ব্র্যান্ডসেটেটার

এটি একটি একক স্কিমা ক্লোন করতে অনেক কাজ। স্কিমা ডাম্পিং, এটিকে ডাম্পে নামকরণ এবং পুনরায় লোড করা খুব দ্রুত।
স্কট মার্লো

@ স্কটমার্লো: বৃহত্তম স্কিমা কোনটির উপর নির্ভর করে। বৃহত্তম যদি বাদ পড়ে যাওয়াগুলির মধ্যে একটি হয়, তবে হ্যাঁ আমি সম্মত।
a_horse_with_no_name

2

ব্যবহারকারী 1113185 উত্তরে প্রসারিত হচ্ছে , এখানে পিএসকিএল / পিজি_ডাম্প ব্যবহার করে একটি সম্পূর্ণ ওয়ার্কফ্লো রয়েছে।

রপ্তানির সমস্ত বস্তু নিম্নলিখিত old_schemaকরুন এবং নতুন মধ্যে আমদানির তাদের new_schemaস্কিমা হিসেবে user, এ dbnameডাটাবেসের:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.