অপারেটিং সিস্টেমে ভ্যাকুয়াম ডিস্কের স্থান ফিরিয়ে দিচ্ছে


21

VACUUMকিছু বিশেষ ক্ষেত্রে বাদে সাধারণত ডিস্কের স্থান অপারেটিং সিস্টেমে ফিরিয়ে দেয় না।
দস্তাবেজগুলি থেকে:

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

প্রশ্নটি হল: এই ডাটাবেসটি কীভাবে one or more pages at the end of a table become entirely freeঅর্জন করা যায়? এটি মাধ্যমে করা যেতে পারে VACUUM FULL, তবে এটি বাস্তবায়নের মতো পর্যাপ্ত জায়গা আমি পাই নি। তাহলে কি আর কোন সম্ভাবনা আছে?

উত্তর:


29

ওএসে স্থান ফেরাতে, ব্যবহার করুন 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 FULLCLUSTER

লক্ষ্য ছক (গুলি) এবং সূচকগুলির চেয়ে দ্বিগুণ বড় ফ্রি ডিস্কের স্থান প্রয়োজন।

শেষ অবলম্বন হিসাবে, আপনি একটি ডাম্প / পুনরুদ্ধার চক্র চালাতে পারেন। এটি সারণী এবং সূচিগুলি থেকেও সমস্ত ব্লট সরিয়ে দেয়। ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্ন:

উত্তর সেখানে বেশ মৌলিক হয়। যদি আপনার পরিস্থিতি এটির জন্য অনুমতি দেয় (সারি মোছা রোধে কোনও বিদেশী কী বা অন্যান্য রেফারেন্স নেই), এবং টেবিলের সাথে কোনও একযোগে অ্যাক্সেস নেই) তবে আপনি ঠিক করতে পারেন:

একটি থেকে সংযোগ ডিস্কে টেবিল ডাম্প রিমোট কম্পিউটারের সঙ্গে ডিস্কের স্থান প্রচুর ( -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মুক্ত করতে পারেন ?

আপনি যা কিছু করুন, ফুটে উঠবেন না । যদি সন্দেহ হয় তবে প্রথমে সুরক্ষিত স্থানে সবকিছুকে ব্যাকআপ করুন।


এরউইন, দুঃখিত, আমি উল্লেখ করতে ভুলে গেছি যে শূন্যতার জন্য আমার পর্যাপ্ত জায়গা নেই। প্রশ্ন আপডেট করেছেন।
ভুল-সম্পর্কে-সবকিছু

@ জাপাডলো: আমি আপডেট হওয়া প্রশ্নের জন্য একটি অধ্যায় যুক্ত করেছি।
এরউইন ব্র্যান্ডসেটেটার

ব্যাপক উত্তরের জন্য ধন্যবাদ। আসলে আমি ভেবেছিলাম যে আমি নকল আপডেটের মাধ্যমে ডিবি পৃষ্ঠাগুলির শেষে মরা সারি রাখতে পারি, অর্থাত্ update table set field_1 = field_1, তবে সেই অপারেশনটির পরে সেই টেবিলটি শূন্য করে ফাঁকা স্থান ফিরে আসতে ব্যর্থ হয়েছিল, কোনও ধারণা?
ভুল সম্পর্কে সব কিছু

@ জাপাডলো: আমার যে ধারণাগুলি ছিল তা ইতিমধ্যে উত্তরে রয়েছে। :) আমি এমন কোনও সরঞ্জাম জানি না যা ডিস্কে যথেষ্ট উইগল রুমের প্রয়োজন ছাড়াই মৃত টুপলগুলি পুনরায় অর্ডার করতে পারে। (এর অর্থ এই নয় যে সেখানে এক হতে পারে না))
এরউইন ব্র্যান্ডসেটেটার

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