PostgreSQL এ কীভাবে ডিস্ক স্পেস পুনরায় দাবি করবেন?


25

আমার কাছে সিটিএর কয়েকটি টেবিলের সাথে 9.1 ডাটাবেসের স্থানীয় ইনস্টলেশন রয়েছে। 300 মিও রেকর্ডস এবং ডাটাবেসটি প্রায় 20 জিবি বেড়েছে এরপরে আমি এ delete fromথেকে সমস্ত রেকর্ড মুছতে কমান্ড জারি করেছি (আমার ব্যবহার করা উচিত ছিল truncate, তবে আমি এটি জানতাম না)। সুতরাং ডিস্কের স্থান পুনরায় দাবি করতে আমি আমার ডিবিতে পূর্ণ শূন্যতা তৈরি করেছিলাম, তবে এটি কোনও সাহায্য করে না। আমার সমস্যাটি এটিকে দেখতে অভিন্ন দেখায় , তবে কোনও সমাধান সরবরাহ করা হয়নি। আমি ইতিমধ্যে এই থ্রেড এবং "ডিস্কের স্থান পুনরুদ্ধার" সংক্রান্ত ডকুমেন্টেশনগুলি যাচাই করেছি , তবে এখনও কোনও সমাধান খুঁজে পাচ্ছি না। আমি সমস্ত টেবিলের আকার পেতে এই কোডটি ব্যবহার করি

 SELECT nspname || '.' || relname AS "relation",
 pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
 FROM pg_class C
 LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
 WHERE nspname NOT IN ('pg_catalog', 'information_schema')
 AND C.relkind <> 'i'
 AND nspname !~ '^pg_toast'
 ORDER BY pg_total_relation_size(C.oid) DESC
 LIMIT 15;

মোট 1 জিবি কম, যদিও

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database 

এখনও প্রায় 20 জিবি দেখায়। কোন পরামর্শ অনেক প্রশংসা।


ঠিক আছে, আপনার আকারের কোয়েরি বাদ দেয়: সূচিপত্র, সারণীসমূহ pg_catalogএবং সারণীসমূহ information_schema। সুতরাং ধারাটিতে থাকা এই বিধিনিষেধগুলি সরিয়ে এটির মধ্যে কিছু কিনা তা দেখার চেষ্টা করুন WHERE। দয়া করে আপনার সঠিক পোস্টগ্রিজ এসকিউএল সংস্করণ ( SELECT version()) এবং আপনি "সম্পূর্ণ ডাটাবেস ভ্যাকুয়াম" করতে হুবহু কী করছেন, অর্থাত্ হুবহু কমান্ডটি প্রদর্শন করুন। যদি সম্ভব হয় তবে চালান VACUUM FULL VERBOSE;(কোনও যুক্তি নেই) এবং আউটপুট কোথাও পেস্ট করুন তবে এটির সাথে এখানে লিঙ্ক করুন।
ক্রেগ রিঞ্জার

ডাটাবেস বাদ দেওয়ার চেষ্টা করুন। আপনি ডাটাবেস ফেলে দেওয়ার চেষ্টা করতে পারেন এবং তারপরে পুনরুদ্ধার করলে আবর্জনা ফেলে দেওয়া হবে।
জেবি।

1
@ জেবি এটি কাজ করবে তবে প্রয়োজনীয় হওয়া উচিত নয়। সমস্যা কী তা শেখা ভাল।
ক্রেগ রিঞ্জার

উত্তর:


22

যদিও আপনি এটি বর্ণনা করেন নি, তবুও আমি আপনার নথিগুলির রেফারেন্স থেকে ধরে নিয়েছি যে আপনি অনুসরণ করেছেন যে আপনি ডাটাবেস এবং / অথবা প্রভাবিত টেবিলগুলিতে ভ্যাকুয়াম ফুল করেছেন। আপনি কোন পোস্টগ্রেকসএল সংস্করণটি ব্যবহার করছেন তাও নির্দিষ্ট করে নি - আমি ধরে নিচ্ছি এটি> 9.0 (ভ্যাকুয়াম সম্পূর্ণ এর আগে অন্যরকম আচরণ করেছে)।

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

ব্যবহারিক, ডাটাবেস পুনরায় চালু করা নিশ্চিত করে যে সমস্ত খোলা ফাইল বন্ধ হয়ে যাবে।

যদি এটি ব্যবহারিক না হয়, তবে আপনি এটি আপনার সমস্যা কিনা তা যাচাই করতে সক্ষম হতে পারেন এবং কোন প্রক্রিয়াটিতে ফাইলগুলি খোলা রয়েছে তা সন্ধান করতে পারবেন।

লিনাক্স (বা অন্যান্য ইউনিক্স-মতো সিস্টেম) ব্যবহার করে আপনি 'lsof' কমান্ড ব্যবহার করে সমস্ত প্রক্রিয়াতে সমস্ত ফাইলের তালিকা খোলা পেতে পারেন। যে ফাইলগুলি উন্মুক্ত রয়েছে তবে যা মুছে ফেলা হয়েছে সেগুলি ফাইলের নামটিতে '(মুছে ফেলা)' যুক্ত হবে। সুতরাং, আপনি মুছে ফেলা ফাইলগুলি সন্ধান করে, lsof এর আউটপুট গ্রেপ করতে পারেন:

sudo lsof -u postgres | grep 'deleted'

যদি এটি এমন প্রক্রিয়াগুলি সনাক্ত করে যেগুলিতে এখনও পুরানো ফাইলগুলি খোলা থাকে, আপনি সেই প্রক্রিয়াটি বন্ধ করতে pg_terminate_backend ব্যবহার করতে পারেন:

SELECT pg_terminate_backend(xxx);

যেখানে এক্সএক্সএক্স, lsof আউটপুটে পাওয়া প্রক্রিয়াটির পিআইডি।

উইন্ডোজ ব্যবহার করা হলে, একই নীতিটি প্রয়োগ করতে পারে, কারণ পোস্টগ্রাইসগুলি FILE_SHARE_DELETE পতাকা ব্যবহার করে ফাইলগুলি খোলে, যা এটি অন্য প্রক্রিয়াতে খোলা ফাইলগুলি মুছতে দেয়। ' হ্যান্ডেল ' কমান্ডটি lsof এর মোটামুটি সমতুল্য, যদিও আমি নিশ্চিত নই যে আপনি ফাইলগুলি মুছে ফেলা হয়েছে কিনা তা নিশ্চিত করতে পারেন যাতে কিছু অতিরিক্ত কাজের প্রয়োজন হতে পারে।

এটি অন্যরকম প্রশ্ন কেন এই জাতীয় প্রক্রিয়াগুলি পুরানো ফাইল হ্যান্ডলগুলিতে ঝুলানো থাকবে। তবে আপনার প্রশ্নের যে সূত্রে আপনি উদ্ধৃত করেছেন তাতে টম লেন বোঝা যাচ্ছে যে এটি ঘটতে পারে।


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

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