লকটির জন্য অপেক্ষা করা পোস্টগ্রিজ এসকিউএলএলটার টেবল কোয়েরি বাতিল করা কি নিরাপদ?


10

আমরা ALTER TABLEকয়েক ঘন্টা আগে একটি জিজ্ঞাসা শুরু করেছি এবং কেবল সম্প্রতি (মাধ্যমে pg_stat_activity) বুঝতে পেরেছি যে এটি কোনও লকের জন্য অপেক্ষা করছে। আমরা যে সন্ধানটি পরিবর্তন করতে চাইছি তার টেবিলে একটি লক আটকানো আছে এবং এটি ছাড়তে দিচ্ছে না তা খুঁজে পেয়েছি query

আমাদের ক্যোয়ারী একটি "সাধারণ" ক্যোয়ারী (কলামের ডেটার ধরণের পরিবর্তন), তবে এটি একটি বিশাল টেবিলে চলছে।

লক ধরে রাখা প্রক্রিয়াটি হত্যার পরিবর্তে আমরা সিদ্ধান্ত নিয়েছি আমরা বরং হত্যা করব ALTER TABLE

আমরা কি না মোড়ানো ALTER TABLEএকটি লেনদেন হবে।

আমি যতদূর বুঝতে পেরেছি, আমাদের জিজ্ঞাসার তালাবন্ধের জন্য অপেক্ষা করা হচ্ছে তার অর্থ এটি সর্বদা লকের জন্য অপেক্ষা করে ছিল এবং এটি কখনও কোনও পরিবর্তন করে নি।

এটা কি সত্য? আমাদের ALTER TABLEজিজ্ঞাসাটি বাতিল করে দেওয়া কি আমাদের পক্ষে নিরাপদ ? অথবা এটি কি সম্ভব যে ক্যোয়ারী ইতিমধ্যে কিছু পরিবর্তন করেছে এবং এটি বাতিল করা আমাদের ডাটাবেসটিকে কোনও ধরণের অর্ধেক জায়গায় রেখে দেবে?

PS: পরিকল্পনা এটি ব্যবহার করে বাতিল করার SELECT pg_cancel_backend(pid);। যদি এটি খারাপ ধারণা হয় তবে দয়া করে আমাকে জানান।


1
ALTER TABLE বাতিল করার জন্য জরিমানা করা উচিত। পোস্টগ্রাএসকিউএল এর ট্রানজেকশনাল ডিডিএল রয়েছে এবং আপনাকে একই অবস্থায় রেখে দেওয়া উচিত যেন আপনি মোটেও টেবিল চালিত করেননি।
জোশ কুপারশ্মিদ্দ্ট

সুতরাং যখন আপনি বলছেন যে পোস্টগ্রিসকিউএল এর একটি লেনদেন ডিডিএল রয়েছে, তার মানে কি কোনও স্কিমা-পরিবর্তনকারী কোয়েরি মূলত কোনও লেনদেনের মধ্যেই চলে?
জেএমটাইলার

1
আপনার ক্ষেত্রে, অ্যালটার টেবিলে "মূলত একটি লেনদেনের অভ্যন্তরে দৌড়ানো" হয়, যেহেতু আপনি বলেছিলেন যে "আমরা একটি লেনদেনের মধ্যেই আলেটার টেবলটি জড়ালাম না"। আপনি যদি চাইতেন তবে আপনি শুরু করতে পারেন লিখুন; টেবিল ফুটার বদলে ...; টেবিল বার পরিবর্তন করুন ...; ইত্যাদি; কমিট; - এটি পোস্টগ্রেরএসকিউএল এর ট্রানজেকশনাল ডিডিএল আসল হত্যাকারী বৈশিষ্ট্য। তবে আপনার তাত্ক্ষণিক পরিস্থিতির জন্য, হ্যাঁ, এটির নিজেরাই ALTER TABLE নিরাপদে বাতিল করা যেতে পারে এবং রোল-ব্যাক করে দেওয়া হবে যেন কখনও ঘটেছিল না।
জোশ কুপারশ্মিদ্দ্ট

আপনার দ্রুত জবাবের জন্য আপনাকে অনেক ধন্যবাদ! এটা খুব ভাল তথ্য। আপনি কি এটি উত্তর হিসাবে পোস্ট করতে পারেন যাতে আমি এটি গ্রহণযোগ্য হিসাবে চিহ্নিত করতে পারি?
জেএমটাইলার

উত্তর:


13

আমি যতদূর বুঝতে পেরেছি, আমাদের জিজ্ঞাসার তালাবন্ধের জন্য অপেক্ষা করা হচ্ছে তার অর্থ এটি সর্বদা লকের জন্য অপেক্ষা করে ছিল এবং এটি কখনও কোনও পরিবর্তন করে নি।

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

সম্পূর্ণরূপে আমাদের টেবিল কোয়েরিটি বাতিল করা কি আমাদের পক্ষে নিরাপদ? অথবা এটি কি সম্ভব যে ক্যোয়ারী ইতিমধ্যে কিছু পরিবর্তন করেছে এবং এটি বাতিল করা আমাদের ডাটাবেসটিকে কোনও ধরণের অর্ধেক জায়গায় রেখে দেবে?

পোস্টগ্রিএসকিউএল-এ কোয়েরিগুলি (বা সমতুল্যভাবে, কোনও লেনদেন ফিরিয়ে আনার) কোনও ডেটাবেস দুর্নীতির ঝুঁকি নেই যা আপনি নির্দিষ্ট অন্যান্য ডাটাবেসে (যেমন এই পৃষ্ঠার নীচে ভয়াবহ সতর্কতা ) দ্বারা জড়িত হতে পারে। এই কারণেই অ-সুপারयूসারগণ সাম্প্রতিক সংস্করণগুলিতে, অন্যান্য ব্যাকেন্ডে চলমান নিজস্ব প্রশ্নগুলি ব্যবহার করতে pg_cancel_backend()এবং pg_terminate_backend()হত্যা করতে মুক্ত - তারা ডাটাবেস দুর্নীতি সম্পর্কে উদ্বেগ প্রকাশ না করে ব্যবহার করা নিরাপদ। সর্বোপরি, পোস্টগ্রিএসকিউএলকে যে কোনও প্রক্রিয়া নিহত হওয়ার সাথে মোকাবিলা করার জন্য প্রস্তুত থাকতে হবে যেমন ওওম কিলার, সার্ভার শাটডাউন ইত্যাদির কাছ থেকে সিগ্কিল ইত্যাদি That's ওয়াল লগটি এটাই।

আপনি এটিও দেখতে পেয়েছেন যে পোস্টগ্র্যাস এসকিউএল-তে, বেশিরভাগ ডিডিএল কমান্ডগুলি (মাল্টি-স্টেটমেন্ট) লেনদেনের ভিতরে বাসাতে করা সম্ভব হয়, যেমন

BEGIN;
ALTER TABLE foo ...;
ALTER TABLE bar ...;
-- more stuff
COMMIT; -- or ROLLBACK; if you've changed your mind

(এটি নিশ্চিত করার জন্য দুর্দান্ত যে স্কিমা মাইগ্রেশনগুলি পুরোপুরি একসাথে চলেছে বা মোটেও নয়)) আপনি বলেছেন, যদিও:

আমরা কি না মোড়ানো ALTER TABLEএকটি লেনদেন হবে।

একক কমান্ডের জন্য এটি ঠিক - ডক্স থেকে ,

PostgreSQL আসলে প্রতিটি এসকিউএল স্টেটমেন্টকে লেনদেনের মধ্যে কার্যকর করা হিসাবে গণ্য করে। আপনি যদি কোনও BEGIN কমান্ড না জারি করেন, তবে প্রতিটি স্বতন্ত্র বিবৃতিতে একটি অন্তর্নিহিত BEGIN থাকে এবং (যদি সফল হয়) তবে তার চারপাশে COMPIT জড়িত। বিগিন এবং কমিমিট দ্বারা বেষ্টিত একটি গ্রুপের বক্তব্যকে কখনও কখনও লেনদেন ব্লকও বলা হয়।

সুতরাং যেটি বাতিল করা ALTER TABLEহয়, pg_cancel_backend()নিয়ন্ত্রণকারী পিএসকিএল প্রম্পট থেকে জারি করা কোনও সিটিআরএল-সি এর সাথে একই রকম প্রভাব পড়বে যেমন আপনি করেছেন

BEGIN;
ALTER TABLE ... ;
ROLLBACK;

(যদিও আপনি আশাবাদী দেখতে পেয়েছেন যে, এই ব্যয়বহুলটি বাতিল করা ALTER TABLEযদি আপনি কেবল যে ROLLBACKকোনও উপায়ে যাচ্ছেন তবে ডাটাবেসটিকে অনেক অপ্রয়োজনীয় গ্রাইন্ডিং থেকে রক্ষা করতে পারে ))


5

জোশের সঠিক এবং দুর্দান্ত উত্তরের বিস্তারিত জানাতে:

সম্পূর্ণরূপে আমাদের টেবিল কোয়েরিটি বাতিল করা কি আমাদের পক্ষে নিরাপদ?

হ্যাঁ.

টেবিলটি পুনরায় লেখার মাঝখানে থাকলেও এটি নিরাপদ হবে ।

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

ডিডিএল অপারেশনগুলি ওয়াল-এর মাধ্যমে লগ হয় এবং এটি গ্যারান্টিযুক্ত যে এগুলি হয় আবার ঘূর্ণায়মান বা ক্র্যাশ হওয়ার পরে বা পুনরুদ্ধারের পরে পুনরুদ্ধারের পরে সম্পূর্ণ করা যেতে পারে।


3
"আপনি কেবল পুরো পোস্টগ্রাইএসকিউএল সার্ভারটি বন্ধ করে দিতে পারতেন, বা আসলে যে মেশিনটি এটি চালায়, এটি পুনরায় আরম্ভ করুন এবং সবকিছু ঠিক থাকবে" - এই বিষয়টি সম্পর্কে সত্যই যতক্ষণ না আপনার বিশ্বাসযোগ্য হার্ডওয়্যার রয়েছে যতক্ষণ না ফাইএনসিচ সম্পর্কে মিথ্যা থাকে , wiki.postgresql.org/wiki/Reliable_Writes
জোশ কুপারশ্মিত

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