ওএসে স্থান ফেরাতে, ব্যবহার করুন VACUUM FULL
। এটি যখন ছিল আমি মনে করি আপনি দৌড়াচ্ছেন VACUUM FULL ANALYZE
। আমি ম্যানুয়াল উদ্ধৃত :
FULL
"পূর্ণ" শূন্যস্থান নির্বাচন করে, যা আরও বেশি জায়গা দাবি করতে পারে , তবে অনেক বেশি সময় নেয় এবং একচেটিয়াভাবে টেবিলটি লক করে। এই পদ্ধতিতে অতিরিক্ত ডিস্কের জায়গাও প্রয়োজন, কারণ এটি টেবিলের একটি নতুন অনুলিপি লিখেছে এবং অপারেশন সম্পূর্ণ না হওয়া পর্যন্ত পুরানো অনুলিপিটি প্রকাশ করে না। সাধারণত এটি তখনই ব্যবহার করা উচিত যখন উল্লেখযোগ্য পরিমাণে স্থানটি টেবিলের মধ্যে থেকে পুনরুদ্ধার করা দরকার।
বোল্ড জোর আমার।
CLUSTER
সমান্তরাল প্রভাব হিসাবে এটি অর্জনও করে।
সরল VACUUM
সাধারণত আপনার লক্ষ্য অর্জন করে না ( "একটি টেবিলের শেষে এক বা একাধিক পৃষ্ঠাগুলি সম্পূর্ণ বিনামূল্যে" )। ম্যানুয়াল নির্দেশাবলী থেকে আপনার উদ্ধৃতিটির মতো - এটি সুযোগটি আসার সাথে সাথে সারিগুলি পুনরায় অর্ডার করে না এবং কেবলমাত্র ফাইলের শারীরিক প্রান্ত থেকে খালি পৃষ্ঠাগুলি ছাঁটাই করে।
শারীরিক ফাইলের শেষে আপনি খালি পৃষ্ঠাগুলি পেতে পারেন যখন আপনি INSERT
একটি ব্যাচ সারি এবং DELETE
অন্যান্য টিপলস যুক্ত হওয়ার আগে সেগুলি থাকে। বা পর্যাপ্ত সারি মুছে ফেলা হলে এটি কাকতালীয়ভাবে ঘটতে পারে।
এছাড়াও এমন বিশেষ সেটিংস রয়েছে যা VACUUM FULL
স্থান পুনরায় দাবি করা থেকে বিরত থাকতে পারে । দেখা:
পরীক্ষার জন্য একটি টেবিলের শেষে খালি পৃষ্ঠা প্রস্তুত করুন
সিস্টেম কলামটি ctid
একটি সারির শারীরিক অবস্থান উপস্থাপন করে। আপনার এই কলামটি বুঝতে হবে:
আমরা এটি নিয়ে কাজ করতে পারি এবং শেষ পৃষ্ঠা থেকে সমস্ত সারি মুছে ফেলে একটি সারণী প্রস্তুত করতে পারি:
DELETE FROM tbl t
USING (
SELECT (split_part(ctid::text, ',', 1) || ',0)')::tid AS min_tid
, (split_part(ctid::text, ',', 1) || ',65535)')::tid AS max_tid
FROM tbl
ORDER BY ctid DESC
LIMIT 1
) d
WHERE t.ctid BETWEEN d.min_tid AND d.max_tid;
এখন, শেষ পৃষ্ঠাটি খালি। এটি সমবর্তী লেখাগুলি উপেক্ষা করে। হয় আপনি কেবলমাত্র সেই টেবিলটিতে লেখালিখি হন বা হস্তক্ষেপ এড়ানোর জন্য আপনাকে লেখার লক নেওয়া দরকার।
কোয়েরিটি যোগ্যতার সারিগুলি দ্রুত সনাক্ত করতে অনুকূলিত হয়েছে। এ এর দ্বিতীয় নম্বরটি tid
হ'ল টিপল সূচকটি স্বাক্ষরবিহীন হিসাবে সঞ্চিত int2
, এবং 65535
এই ধরণের ( 2^16 - 1
) এর জন্য সর্বাধিক , তাই এটি নিরাপদ উপরের সীমানা।
এসকিউএল ফিডল (একটি ভিন্ন কেস থেকে একটি সাধারণ টেবিল পুনরায় ব্যবহার করুন))
সারি / টেবিলের আকার পরিমাপ করার সরঞ্জামগুলি:
পুর্ণ ডিস্ক
এগুলির যে কোনও ক্রিয়াকলাপের জন্য আপনার ডিস্কে উইগল রুম দরকার। / এর pg_repack
প্রতিস্থাপন হিসাবে সম্প্রদায়ের সরঞ্জামও রয়েছে । এটি একচেটিয়া লকগুলি এড়িয়ে যায় তবে পাশাপাশি কাজ করার জন্য বিনামূল্যে স্থান প্রয়োজন। ম্যানুয়াল:VACUUM FULL
CLUSTER
লক্ষ্য ছক (গুলি) এবং সূচকগুলির চেয়ে দ্বিগুণ বড় ফ্রি ডিস্কের স্থান প্রয়োজন।
শেষ অবলম্বন হিসাবে, আপনি একটি ডাম্প / পুনরুদ্ধার চক্র চালাতে পারেন। এটি সারণী এবং সূচিগুলি থেকেও সমস্ত ব্লট সরিয়ে দেয়। ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্ন:
উত্তর সেখানে বেশ মৌলিক হয়। যদি আপনার পরিস্থিতি এটির জন্য অনুমতি দেয় (সারি মোছা রোধে কোনও বিদেশী কী বা অন্যান্য রেফারেন্স নেই), এবং টেবিলের সাথে কোনও একযোগে অ্যাক্সেস নেই) তবে আপনি ঠিক করতে পারেন:
একটি থেকে সংযোগ ডিস্কে টেবিল ডাম্প রিমোট কম্পিউটারের সঙ্গে ডিস্কের স্থান প্রচুর ( -a
জন্য --data-only
):
রিমোট শেল থেকে, টেবিলের ডেটা ডাম্প করুন:
pg_dump -h <host_name> -p <port> -t mytbl -a mydb > db_mytbl.sql
একটি পিজি সেশনে, TRUNCATE
টেবিল:
-- drop all indexes and constraints here for best performance
TRUNCATE mytbl;
রিমোট শেল থেকে, একই টেবিলটিতে পুনরুদ্ধার করুন:
psql -h <host_name> -p <port> mydb -f db_mytbl.sql
-- recreate all indexes and constraints here
এটি এখন কোনও মৃত সারি বা ফোলা থেকে মুক্ত।
তবে আপনি যে সহজ করতে পারেন?
সম্পর্কযুক্ত ফাইলগুলি মুছে (মুভিং) করে আপনি কি ডিস্কে পর্যাপ্ত স্থান তৈরি করতে পারবেন?
আপনি কি VACUUM FULL
একে একে ছোট ছোট টেবিলগুলি এখানে পর্যাপ্ত ডিস্কের জায়গা খালি করতে পারবেন?
আপনি কি ফোলা সূচকগুলি থেকে ডিস্কের স্থান চালাতে REINDEX TABLE
বা REINDEX INDEX
মুক্ত করতে পারেন ?
আপনি যা কিছু করুন, ফুটে উঠবেন না । যদি সন্দেহ হয় তবে প্রথমে সুরক্ষিত স্থানে সবকিছুকে ব্যাকআপ করুন।