pg_restore: [আরিচিভার (ডিবি)] কোয়েরি কার্যকর করতে পারেনি: ত্রুটি: স্কিমা "পাবলিক" ইতিমধ্যে বিদ্যমান


18

আমি পোস্টগ্রিএসকিউএল ডাটাবেস ব্যাকআপ এবং পুনরুদ্ধার করতে pg_dump / pg_restore ব্যবহার করছি তবে pg_restore থেকে কিছু ত্রুটি বার্তা (এবং একটি শূন্য-বহির্গমন স্থিতি) পাচ্ছি। আমি একটি সুপার সাধারণ বেস কেস চেষ্টা করেছি (নীচে বর্ণিত) তবে এখনও এই ত্রুটিগুলি পেয়েছে:

pg_restore: [তীরচিহ্ন (ডিবি)] টিউসি প্রসেসিংয়ের সময় ত্রুটি:
পিজি_রেস্টোর: [আর্কিভার (ডিবি)] টিওসি এন্ট্রি 5 থেকে ত্রুটি; 2615 2200 SCHEMA সর্বজনীন পোস্টগ্রাগেস
pg_restore: [আরিচিভার (ডিবি)] কোয়েরি কার্যকর করতে পারেনি: ERROR: স্কিমা "পাবলিক" ইতিমধ্যে বিদ্যমান
    কমান্ডটি ছিল: স্কেম জনসাধারণকে তৈরি করুন;

ধাপ পুনর্গঠন কর:

  1. একটি নতুন, ভ্যানিলা উবুন্টু 14.04 ডিস্ট্রো ইনস্টল করুন (আমি এই ভ্যাগ্র্যান্ট বাক্সের সাথে ভ্যাগ্র্যান্ট ব্যবহার করছি )।
  2. PostgreSQL 9.3 ইনস্টল করুন, যে কোনও লিনাক্স ব্যবহারকারীর পোস্টগ্র্রেএসকিউএল ব্যবহারকারী "পোস্টগ্রিজ" হিসাবে স্থানীয় সংযোগের অনুমতি দেওয়ার জন্য কনফিগার করুন।
  3. একটি পরীক্ষা ডাটাবেস তৈরি করুন। আমি শুধু করছি:

    ভ্যাগ্র্যান্ট @ ভ্যাগ্র্যান্ট-উবুন্টু-বিশ্বাসযোগ্য -৪:: $ $ পিএসকিএল - ব্যবহারকারী নাম = পোস্টগ্রিস পোস্টগ্রিস
    পিএসকিএল (9.3.5)
    সহায়তার জন্য "সহায়তা" টাইপ করুন।
    
    postgres = # ডেটাবেস মাইডিবি তৈরি করুন;
    ডেটাবেস তৈরি করুন
    postgres = # \ কিউ
    ভ্যাগ্র্যান্ট @ ভ্যাগ্র্যান্ট-উবুন্টু-বিশ্বাসযোগ্য -৪:: $ $ পিএসকিএল - ব্যবহারকারীর নাম = পোস্টগ্রিজ মাইডিবি
    পিএসকিএল (9.3.5)
    সহায়তার জন্য "সহায়তা" টাইপ করুন।
    
    mydb = # টেবিল ডেটা তৈরি করুন (এন্ট্রি বিগিন্ট);
    ছক তৈরি কর
    mydb = # ডেটা মানগুলিতে সন্নিবেশ (1);
    সংযুক্ত 0 1
    mydb = # ডেটা মানগুলিতে প্রবেশ করান (2);
    সংযুক্ত 0 1
    mydb = # ডেটা মানগুলিতে প্রবেশ করান (3);
    সংযুক্ত 0 1
    mydb = # \ কিউ
    
  4. ডাটাবেসের ব্যাকআপ যেমন তৈরি করুন:

    পিজিপিএএসডাবর্ড = "পোস্টগ্রিস" পিজি_ডাম্প - ডিবি নাম = মাইডিবি - ব্যবহারকারীর নাম = পোস্টগ্রিস - ফর্ম্যাট = কাস্টম> পিজি_ব্যাকআপ.ডম্প
  5. মাইডবিতে ডেটা টেবিলের বাইরে কিছু সারি মুছুন যাতে আমরা সফলভাবে ডেটা পুনরুদ্ধার করেছি কিনা তা আমরা বলতে সক্ষম হব।

  6. এর সাথে ডাটাবেস পুনরুদ্ধার করুন:

    পিজিপিএএসডব্লর্ড = "পোস্টগ্রিস" পিজি_রেস্টোর - ক্লায়ান - ক্রিয়েট - ডিবি নাম = পোস্টগ্রিস - ইউজারনেম = পোস্টগ্রিস পিজি_ব্যাকআপ.ডম্প

ডেটা পুনরুদ্ধার করা হয়েছে, তবে pg_restore কমান্ড step ধাপে স্থিতি সহ প্রস্থান করে 1এবং নিম্নলিখিত আউটপুটটি দেখায়:

pg_restore: [তীরচিহ্ন (ডিবি)] টিউসি প্রসেসিংয়ের সময় ত্রুটি:
পিজি_রেস্টোর: [আর্কিভার (ডিবি)] টিওসি এন্ট্রি 5 থেকে ত্রুটি; 2615 2200 SCHEMA সর্বজনীন পোস্টগ্রাগেস
pg_restore: [আরিচিভার (ডিবি)] কোয়েরি কার্যকর করতে পারেনি: ERROR: স্কিমা "পাবলিক" ইতিমধ্যে বিদ্যমান
    কমান্ডটি ছিল: স্কেম জনসাধারণকে তৈরি করুন;



সতর্কতা: পুনরুদ্ধার করতে ত্রুটিগুলি উপেক্ষা করা হয়েছে: 1

আমি কেবল এটিকে উপেক্ষা করতে পারি না কারণ আমি এই কমান্ডটি প্রোগ্রামগতভাবে চালাচ্ছি এবং পুনরুদ্ধারটি ব্যর্থ হয়েছে কি না তা নির্ধারণের জন্য প্রস্থান স্থিতি ব্যবহার করতে হবে। প্রাথমিকভাবে, আমি ভাবছিলাম যে এই সমস্যাটি কিনা কারণ আমি আমার ডাটাবেসটিকে জনসাধারণের মধ্যে রেখেছি (ডিফল্ট স্কিমা)। আমি যুক্তি দিয়েছিলাম যে --createডেটা পুনরুদ্ধারের আগে pg_restore দ্বারা অপশনটির ফলাফল হিসাবে সর্বজনীন তৈরি করা হবে (যা টেবিলটি সেখানে রয়েছে সেহেতু সেই স্কিমাটি তৈরি করার চেষ্টা করতে পারে) তবে যখন আমি আমার টেবিলটি দিয়ে উপরের পদক্ষেপগুলি চেষ্টা করেছি একটি পৃথক স্কিমে, ফলাফলগুলি একই ছিল এবং ত্রুটির বার্তাগুলি অভিন্ন ছিল।

আমি কি ভুল কিছু করছি? আমি কেন এই ত্রুটিটি দেখছি?

উত্তর:


16

ত্রুটিটি নির্দোষ নয় তবে এ থেকে মুক্তি পাওয়ার জন্য, আমার মনে হয় আপনার এই পুনরুদ্ধারটি দুটি কমান্ডে বিভক্ত করা দরকার, যেমন:

dropdb -U postgres mydb && \
 pg_restore --create --dbname=postgres --username=postgres pg_backup.dump

--cleanPg_restore- এ বিকল্পটি তেমন দেখতে লাগে না তবে বাস্তবে অ-তুচ্ছ সমস্যা উত্থাপন করে।

9.1 পর্যন্ত সংস্করণগুলির জন্য

সমন্বয় --createএবং --cleanpg_restore অপশন একটি (আপ 9.1 পর্যন্ত) পুরোনো পিজি সংস্করণে ত্রুটি ব্যবহার করা হয়। এর মধ্যে কিছুটা দ্বন্দ্ব রয়েছে (9.1 ম্যানপেজটি উদ্ধৃত করে):

- ক্ল্যান ক্লিন (ড্রপ) ডাটাবেস বস্তুগুলি পুনরায় তৈরি করার পূর্বে

এবং

--create এটি পুনরুদ্ধার করার আগে ডাটাবেস তৈরি করুন।

কারণ একটি ব্র্যান্ড-নতুন ডাটাবেসের ভিতরে পরিষ্কার করার বিন্দুটি কী?

সংস্করণ 9.2 থেকে শুরু হচ্ছে

সংমিশ্রণটি এখন স্বীকার করা হয়েছে এবং ডক এটি বলেছেন (9.3 ম্যানপেজটি উদ্ধৃত করে):

- ক্ল্যান ক্লিন (ড্রপ) ডাটাবেস বস্তুগুলি পুনরায় তৈরি করার পূর্বে। (গন্তব্য ডেটাবেসে কোনও বস্তু উপস্থিত না থাকলে এটি কিছু ক্ষতিহীন ত্রুটি বার্তা উত্পন্ন করতে পারে))

--create এটি পুনরুদ্ধার করার আগে ডাটাবেস তৈরি করুন। যদি - ক্ল্যানটিও নির্দিষ্ট করা থাকে তবে লক্ষ্যযুক্ত ডাটাবেসটি সংযুক্ত হওয়ার আগে এটি ড্রপ করে পুনরায় তৈরি করুন।

এখন উভয়কে এক সাথে রাখলে আপনার পুনরুদ্ধারের সময় এই ধরণের ক্রম বাড়ে:

DROP DATABASE mydb;
...
CREATE DATABASE mydb WITH TEMPLATE = template0... [other options]
...
CREATE SCHEMA public;
...
CREATE TABLE...

DROPপ্রতিটি পৃথক বস্তুর জন্য কোনও নেই , DROP DATABASEশুরুতে এটি কেবল একটি । এটি ব্যবহার --createনা করলে বিপরীত হবে।

যাই হোক এই ক্রম ত্রুটির উত্থাপন publicইতিমধ্যে বিদ্যমান কারণ তৈরি স্কিমা mydbথেকে template0(যা স্বাভাবিক, এটা একটি টেমপ্লেট ডেটাবেসের বিন্দু) এটি ইতিমধ্যে আমদানি হয়েছে।

আমি নিশ্চিত না কেন এই মামলাটি স্বয়ংক্রিয়ভাবে পরিচালিত হচ্ছে না pg_restore। আমাদের যখন এটি করার কথা না বললেও কোনও প্রশাসক কাস্টমাইজ করতে template0এবং / অথবা এর উদ্দেশ্য পরিবর্তন করার সিদ্ধান্ত নেয় তখন এটি অনাকাঙ্ক্ষিত পার্শ্ব-প্রতিক্রিয়ার কারণ হতে পারে public


আমি 9.6 ব্যবহার করছি, এবং উল্লেখ --createছাড়াই cleanসমস্যাটির সমাধান হয় না।
সেরিন

7

আমার ক্ষেত্রে, কারণটি ছিল যে আমি পোস্টগ্রেএসকিউএল ক্লাস্টার 9.6 এ 9.6 pg_restoreদ্বারা তৈরি একটি ডাম্প পুনরুদ্ধার pg_dumpকরতে পোস্টগ্রেস্কুএল -অবদান সংস্করণ 11.2 থেকে ব্যবহার করছি ।

আমি আমার pg_restoreপিছনে 9..6 ডাউনগ্রেড করার পরে , এই schema "public" already existsত্রুটিটি চলে গেছে, এবং পুনরুদ্ধার প্রক্রিয়াটি আগের মতো কাজ করেছিল।


কিন্তু আপনি কি পিজি_রেস্টোর 9.6 পোস্টগ্রেস 11.2 ডাটাবেসে ব্যবহার করে ডাম্পটি পুনরুদ্ধার করেছেন?
মারিয়ানো রুইজ

@ মারিয়ানো রুইজ আমি আমার মূল উত্তরটি পরিষ্কার বলে মনে করি: "আমি পোস্টগ্রেএসকিউএল-ক্লাস্টার 9.6 তে পিজি_ডাম্প 9.6 দ্বারা তৈরি একটি ডাম্প পুনরুদ্ধার করার জন্য পোস্টগ্রেএসকিএল-অবদান সংস্করণ ১১.২ থেকে pg_restore ব্যবহার করছিলাম।" সুতরাং আপনার প্রশ্ন: না, আমি না। আমার pg_restore 11.2 ছিল যখন pg ক্লাস্টারটি 9.6 ছিল
লু লিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.