InnoDB এর আর্কিটেকচারটি চারটি মূল ধরণের তথ্য পৃষ্ঠা ব্যবহার করার দাবি জানিয়েছে
- সারণী ডেটা পৃষ্ঠা
- সারণী সূচী পৃষ্ঠা
- টেবিল মেটাডেটা
- এমভিসিসি ডেটা (লেনদেনের বিচ্ছিন্নতা এবং এসিডি সম্মতি সমর্থন করার জন্য)
- রোলব্যাক সেগমেন্টস
- স্পেসটি পূর্বাবস্থায় ফেরান
- ডাবল রাইট বাফার (ওএস ক্যাশে নির্ভরতা রোধ করতে পটভূমি রচনা)
- বাফার sertোকান (অ-অনন্য মাধ্যমিক সূচকগুলিতে পরিবর্তনগুলি পরিচালনা করা)
ইবদাটা 1 এর চিত্রের উপস্থাপনা দেখুন
ডিফল্টরূপে, ingodb_file_per_table অক্ষম করা আছে। এটি চারটি তথ্য পৃষ্ঠার প্রকারকে ইবদাটা 1 নামে একটি একক ফাইলের অবতরণ করতে বাধ্য করে। অনেকে একাধিক ইবদাটা ফাইল তৈরি করে ডেটা ছড়িয়ে দেওয়ার চেষ্টা করেন। এটি ডেটা এবং সূচী পৃষ্ঠাগুলির বিভাজন হতে পারে।
এ কারণেই আমি প্রায়শই ইনোডিবি অবকাঠামো পরিষ্কার করার পরামর্শ দিই , ডিফল্ট আইবডাটা 1 ফাইল এবং আরও কিছু না ।
অন্নডিবির কাজ করে এমন অবকাঠামোর কারণে অনুলিপি করা খুব বিপজ্জনক। দুটি বেসিক অবকাঠামো রয়েছে
- ইনোডব_ফাইল_পার_সচেতন অক্ষম
- ইনোডব_ফায়াল_পার_সামগ্রী সক্ষম
সঙ্গে innodb_file_per_table অক্ষম করা হলে, InnoDB তথ্য এই সব ধরনের ibdata1 মধ্যে বাস করে। আইবডাতা 1 এর বাইরে কোনও ইনোডিবি টেবিলের একমাত্র প্রকাশ হ'ল ইনোডিবি টেবিলের .frm ফাইল। সমস্ত InnoDB ডেটা একবারে অনুলিপি করার জন্য সমস্ত / var / lib / mysql এর অনুলিপি করতে হবে।
একটি পৃথক InnoDB টেবিল অনুলিপি করা সম্পূর্ণ অসম্ভব। ডেটা এবং তার সাথে সম্পর্কিত সূচক সংজ্ঞাগুলির যৌক্তিক উপস্থাপনা হিসাবে টেবিলের একটি ডাম্প বের করতে আপনাকে অবশ্যই মাইএসকিউএল ডাম্প করতে হবে। আপনি সেই ডাম্পটিকে একই সার্ভার বা অন্য সার্ভারের অন্য একটি ডাটাবেসে লোড করতে পারেন।
সঙ্গে innodb_file_per_table সক্ষম করা থাকে, টেবিল তথ্য এবং তার ইনডেক্স .frm ফাইল পাশে ডাটাবেসের ফোল্ডারের বাস। উদাহরণস্বরূপ, db1.mytable টেবিলের জন্য, ইবদাটা 1 এর বাইরের সেই InnoDB টেবিলের প্রকাশটি হবে:
/var/lib/mysql/db1/mytable.frm
/var/lib/mysql/db1/mytable.ibd
সিস্টেম টেবিলস্পেস ibdata1
Db1.mytable এর জন্য সমস্ত মেটাডেটা এখনও ইবদাটা 1 তে থাকে এবং এর আশেপাশে কোনও উপায় নেই । পুনরায় লগগুলি এবং এমভিসিসির ডেটাগুলি এখনও ইবদাটা 1 দিয়ে লাইভ করে।
যখন টেবিলের খণ্ড খণ্ডনের বিষয়টি আসে তখন ইবদাটা 1 এর সাথে কী ঘটে:
- innodb_file_per_table সক্ষম : আপনি db1.mytables
ALTER TABLE db1.mytable ENGINE=InnoDB;
বাসংক্ষিপ্ত করতে পারেনOPTIMIZE TABLE db1.mytable;
। /Var/lib/mysql/db1/mytable.ibd এর ফলস্বরূপ শারীরিকভাবে কোনও খণ্ডন ছাড়াই ছোট।
- innodb_file_per_table অক্ষম : আপনার সাথে db1.mytables সঙ্কুচিত করতে পারবে না
ALTER TABLE db1.mytable ENGINE=InnoDB;
বাOPTIMIZE TABLE db1.mytable;
কারণ এটি ibdata1 ওপরেই থাকে। কমান্ডটি আসলে চালানো, সারণীটিকে স্বতঃস্ফূর্ত এবং আরও দ্রুত এবং পড়তে লিখুন make দুর্ভাগ্যক্রমে, এটি ইবদাটা 1 এর শেষে ঘটে। এটি আইবডটা 1 দ্রুত বাড়ায়। এটি আমার ইনোডিবি ক্লিনআপ পোস্টে সম্পূর্ণরূপে সম্বোধন করা হয়েছে ।
আপনি যদি কেবল .frm এবং .ibd ফাইলটি অনুলিপি করার কথা ভাবছেন, তবে আপনি আঘাতের জগতের পক্ষে রয়েছেন। InnoDB টেবিলের .frm এবং .ibd ফাইলটি অনুলিপি করা কেবলমাত্র তখনই ভাল এবং কেবলমাত্র যদি আপনি গ্যারান্টি দিতে পারেন যে আইবিডিটা 1 ফাইলের মেটাডেটাতে টেবিলস্পেস আইডি প্রবেশের সাথে .ibd ফাইলের টেবিলস্পেস আইডিটি ঠিক মেলে ।
আমি এই টেবিলস্পেস আইডি ধারণাটি সম্পর্কে ডিবিএ স্ট্যাকএক্সচেঞ্জে দুটি পোস্ট লিখেছি
: এখানে কিভাবে মেলেনি tablespace- র আইডি ঘটনা ibdata1 কোনো .ibd ফাইলটি সংযুক্ত করতে উপর একটি চমৎকার লিঙ্ক http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file । এটি পড়ার পরে, আপনার অবিলম্বে উপলব্ধি হওয়া উচিত যে .bd ফাইলগুলি অনুলিপি করা কেবল সহজ পাগল।
InnoDB- র জন্য আপনার কেবল কিছু সরানো দরকার
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
একটি InnoDB টেবিলের একটি অনুলিপি তৈরি করতে।
আপনি যদি এটি অন্য ডিবি সার্ভারে স্থানান্তর করে থাকেন তবে মাইএসকিএলডাম্প ব্যবহার করুন।
সমস্ত ডাটাবেস থেকে সমস্ত InnoDB সারণী মিশ্রনের বিষয়ে, আমি আসলে এটি করার বুদ্ধি দেখতে পাচ্ছি। আমার নিয়োগকর্তার ডিবি / ওয়েব হোস্টিং সংস্থায় আমার একটি মাইএসকিউএল ক্লায়েন্ট রয়েছে যার একটি ডাটাবেসে একটি টেবিল রয়েছে যার সীমাবদ্ধতা একই মাইএসকিউএল উদাহরণের মধ্যে অন্য ডাটাবেসে অন্য টেবিলে ম্যাপ করা হয়। একটি সাধারণ মেটাডেটা সংগ্রহস্থলের সাহায্যে এটি একাধিক ডাটাবেস জুড়ে লেনদেন সমর্থন এবং এমভিসিসি অপারেশনকে সম্ভব করে তোলে।