আমি এটিকে 2010 সালের অক্টোবরে স্ট্যাকওভারফ্লোতে সম্বোধন করেছি ।
InnoDB অবকাঠামোতে ব্যস্ততম ফাইলটি মনে রাখবেন: / var / lib / mysql / ibdata1
এই ফাইলটিতে সাধারণত চার ধরণের তথ্য থাকে
- সারণী ডেটা
- সারণী সূচি
- এমভিসিসি (মাল্টিভিশনিং কনকুরেন্সি নিয়ন্ত্রণ) ডেটা
- সারণী মেটাডেটা (টেবিলস্পেস আইডির তালিকা)
OPTIMIZE TABLE
ইবদাটা ১ তে সঞ্চিত ইনোডিবি টেবিলের বিরুদ্ধে চালানো দুটি জিনিস করে:
- টেবিলের ডেটা এবং সূচিগুলিকে আইবিডাটা 1-এর সাথে সামঞ্জস্যপূর্ণ করে তোলে, এইভাবে অ্যাক্সেস করা দ্রুত faster
- এটি আইবডাটা 1টিকে বাড়িয়ে তোলে কারণ অবিচ্ছিন্ন ডেটা এবং সূচী পৃষ্ঠাগুলি আইবডাটা 1-এ যুক্ত হয়েছে
আপনি যখন ইবদাটা 1 থেকে সারণী ডেটা এবং সারণী সূচীগুলি আলাদা করতে পারেন এবং সেগুলি ইনডোডবি_ফাইলে_পিটার টেবিল ব্যবহার করে স্বতন্ত্রভাবে পরিচালনা করতে পারেন , তবে ইবদাটা 1-এ ডিস্কস্পেসের বড় ব্যবধানটি কেবল বিচ্ছিন্ন হবে না এবং পুনরুদ্ধার করা যাবে না। আপনার অবশ্যই আরও কিছু করা উচিত।
ইবদাতা 1 একবার সঙ্কুচিত করার জন্য আপনাকে নিম্নলিখিতগুলি করতে হবে:
1) মাইএসকিউএলএক এসকিউএল পাঠ্য ফাইলে সমস্ত ডাটাবেস ড্যাম্প করুন (এটিকে /root/SQLData.sql কল করুন)
2) সমস্ত ডাটাবেস ফেলে দিন (মাইএসকিএল স্কিমা ব্যতীত)
3) শাটডাউন মাইএসকিএল
4) নিম্নলিখিত লাইনগুলি /etc/my.cnf এ যুক্ত করুন
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
সিডিনোট: ইনোডাব_ফুফার_পুল_সাইজের জন্য আপনার সেট যাই হোক না কেন, নিশ্চিত করুন যে ইনোডাব_লগ_ফিল_সাইজ ইনোডাব_বফার_পুল_সাইজের 25%।
5) আইবডাটা 1, ইব_লগফিল 0 এবং আইব_লগফাইল 1 মুছুন
এই মুহুর্তে, কেবলমাত্র / var / lib / mysql তে মাইএসকিএল স্কিমা থাকা উচিত
6) মাইএসকিএল পুনরায় চালু করুন
এটি ইবদাটা 1 পুনরায় 10 বা 18 এমবি (মাইএসকিউএল এর সংস্করণ অনুসারে), আই_ব্লগফিলি 0 এবং আইবি_লগফাইল 1 প্রতিটি 1 জি তে পুনরায় তৈরি করবে
7) মাইএসকিএলে পুনরায় লোড / রুট / এসকিউএলডাটা.এসকিউএল
আইবডাটা 1 বৃদ্ধি পাবে তবে কেবল টেবিল মেটাডেটা থাকে। আসলে, কয়েক বছর ধরে এটি খুব ধীরে ধীরে বৃদ্ধি পাবে। আপনার যদি নিম্নলিখিতগুলির এক বা একাধিকটি থাকে তবে দ্রুত ইবদাতা 1 দ্রুত বৃদ্ধির একমাত্র উপায়:
- DDL অনেক (
CREATE TABLE
, DROP TABLE
, ALTER TABLE
)
- প্রচুর লেনদেন
- প্রতি লেনদেনে প্রতিশ্রুতিবদ্ধ করতে প্রচুর পরিবর্তন
প্রতিটি InnoDB টেবিল ইবদাটা 1 এর বাইরে থাকবে
মনে করুন আপনার কাছে একটি আইএনডিবিবি টেবিল আছে যার নাম mydb.mytable। আপনি যদি / var / lib / mysql / mydb এ যান তবে আপনি টেবিলের প্রতিনিধিত্বকারী দুটি ফাইল দেখতে পাবেন
- mytable.frm (স্টোরেজ ইঞ্জিন শিরোনাম)
- mytable.ibd (টেবিল ডেটা এবং mydb.mytable জন্য সারণী সূচীর হোম)
আইবডাটা 1-এ আর কখনও ইনোডিবি ডেটা এবং সূচি থাকবে না।
/Etc/my.cnf- এ ইনোডোবি_ফাইলে_পিটার / টেবিল বিকল্পের সাহায্যে আপনি চালাতে পারবেন OPTIMIZE TABLE mydb.mytable;
এবং ফাইল /var/lib/mysql/mydb/mytable.ibd আসলে সঙ্কুচিত হবে।
আমি আমার কেরিয়ারে মাইএসকিউএল ডিবিএ হিসাবে অনেকবার এটি করেছি
আসলে, আমি প্রথমবার এটি করার পরে, আমি একটি 50 জিবি ইবদাতা 1 ফাইলটি 500 এমবিতে ভেঙে ফেলেছি।
একবার চেষ্টা করে দেখো. আপনার যদি এই বিষয়ে আরও প্রশ্ন থাকে তবে আমাকে ইমেল করুন। আমাকে বিশ্বাস কর. এটি স্বল্পমেয়াদে এবং দীর্ঘ মেয়াদে কাজ করবে !!!
আপডেট 2012-04-19 09:23 ইডিটি
উপরের পদক্ষেপগুলি চালনার পরে, আপনি কীভাবে সারণিগুলি ডিফ্র্যাগমেন্টেশন করা দরকার তা কীভাবে নির্ধারণ করতে পারেন? এটি সন্ধান করা সম্ভব তবে আপনার এটির স্ক্রিপ্ট থাকবে।
এখানে একটি উদাহরণ দেওয়া আছে: ধরুন আপনি টেবিলটি রেখেছেন mydb.mytable
। ইনোডাব_ফিল_পিটার_সামগ্রী সক্ষম করার সাথে আপনার /var/lib/mysql/mydb/mytable.ibd ফাইলটি রয়েছে
আপনাকে দুটি সংখ্যা পুনরুদ্ধার করতে হবে
ওএস থেকে ফাইলসাইজ করুন: আপনি ওএস থেকে ফাইলসাইজ নির্ধারণ করতে পারেন
ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print $5}'
তথ্য থেকে ফাইল ফাইল করুন: আপনি এই জাতীয় তথ্য_সেমিমা থেকে ফাইলাইজগুলি সনাক্ত করতে পারেন।
SELECT (data_length+index_length) tblsize FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable';
ওএস মান থেকে কেবল INFORMATION_SCHEMA মান বিয়োগ করুন এবং INFORMATION_SCHEMA মান দ্বারা পার্থক্যটি ভাগ করুন।
সেখান থেকে আপনি সিদ্ধান্ত নেবেন যে টেবিলটি ডিফ্র্যাগ করার জন্য কোন শতাংশ প্রয়োজনীয় বলে মনে করছেন। অবশ্যই, আপনি নিম্নলিখিত কমান্ডগুলির একটি ব্যবহার করে এটিকে ডিফ্র্যাগ করেছেন:
OPTIMIZE TABLE mydb.mytable;
অথবা
ALTER TABLE mydb.mytable ENGINE=InnoDB;