আমার কোনও ডিস্কের উপলব্ধ স্থান ছাড়াই ভ্যাকুয়াম ফুল চালানো দরকার


27

আমার কাছে একটি টেবিল রয়েছে যা আমাদের সার্ভারে এইচডি স্থানের 90% স্থান গ্রহণ করে। জায়গা খালি করার জন্য আমি কয়েকটি কলাম ছেড়ে দেওয়ার সিদ্ধান্ত নিয়েছি। তবে আমাকে ওএসে স্থানটি ফিরিয়ে আনতে হবে। যদিও সমস্যাটি হ'ল আমি নিশ্চিত নই যে আমি ভ্যাকুয়াম পুরোপুরি চালাতে পারলে কী হবে এবং টেবিলের অনুলিপি করার মতো পর্যাপ্ত ফাঁকা জায়গা নেই।

আমি বুঝতে পারি যে ভ্যাকুয়াম ফুল ব্যবহার করা উচিত নয় তবে আমি অনুভব করেছি যে এটি এই দৃশ্যের সেরা বিকল্প।

যে কোন ধরণের মতামতকে গুরুত্বসহকারে দেখা হবে।

আমি PostgreSQL 9.0.6 ব্যবহার করছি

উত্তর:


19

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

1 আপনার পোস্টগ্রেকসএল সার্ভারে সমস্ত ডাটাবেস ব্যাকআপ করুন

আপনি আপনার সমস্ত ডাটাবেস একটি পার্টিশনে ব্যাকআপ করতে চান যেখানে পর্যাপ্ত জায়গা রয়েছে। আপনি যদি লিনাক্সে থাকতেন তবে স্থান বাঁচাতে আপনি ব্যাকআপটি আরও সংকুচিত করতে gzip ব্যবহার করতে পারেন

su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz

2 আপনার কনফিগারেশন ফাইলগুলির ব্যাকআপ দিন

cp /path/to/postgresql/data_directory/*.conf /some/partition/

3 পোস্টগ্র্যাস্কিল বন্ধ করুন

pg_ctl -D /path/to/postgresql/data_directory stop

4 ডেটা ডিরেক্টরিগুলির বিষয়বস্তু মুছুন

rm -Rf /path/to/postgresql/data_directory/*

5 আপনার ডেটা ডিরেক্টরিটি নতুন করে তুলতে initdb চালান

initdb -D /path/to/postgresql/data_directory

6 কনফিগারেশন ফাইলগুলি পুনরুদ্ধার করুন

cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf 

7 পোস্টগ্রেস্কল শুরু করুন

pg_ctl -D /path/to/postgresql/data_directory start

8 আপনার তৈরি সমস্ত ডাটাবেসের ডাম্প পুনরুদ্ধার করুন

gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out

1
ধন্যবাদ, এটিই আমি শেষ করেছি, বেশ কয়েকটি পার্থক্য নিয়ে। আমি সবেমাত্র ডাটাবেসটিকে ব্যাক আপ করার পরে ফেলেছি। তারপরে একটি নতুন তৈরি করে পুনরুদ্ধার করুন।
জাস্টিন

আপনাকে স্বাগতম. আমি অনুভব করেছি যে ডেটা ডিরেক্টরিটির বিষয়বস্তুগুলি সরিয়ে এবং ডিডিডিবি করা যথেষ্ট ছিল।
ক্রেগ এফ্রেইন

দুর্দান্ত কাজ করেছেন, gzipসময় বাঁচানোর জন্য আমি কেবল অংশটি এড়িয়ে যাওয়ার পরামর্শ দিই ।
রাফায়েল বারবোসা

17

দ্রষ্টব্য: আমি এটি 9.1 তে পরীক্ষা করেছি। আমার কাছে এখানে 9.0 সার্ভার নেই। আমি প্রীতিতেট্টি নিশ্চিত যদিও এটি 9.0 তে কাজ করবে।


সতর্কতা (@ আর্নির মন্তব্যে যেমন উল্লেখ করা হয়েছে):

Note that high CPU load due to I/O operations may be expected.

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

তবে সচেতন হওয়ার জন্য একটি বিষয় হ'ল, টেবিলটি সরিয়ে ফেলতে এবং ভ্যাকুয়াম পূর্ণ পূর্ণ করার জন্য প্রথমে তাদের প্রথমে একটি এক্সক্লুসিভ লকের জন্য অপেক্ষা করতে হবে!


প্রথমত, আপনাকে অবশ্যই কিছু অতিরিক্ত সঞ্চয় প্রয়োজন। Stéphaneমন্তব্যে যেমন উল্লেখ করা হয়েছে, এটি VACUUM FULLসম্পূর্ণ অনুলিপি হিসাবে প্রশ্নের টেবিলের চেয়ে কমপক্ষে দ্বিগুণ হওয়া দরকার। আপনি ভাগ্যবান এবং মেশিনে গতিশীলভাবে একটি ডিস্ক যোগ করতে পারেন, এটি করুন। সবচেয়ে খারাপ ক্ষেত্রে আপনি কেবল একটি ইউএসবি ডিস্ক সংযুক্ত করতে পারেন (ঝুঁকিপূর্ণ এবং যদিও ধীর)!

এর পরে, নতুন ডিভাইসটি মাউন্ট করুন এবং এটি টেবিলস্পেস হিসাবে উপলব্ধ করুন:

CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';

আপনি টেবিল স্পেসগুলি সহজেই ব্যবহার করে তালিকাভুক্ত করতে পারেন:

\db

আপনার টেবিলের বর্তমান টেবিল স্পেসটি পুনরায় পরীক্ষা করুন (এটি কোথায় ফিরে যেতে হবে তা আপনার জানতে হবে):

SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';

যদি এটি হয় তবে এটি NULLডিফল্ট টেবিল স্পেসে থাকবে:

SHOW default_tablespace;

তাহলে যে হয় NULLপাশাপাশি এটি সম্ভবত হতে হবে pg_default(চেক সরকারী দস্তাবেজ ক্ষেত্রে এটি পরিবর্তন হয়েছে)।

এখন টেবিলটি সরান:

ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT;  -- if autocommit is off

এটি ভ্যাকুয়াম:

VACUUM FULL mytable;

এটি আবার সরান:

-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT;  -- if autocommit is off

অস্থায়ী স্থান সরান:

DROP TABLESPACE tempspace;

নোট: এই পদক্ষেপটি মূল ডেটা ডিরেক্টরিতে আরও বেশি ডিস্কের জায়গা ব্যবহার করে ...
ক্রিস উইথারস

মাত্র 9.3 এ এটি পরীক্ষা করেছে এবং এটি কবজির মতো কাজ করে।
বারটেক জাবলোনস্কি

9.1. এ সফলভাবে উত্পাদনে ব্যবহৃত হয়েছে। টেবিলস্পেস পরিবর্তনের পরে আসল ব্যবহৃত স্থানটি ছেড়ে দেওয়া হবে। নোট করুন যে I / O অপারেশনগুলির কারণে উচ্চ সিপিইউ লোড আশা করা যেতে পারে।
erny

2
আশ্চর্যজনক টিপস, এই বিশদ ব্যাখ্যার জন্য ধন্যবাদ। নোট করুন যে অস্থায়ী টেবিল স্পেসে আপনার কমপক্ষে দরকার হবে size of table x 2, যেহেতু VACUUM FULLসারণীর সম্পূর্ণ অনুলিপি তৈরি করছেন।
স্টাফেন

ধন্যবাদ @ স্টাফেন আমি মূল শরীরের সাথে তথ্য যুক্ত।
এক্সহুমা

2

দ্রুত এবং ময়লা:

  • পোস্টগ্রিস বন্ধ করুন
  • মূল ডাটাবেস ডিরেক্টরিটি অন্য ডিস্কে নিয়ে যান যেখানে শূন্যতার জন্য পর্যাপ্ত জায়গা রয়েছে
  • মূলের মূল অবস্থানটিতে, নতুন অবস্থানে একটি সিমিলিংক যুক্ত করুন
  • শূন্যস্থান
  • সিমলিংক মুছুন এবং মূল ডিরেক্টরিটিকে তার মূল স্থানে ফিরিয়ে আনুন
  • পোস্টগ্রিস শুরু করুন

যেমন ,:

$ service postgresql stop $ mv /var/lib/postgresql/9.5/main /mnt/bigdisk $ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5 $ vacuumdb --all --full $ rm /var/lib/postgresql/9.5/main $ mv /mnt/bigdisk/main /var/lib/postgresql/9.5 $ service postgresql start


0

আপনার যদি ডাম্প করার ও পুনরুদ্ধার করার জন্য ডিস্কের স্থান থাকে তবে আপনার একটি ভ্যাকুয়ামডবি - সম্পূর্ণ করতে ডিস্কের স্থান থাকা উচিত। সমস্যাটি হ'ল ভ্যাকুয়ামডবি - পুরো সম্পূর্ণ ডেটা ফাইলের একটি অনুলিপি তৈরি করবে। সুতরাং, আপনি যা করতে পারেন তা হ'ল:

  1. বিশাল টেবিলকে একটি আলাদা ড্রাইভে রাখা ফাইলগুলি অনুলিপি করুন, উদাহরণস্বরূপ, একটি ধীর, বড় ড্রাইভ।
  2. মূল ড্রাইভ থেকে অন্য ড্রাইভে নতুন জায়গায় প্রতীকী লিঙ্কগুলি তৈরি করুন।
  3. ভ্যাকুয়ামডবি - পুরো চালান, এখন এটি অন্য ডিস্ক থেকে ডেটা পড়তে হবে এবং আপনার মূল ডেটা ডিস্কে চূড়ান্ত টেবিলটি লেখা উচিত।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.