মাইএসকিউএল InnoDB টেবিল থেকে ডেটা সারি মুছার পরে ডিস্কের স্থান ছাড়ছে না


140

InnoDB স্টোরেজ ইঞ্জিন ব্যবহার করে আমার কাছে একটি মাইএসকিউএল টেবিল রয়েছে; এতে প্রায় 2M ডাটা সারি রয়েছে। আমি যখন টেবিল থেকে ডেটা সারিগুলি মুছলাম, এটি বরাদ্দ হওয়া ডিস্কের স্থান ছাড়েনি। optimize tableকমান্ড চালানোর পরেও ইবদাটা 1 ফাইলের আকার হ্রাস পায় নি ।

মাইএসকিউএল থেকে ডিস্কের স্থান দাবি করার কোনও উপায় আছে কি?

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


অপ্টিমাইজ কমান্ড চালানোর পরেও, আইবডাটা 1 ফাইলের আকার হ্রাস পায় নি।
সুমিত দেও

4
আমি মনে করি যে মন্তব্যটি আপনার উত্তরে আরও ভালভাবে সম্পাদিত হবে, এবং তারপরে মুছে ফেলা হবে
বেন মিলউড

সম্ভাব্য সদৃশ stackoverflow.com/q/11751792/82114 (কিন্তু এই এক প্রথম এখানে ছিল)
FlipMcF

1
"অপ্টিমাইজ টেবিল কমান্ড চালানোর পরেও আইবডাতা 1 ফাইলের আকার হ্রাস পায়নি" কারণ এটি আপনার innodb_file_per_tableবন্ধ রয়েছে। সুসংবাদটি হ'ল এই বিকল্পটি onমাইএসকিউএল এর সাম্প্রতিক সংস্করণগুলিতে ডিফল্টরূপে।
হিসাবরক্ষক

আমি "অপ্টিমাইজ টেবিল এক্সএক্সএক্সএক্সএক্সএক্স" চালিয়েছি এবং বার্তাটি পেয়েছি "টেবিলটি অনুকূলিতকরণ সমর্থন করে না, পরিবর্তে পুনরায় তৈরি করুন + বিশ্লেষণ করুন" " এরপরে একটি শেলের উপর "du -h / var / lib / mysql" চালানোর পরে আমি দেখতে পেলাম যে ডাটাবেস সঙ্কুচিত হয়ে গেছে।
ব্যবহারকারীর 1097111

উত্তর:


137

মাইএসকিউএল ইবদাটা 1 এর আকার হ্রাস করে না। কখনো। এমনকি যদি আপনি optimize tableমুছে ফেলা রেকর্ডগুলি থেকে ব্যবহৃত স্থানটি মুক্ত করতে ব্যবহার করেন তবে এটি এটি পরে পুনরায় ব্যবহার করবে।

বিকল্পটি হ'ল সার্ভারটি ব্যবহারের জন্য কনফিগার করা তবে এটির জন্য innodb_file_per_tableএকটি ব্যাকআপ, ড্রপ ডাটাবেস এবং পুনরুদ্ধার প্রয়োজন। ইতিবাচক দিকটি হ'ল টেবিলের জন্য .ibd ফাইলটি একটির পরে হ্রাস করা হয় optimize table


4
ইনোডিবি ফাইল-প্রতি-সারণী মোডের বিষয়ে মাইএসকিউএল 5.5 ডক্স "বিদ্যমান সারণীর জন্য [ইনোডিবি ফাইল-প্রতি-সারণী] বৈশিষ্ট্যগুলির সুবিধা নিতে, আপনি ফাইল-প্রতি-সারণি সেটিংটি চালু ALTER TABLE t ENGINE=INNODBকরতে এবং বিদ্যমান টেবিলটিতে চালাতে পারেন । " এটি বোঝায় যে আপনি এই বৈশিষ্ট্যটি চালু করতে পারবেন, বিদ্যমান টেবিলগুলিকে ALTER TABLE কমান্ডের সাহায্যে পৃথক InnoDB ফাইল ব্যবহার করতে, তার আকারটি সঙ্কুচিত করার জন্য টেবিলটি অপ্টিমাইজ করতে পারেন। তবে, একবার হয়ে গেলে আপনি কীভাবে (বিশাল) উত্স ইনোডিবি ফাইলটি মুছবেন তা বের করতে হবে ...
জোশ

9
আমি ধারণা করি এটি প্রযুক্তিগতভাবে প্রশ্নের উত্তর দিয়েছে তবে আমি আশা করব যে এই বিষয়টির সন্ধানকারী সংখ্যাগরিষ্ঠ লোকেরা প্রকৃত প্রক্রিয়াটি সঙ্কুচিত / পুনরুদ্ধার করার জন্য স্থানটি খুঁজছেন যা এই উত্তর সরবরাহ করে না।
মানচি

@ মানাচি প্রক্রিয়াটি হ'ল "সার্ভারটিকে ইনডোডবি_ফিল_পিটার টেবিল ব্যবহার করার জন্য কনফিগার করুন", "ব্যাকআপ" সার্ভারটি, "ডাটাবেস (গুলি) ফেলে দিন", মাইএসকিএল বন্ধ করুন, .আইবিডি মুছে দিন, সার্ভারটি শুরু করুন এবং ডাটাবেসগুলি পুনরুদ্ধার করুন। মাইএসকিউএল 5.5+ এর সাহায্যে আপনি জোশ যা বলেছিলেন তা ব্যবহার করতে পারেন এবং সমস্ত সারণী পরিবর্তন করার পরে সার্ভারটি বন্ধ করুন, বিশাল .ibd মুছুন এবং আবার এটি শুরু করুন।
লিওনেল মার্টিনস

39

শুধু আমার একই সমস্যা ছিল।

যা ঘটে তা হ'ল, যদি আপনি ডাটাবেসটি ফেলে রাখেন, তবে ইনডোডাব এখনও ডিস্কের স্থান ছাড়বে না। আমাকে রফতানি করতে হয়েছিল, মাইএসকিএল বন্ধ করতে হবে, নিজে ফাইলগুলি সরিয়ে ফেলতে হয়েছিল, মাইএসকিএল শুরু করতে হয়েছিল, ডাটাবেস এবং ব্যবহারকারী তৈরি করতে হয়েছিল এবং তারপরে আমদানি করতে হয়েছিল। Godশ্বরের ধন্যবাদ আমার কাছে কেবল 200MB মূল্য সারি ছিল, তবে এটি 250 গিগাবাইট ইনোডাব ফাইলটি ছাড়েনি।

ডিজাইন দ্বারা ব্যর্থ।


10
হ্যাঁ, এটি অবশ্যই একটি ব্যর্থ
trusktr

1
মাইএসকিউএল 5.5 এর একই সমস্যা রয়েছে: আমি একটি 28 জিবি টেবিলের ডিস্কের ব্যবহার হ্রাস করতে "অনুকূলিতকরণ টেবিল" দৌড়েছি। অপারেশনটি সম্ভবত আসলটির একটি অনুকূলিত ক্লোন তৈরি করার চেষ্টা করেছিল এবং পার্টিশনের সমস্ত স্থান ব্যবহার করে। এখন "টেবিলটি অপ্টিমাইজ করুন" ব্যর্থ হয়েছে এবং আমি পুরো ডিবি বাদ দেওয়ার পরেও পার্টিশনের কোনও জায়গা ছাড়ছি না ... খুব হতাশাব্যঞ্জক।
বাসিলিকোড

1
এবং 4+ বছর পরে আমি মাইএসকিউএল নিয়ে একই সমস্যায় পড়েছি। এমএস এসকিউএল অনুরূপ: dba.stackexchange.com/questions/47310/…
সিসাবা টথ

24

যদি আপনি ইনডোডবি_ফিল_পিটার_ টেবিলটি ব্যবহার না করেন তবে ডিস্কের জায়গাটি পুনরুদ্ধার করা সম্ভব তবে যথেষ্ট ক্লান্তিকর এবং এর জন্য উল্লেখযোগ্য পরিমাণ ডাউনটাইম প্রয়োজন।

কিভাবে চমত্কার গভীর - কিন্তু আমি নীচে প্রাসঙ্গিক অংশ আটকানো হয়েছে।

আপনার ডাম্পে আপনার স্কিমাটির একটি অনুলিপিও বজায় রাখতে ভুলবেন না।

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

আপনার সমস্ত InnoDB টেবিল ডাম্প করতে mysqldump ব্যবহার করুন।

সার্ভারটি বন্ধ করুন।

ইবদাটা এবং আইবি_লগ ফাইল সহ সমস্ত বিদ্যমান টেবিলস্পেস ফাইলগুলি সরান। আপনি যদি তথ্যের একটি ব্যাকআপ কপি রাখতে চান, তবে আপনার মাইএসকিউএল ইনস্টলেশনের ফাইলগুলি অপসারণের আগে সমস্ত আইবি * ফাইলগুলি অন্য কোনও স্থানে অনুলিপি করুন।

InnoDB টেবিলের জন্য কোনও .frm ফাইল সরান।

একটি নতুন টেবিল স্পেস কনফিগার করুন।

সার্ভারটি পুনরায় চালু করুন।

ডাম্প ফাইলগুলি আমদানি করুন।


পদক্ষেপগুলি অন্তর্ভুক্ত করার জন্য ধন্যবাদ - 'কীভাবে' লিঙ্কটিতে আর এই তথ্য থাকে না
আফ্রিকা

3

দশ বছর পরে এবং আমারও একই সমস্যা হয়েছিল। আমি এটি নিম্নলিখিত উপায়ে সমাধান করেছি:

  • আমি সমস্ত ডাটাবেস অপ্টিমাইজড।
  • আমি পরিষেবাগুলিতে আমার কম্পিউটার এবং মাইএসকিউএল পুনরায় চালু করেছি (উইন্ডোজ + আর -> পরিষেবাদি.এমএসসি)

এটাই সব :)


1

স্থান পুনরুদ্ধারের সমস্যা সমাধানের অন্যান্য উপায় হ'ল, টেবিলের মধ্যে একাধিক পার্টিশন তৈরি করুন - রেঞ্জ ভিত্তিক, মান ভিত্তিক পার্টিশন এবং স্পেসটি পুনরুদ্ধারের জন্য পার্টিশনটি কেবল ড্রপ / কাটুন, যা নির্দিষ্ট পার্টিশনে সংরক্ষিত পুরো ডেটা দ্বারা ব্যবহৃত স্থানটি প্রকাশ করবে।

আপনি যখন টেবিলের জন্য পার্টিশনটি চালু করতে চান যেমন - অনন্য কী, পার্টিশন কলাম অন্তর্ভুক্ত করার সূচী ইত্যাদি যখন টেবিল স্কিমাতে কিছু পরিবর্তন প্রয়োজন will


0

বছর আগের আমি মাইএসকিএল 5.7 সংস্করণেও একই সমস্যার মুখোমুখি হয়েছি এবং আইবডাটা 1 150 জিবি দখল করেছে। সুতরাং আমি পূর্বাবস্থায়িত টেবিল স্পেস যুক্ত করেছি

মাইসকিলডাম্প ব্যাকআপ নিন মাইএসকিএল
পরিষেবা বন্ধ করুন
ডেটা ডায়ার থেকে সমস্ত ডেটা সরিয়ে ফেলুন
বর্তমান মাই সিএনএফ-তে টেবিলস্পেসের পূর্বাবস্থা পূর্বাবস্থায় ফেরা করুন নীচে যুক্ত করুন

 #undo tablespace
  innodb_undo_directory =  /var/lib/mysql/
  innodb_rollback_segments = 128 
  innodb_undo_tablespaces = 3
  innodb_undo_logs = 128  
  innodb_max_undo_log_size=1G
  innodb_undo_log_truncate = ON


মাইএসকিএল পরিষেবা স্টোর মাইএসকিএলডাম্প ব্যাকআপ শুরু করুন

সমস্যা সমাধান !!


-1

মাইএসকিউএল ইনডাব ইঞ্জিনের জন্য টেবিল থেকে ডেটা মুছার পরে ডিস্কস্পেস পুনরায় দাবি করার বিভিন্ন উপায় রয়েছে

আপনি যদি শুরু থেকে ইনেডোবি_ফাইলে_ টেবিলটি ব্যবহার না করেন, সমস্ত ডেটা ডাম্পিং করে, সমস্ত ফাইল মুছে ফেলুন, ডাটাবেসটি পুনরায় তৈরি করুন এবং ডেটা আমদানি করা কেবল একমাত্র উপায় (উপরে ফ্লিপএমসিএফের উত্তরগুলি দেখুন)

আপনি যদি ইনডোডবি_ফাইলে_পার_সেবিকা ব্যবহার করেন তবে আপনি চেষ্টা করতে পারেন

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