পোস্টগ্রিসকিউএল এর ত্রুটি: পুনরুদ্ধারের সাথে বিরোধের কারণে বিবৃতি বাতিল করা হচ্ছে


139

আমি স্ট্যান্ডবাই মোডে পোস্টগ্রেএসকিউএল ডিবিতে কোয়েরি চালানোর সময় নিম্নলিখিত ত্রুটিটি পাচ্ছি। ত্রুটির কারণ হিসাবে যে ক্যোয়ারীটি 1 মাস ধরে ঠিক কাজ করে আপনি যখন 1 মাসেরও বেশি সময় ধরে ত্রুটির ফলাফল পান।

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed

সমাধান করার জন্য কোন পরামর্শ? ধন্যবাদ


দয়া করে এডাব্লুএস ডকটি সন্ধান করুন যা এই ত্রুটিটি উল্লেখ করেছে এটিতেও
arunjos007

উত্তর:


89

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

দীর্ঘ প্রশ্নগুলি প্রায়শই বাতিল করা হবে।

আপনি ডামি কোয়েরি করে এমন প্রাথমিকটিতে পুনরাবৃত্তযোগ্য পাঠযোগ্য লেনদেন শুরু করে এটির চারপাশে কাজ করতে পারেন এবং সত্যিকারের ক্যোয়ারী মাধ্যমিক চলাকালীন অলস বসে। এটির উপস্থিতি প্রাথমিক স্তরের পুরানো সারি সংস্করণ শূন্য হওয়া রোধ করবে।

এই বিষয় এবং অন্যান্য কর্মক্ষেত্র সম্পর্কে আরও হট স্ট্যান্ডবাই - ডকুমেন্টেশনে কোয়েরি বিরোধের বিভাগে পরিচালনা করা হয়েছে


10
পোস্টগ্রেএসকিউএল 9.1+ এর ব্যবহারকারীদের: ব্যবহারিক সমাধানের জন্য নীচে ইরিউম্যানের উত্তরটি দেখুন।
জুলটান

3
পোস্টগ্রেএসকিউএল 9.1+ এর ব্যবহারকারীদের জন্য: সর্বাধিক-ম্যালিশের উত্তরটি অনেক স্যানার। আপনি ঝুঁকিগুলি না বুঝলে ইরিউম্যান পরামর্শটি করবেন না।
দাভোস

91

স্পর্শ করার দরকার নেই hot_standby_feedback। অন্যরা যেমন উল্লেখ করেছে, এটি নির্ধারণ onকরতে পারে মাস্টার ফুলে। কোন দাসের উপর লেনদেন খোলার এবং এটি বন্ধ না করার কল্পনা করুন।

পরিবর্তে, সেট max_standby_archive_delayএবং max_standby_streaming_delayকিছু বুদ্ধিমান মান:

# /etc/postgresql/10/main/postgresql.conf on a slave
max_standby_archive_delay = 900s
max_standby_streaming_delay = 900s

900 সেকেন্ডেরও কম সময়কাল সহ দাসদের উপর এইভাবে প্রশ্নগুলি বাতিল করা হবে না। যদি আপনার কাজের চাপের জন্য দীর্ঘতর প্রশ্নের প্রয়োজন হয় তবে কেবলমাত্র এই বিকল্পগুলিকে একটি উচ্চতর মান হিসাবে সেট করুন।


1
এই সমাধানটি আমরা ব্যবহার করে শেষ করেছি। এখানে উপস্থাপিত সমস্ত বিকল্পের মধ্যে সেরা সমঝোতার মত মনে হচ্ছে।
mohit6up

2
এটি সেরা উত্তর। নথি অনুসারে নোটগুলি এগুলি ক্রমযুক্ত; যদি আপনার রেপ্লিকাটির প্রতিলিপিটি ধরে রাখার বিষয়ে একাধিক প্রশ্ন থাকে তবে এটি হতে পারে আপনি 899 এ পৌঁছাতে পারেন তবে আরও 2 সেকেন্ডের ক্যোয়ারী বাতিল হয়ে যায়। আপনার কোডে কিছু সূক্ষ্ম ব্যাক-অফ কার্যকর করা ভাল। এছাড়াও, প্রতিলিপিটি স্ট্রিম করার সময় স্ট্রিমিং বিলম্ব কার্যকর হয়। যদি প্রতিলিপি স্ট্রিমিংয়ের সাথে ধরে রাখতে না পারে তবে এটি সংরক্ষণাগার থেকে অনুলিপি করাতে চলে যাবে। আপনি যদি সংরক্ষণাগার থেকে অনুলিপি করছেন তবে আপনার সম্ভবত এটি ধরা উচিত, max_standby_archive_delayঅন্যটির চেয়ে ছোট হতে পারে।
দাভোস

2
এটি এখনও এখানে সেরা সমাধান। লক্ষ করুন যে রেডশিফ্টে, আপনি এটি প্যারামিটার গ্রুপ সেটিংসের মাধ্যমে সেট করতে পারেন, কেবল এটির মধ্যে হওয়া উচিত ms, যেমন 900s = 16 মিনিট = 900000 মিমি।
নুলদেব


প্রদত্ত স্ট্যান্ডবাইয়ের উদ্দেশ্য যেমন রিপোর্ট করা এবং এটি কোনও গরম স্ট্যান্ডবাই নয় যা ফেলওভার হ্যান্ডেল করার জন্য প্রস্তুত হতে হবে, এটি একেবারে সেরা উত্তর।
স্যুপডগ

77

মাস্টারটিতে নিষ্ক্রিয় লেনদেন শুরু করার দরকার নেই। Postgresql-9.1 এ সমস্যাটি সমাধানের সর্বাধিক প্রত্যক্ষ উপায় হ'ল সেট করা

hot_standby_feedback = on

এটি মাস্টারকে দীর্ঘ-চলমান প্রশ্নগুলি সম্পর্কে সচেতন করবে। ডক্স থেকে :

প্রথম বিকল্পটি হ'ল_স্ট্যান্ডবি_ফিডব্যাক পরামিতি সেট করা যা ভ্যাকুয়ামকে সদ্য মৃত সারিগুলি সরাতে বাধা দেয় এবং তাই ক্লিনআপ দ্বন্দ্ব দেখা দেয় না।

কেন এটি ডিফল্ট নয়? এই প্যারামিটারটি প্রাথমিক প্রয়োগের পরে যুক্ত করা হয়েছিল এবং এটি একমাত্র উপায় যে স্ট্যান্ডবাই কোনও মাস্টারকে প্রভাবিত করতে পারে।


11
এই পরম স্ট্যান্ডবাইতে সেট করা উচিত।
স্টিভ কেহলেট 20:54 এ 23


50

হিসাবে বলেন এখানে সম্পর্কে hot_standby_feedback = on:

ঠিক আছে, এর অসুবিধাটি হ'ল স্ট্যান্ডবাই মাস্টারকে ফুলে উঠতে পারে যা কিছু লোকের জন্যও আশ্চর্যজনক হতে পারে

এবং এখানে :

ম্যাক্স_স্ট্যান্ডবি_স্ট্রিমিং_ডলে কী সেটিং দিয়ে? আমি বরং ডিফল্ট হট_স্ট্যান্ডবি_ফিডব্যাক ডিফল্ট -1 এর চেয়ে ডিফল্ট করব। এইভাবে আপনি স্ট্যান্ডবাইতে যা করেন তা কেবল স্ট্যান্ডবাইকেই প্রভাবিত করে


তাই আমি যোগ

max_standby_streaming_delay = -1

এবং pg_dumpআমাদের জন্য আর ত্রুটি নেই , বা মাস্টার ব্লাট :)

অ্যাডাব্লুএস আরডিএস উদাহরণ হিসাবে, http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/ Appendix.PostgreSQL.CommonDBATasks.html দেখুন


1
@ এলেনার্ড, এটি আমার পক্ষে কাজ করেছে। আমি এই কনফিগটি ক্রীতদাসের postgresql.conf এ যুক্ত করেছি, তারপরে দাসটিকে পুনরায় চালু করব।
আরদী আরম

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

7
এটি কীভাবে এডাব্লুএস আরডিএসে সেট করবেন?
ক্রিস এমপি

1
@KrisMP ব্যবহারের psql
Yehonatan

4
@ ক্রিসিএমপি প্যারামিটার গ্রুপে রয়েছে - ডকসস.এওএস.মাজোন.com
আমাজোনআরডিএস

13

দীর্ঘতর চলমান ক্যোয়ারি চলাকালীন হট স্ট্যান্ডবাই স্লেভ সার্ভারের সারণী ডেটাটি সংশোধিত হয়েছে। সারণী ডেটা পরিবর্তন করা হয়নি তা নিশ্চিত করার জন্য একটি সমাধান (পোস্টগ্রিসকিউএল 9.1+) হ'ল প্রতিলিপি স্থগিত করা এবং ক্যোয়ারির পরে পুনরায় শুরু করুন:

select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume

1
এটির জন্য সুপারজারের অধিকার প্রয়োজন। সুতরাং এটি কিছু ক্ষেত্রে সমাধান হতে পারে না।
জোও বাল্টাজার

1
PostgreSQL 10 এ, এর xlogসাথে প্রতিস্থাপন করা হয়েছিল wal, তাই আপনি কল করতে চান pg_wal_replay_pause()এবং pg_wal_replay_resume()
womble

3

উত্তরের জন্য দেরি হতে পারে তবে আমরা একই ধরণের সমস্যার মুখোমুখি হই। এর আগে আমাদের কেবল একটি আরডিএস ছিল এবং অ্যাপ্লিকেশনটিতে ব্যবহারকারীর সংখ্যা বাড়ার কারণে আমরা এর জন্য রিড প্রতিলিপি যুক্ত করার সিদ্ধান্ত নিয়েছি। পড়ার প্রতিরূপ মঞ্চে সঠিকভাবে কাজ করে তবে আমরা একবার প্রোডাকশনে চলে গেলে আমরা একই ত্রুটি পেতে শুরু করি।

সুতরাং আমরা হট_স্ট্যান্ডবাই_ফিডব্যাক সক্ষম করে এটি সমাধান করি বৈশিষ্ট্যে সম্পত্তি । আমরা নিম্নলিখিত লিঙ্ক উল্লেখ

https://aws.amazon.com/blogs/database/best-practices-for-amazon-rds-postgresql-replication/

আমি আশা করি এটি সাহায্য করবে


2

আমি উপরে @ সর্বাধিক মাল্যেশ এর দুর্দান্ত উত্তরে কিছু আপডেট হওয়া তথ্য এবং রেফারেন্স যুক্ত করতে যাচ্ছি।

সংক্ষেপে, আপনি যদি মাস্টারের উপর কিছু করেন তবে এটি দাসের উপর প্রতিলিপি করা দরকার। পোস্টগ্রিস এর জন্য ওয়াল রেকর্ড ব্যবহার করে, যা মাস্টারে প্রতিটি লগ করা ক্রিয়াকলাপের পরে ক্রীতদাসকে প্রেরণ করা হয়। এর পরে ক্রীতদাস ক্রিয়াটি কার্যকর করে এবং দু'জন আবার সিঙ্কে রয়েছে। বেশ কয়েকটি দৃশ্যের একটিতে, আপনি ওয়াল ক্রিয়ায় মাস্টারের কাছ থেকে যা আসছেন তা নিয়ে আপনি দাসের সাথে দ্বন্দ্বের মধ্যে পড়তে পারেন। তাদের বেশিরভাগ ক্ষেত্রে, ক্রীতদাসের উপর একটি লেনদেন ঘটছে যা ওয়াল কর্মটি কী পরিবর্তন করতে চায় তা নিয়ে দ্বন্দ্ব। সেক্ষেত্রে আপনার দুটি বিকল্প রয়েছে:

  1. ওয়াল কর্মের প্রয়োগটি কিছুটা বিলম্ব করুন, ক্রীতদাসকে তার বিরোধপূর্ণ লেনদেন শেষ করতে দিন, তারপরে অ্যাকশনটি প্রয়োগ করুন।
  2. দাসের বিরোধী কোয়েরি বাতিল করুন।

আমরা # 1 এবং দুটি মান নিয়ে উদ্বিগ্ন:

  • max_standby_archive_delay - মাস্টার এবং স্লেভের মধ্যে দীর্ঘ সংযোগের পরে এই বিলম্ব হ'ল, যখন ডাব্লুএল আর্কাইভ থেকে ডেটা পড়া হচ্ছে, যা বর্তমান তথ্য নয়।
  • max_standby_streaming_delay - স্ট্রিমিং প্রতিরূপের মাধ্যমে ডাব্লুএল এন্ট্রি গ্রহণ করা হলে প্রশ্ন বাতিল করার জন্য বিলম্ব হয়।

সাধারণত, যদি আপনার সার্ভারটি উচ্চ প্রাপ্যতার প্রতিরূপের জন্য বোঝানো হয় তবে আপনি এই সংখ্যাগুলি সংক্ষিপ্ত রাখতে চান। এর জন্য ডিফল্ট সেটিং 30000(যদি কোনও ইউনিট দেওয়া না হয় তবে মিলি সেকেন্ড) যথেষ্ট। তবে, আপনি যদি সংরক্ষণাগার, রিপোর্টিং-বা পড়ার-প্রতিরূপের মতো এমন কিছু সেট আপ করতে চান যা খুব দীর্ঘকালীন জিজ্ঞাসা থাকতে পারে, তবে বাতিল হওয়া প্রশ্নগুলি এড়াতে আপনি এটিকে আরও উচ্চতর কিছুতে সেট করতে চাইবেন। 900sউপরে প্রস্তাবিত সেটিংসটি একটি ভাল সূচনা পয়েন্টের মতো মনে হচ্ছে। আমি অসীম মান সেট করার বিষয়ে অফিসিয়াল ডক্সের সাথে একমত নই-1 একটি ভাল ধারণা হিসাবে - এটি কিছু বগি কোডটি মাস্ক করতে পারে এবং প্রচুর সমস্যার কারণ হতে পারে।

দীর্ঘকাল ধরে চলমান অনুসন্ধান এবং এই মানগুলিকে উচ্চতর সেট করার বিষয়ে একটি সতর্কতা হ'ল দীর্ঘ দৌড়ের সমান্তরালভাবে দাসের উপর চলমান অন্যান্য ক্যোয়ারী যেটি ডাব্লিউএল অ্যাকশনটি বিলম্বিত করছে তার দীর্ঘতর ক্যোয়ারী শেষ না হওয়া পর্যন্ত পুরানো ডেটা দেখতে পাবে। বিকাশকারীদের এটি বুঝতে হবে এবং কোয়েরিগুলি ক্রমিকায়িত করতে হবে যা একই সাথে চলবে না।

কীভাবে max_standby_archive_delayএবং কীভাবে max_standby_streaming_delayকাজ করবে এবং কেন, তার সম্পূর্ণ ব্যাখ্যার জন্য এখানে যান


1

তেমনি, উপরের উভয়কেই @ সর্বাধিক মাল্যেশের দুর্দান্ত উত্তরের @ আর্টিফিটেক্স এর বিস্তৃতকরণের জন্য এটি একটি দ্বিতীয় তদন্ত।

মাস্টার থেকে লেনদেনের যে কোনও বিলম্বিত প্রয়োগের সাথে অনুসরণকারী (গুলি) এর ডেটার একটি পুরানো এবং বাসি দর্শন থাকবে। সুতরাং অনুসরণকারীকে ম্যাক্স_স্ট্যান্ডবি_আর্কাইভ_ডিলে এবং ম্যাক্স_স্ট্যান্ডবি_স্ট্রিমিং_ডলে সেট করে সমাপ্তির জন্য সময় দেওয়ার সময়, এই দুটি সতর্কতা মাথায় রাখুন:

যদি ব্যাকআপের জন্য অনুগামীটির মান হোস্টিংয়ের প্রশ্নের সাথে খুব বেশি বিরোধে শেষ হয় তবে একটি সমাধান একাধিক অনুসরণকারী হতে পারে, প্রতিটিই একে অপরের জন্য অনুকূলিত।

এছাড়াও, নোট করুন যে একাধিক প্রশ্নগুলি ওয়াল এন্ট্রিগুলির প্রয়োগকে বিলম্বিত করে রাখতে পারে। সুতরাং নতুন মানগুলি নির্বাচন করার সময়, এটি কেবলমাত্র একক ক্যোয়ারির সময় নয়, একটি চলন্ত উইন্ডো যা যখনই বিরোধী কোয়েরি শুরু হয় এবং ওয়াল এন্ট্রি শেষ পর্যন্ত প্রয়োগ করা হয় তখন শেষ হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.