InnoDB কেন একটি ফাইলে সমস্ত ডাটাবেস সংরক্ষণ করে?


51

এটি সুবিধাজনক ছিল যে মাইআইএসএএম প্রতিটি টেবিলকে সংশ্লিষ্ট ফাইলটিতে সঞ্চয় করত। InnoDB বিভিন্ন দিক থেকে অগ্রগতি করেছে, তবে আমি অবাক হয়েছি কেন InnoDB সমস্ত ফাইল ডাটাবেসকে একটি ফাইলে ( ibdata1ডিফল্টরূপে) সংরক্ষণ করে।

আমি বুঝতে পারি যে InnoDB টেবিলের জন্য পৃথক সূচী ফাইল দ্বারা ফাইলের ডেটার অবস্থানের মানচিত্র তৈরি করবে, তবে কেন এটি একটি ফাইলে সমস্ত ডেটা মেশায় তা আমি বুঝতে পারি না। এবং আরও গুরুত্বপূর্ণ, সার্ভারে সমস্ত ডাটাবেসের ডেটা মেশা কেন?

মাইআইএসএএম এর একটি আকর্ষণীয় বৈশিষ্ট্য হ'ল যে কোনও ব্যক্তি অন্য মেশিনে একটি ডাটাবেস ফোল্ডারটি অনুলিপি / পেস্ট করতে পারেন এবং তারপরে ডাটাবেসটি (কোনও ডাম্প ছাড়াই) ব্যবহার করতে পারেন।

উত্তর:


66

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.mytablesALTER 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 সারণী মিশ্রনের বিষয়ে, আমি আসলে এটি করার বুদ্ধি দেখতে পাচ্ছি। আমার নিয়োগকর্তার ডিবি / ওয়েব হোস্টিং সংস্থায় আমার একটি মাইএসকিউএল ক্লায়েন্ট রয়েছে যার একটি ডাটাবেসে একটি টেবিল রয়েছে যার সীমাবদ্ধতা একই মাইএসকিউএল উদাহরণের মধ্যে অন্য ডাটাবেসে অন্য টেবিলে ম্যাপ করা হয়। একটি সাধারণ মেটাডেটা সংগ্রহস্থলের সাহায্যে এটি একাধিক ডাটাবেস জুড়ে লেনদেন সমর্থন এবং এমভিসিসি অপারেশনকে সম্ভব করে তোলে।


এর অর্থ কী যখন আমি সক্ষম টেবিল অনুযায়ী ইনোডাব ফাইল ব্যবহার করি এবং যদি আমাকে একটি সার্ভার থেকে অন্য সার্ভারে আমার ডেটা আমদানি করতে হয় তবে আমাকে কেবল মাইএসকিএলডাম্প ব্যবহার করতে হবে এবং পারকোনা xtrabackup এর মতো অন্য কোনও সরঞ্জাম নয়?
tesla747

14

আপনি আপনার সিএনএফ-তে ইনডোডব-ফাইল-প্রতি-টেবিল যুক্ত করে প্রতি ফাইল টেবিল সংরক্ষণ করতে InnoDB টগল করতে পারেন।

ইনোডব সত্যিই কেবলমাত্র একটি প্রাথমিক স্তরের পৃষ্ঠাগুলির ডেটা যত্ন করে। প্রকৃতপক্ষে, আপনি এখন পর্যন্ত কোনও ফাইল সিস্টেম নেই এমন একটি কাঁচা ব্লক ডিভাইস ব্যবহার করতে InnoDB সেট আপ করতে পারেন! http://dev.mysql.com/doc/refman/5.5/en/innodb-raw-devices.html

ফাইলের জন্য সারণী সংরক্ষণের সুবিধাগুলি রয়েছে যেমন অনুকূলকরণের মাধ্যমে আরও সহজে ব্যবহৃত স্থান পুনরায় অর্জন করতে সক্ষম হওয়া।

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

এটি করা যায় না তা বলার অপেক্ষা রাখে না। টেবিলটি অফলাইনে থাকলে আপনি টেবিল স্পেসগুলি বাতিল / আমদানি করতে পারেন এবং http://dev.mysql.com/doc/refman/5.5/en/innodb-mpleple-tablespaces.html এর চারপাশে .idbs অনুলিপি করতে পারেন can


সন্দেহ নেই যে ইনোডিবি একটি নমনীয় ইঞ্জিন, তবে আমি বুঝতে পারি না যে কোনও ফাইলে সমস্ত ডেটা সংরক্ষণ করা কীভাবে উপকারী (যেমন এই নতুন কাঠামোটি মাইআইএসএএম এর সাথে তুলনা করে ইনোডিবিতে প্রয়োগ করা হয়েছে)।
গুগলবট

আমি মনে করি এটি হ্যান্ডসাইটের মধ্যে একটি হ'ল 20/20 জিনিস। ইনোডাব প্রথমে তাক বন্ধ করে দেওয়ার পরে প্রতি টেবিল অপশনের ফাইলটি যুক্ত করা হয়েছিল। ফাইল সিস্টেম ওভারহেড এড়ানোর জন্য এটির নিজের ব্লক ডিভাইস দেওয়ার বাইরে আমি তাদের সমস্ত একসাথে ডাম্পিং করা ভাল কারণের কারণ দিতে পারি না (এবং পুরো ব্লক ডিভাইসটি এটি নিজের বিতর্ক)। আমার সমস্ত ইনডোডব সেটআপগুলিতে ফাইল প্রতি সারণিতে সক্ষম করা আছে।
atxdba

মূল বিষয়, ফাইল সিস্টেমে নির্ভর না করা একটি অমূল্য হতে পারে তবে এটি ডিফল্টরূপে সক্রিয় নয়। সুতরাং, কয়েক জন ব্যবহারকারী এটি ব্যবহার করবেন।
গুগলবট

1
প্রতি টেবিল বিকল্পের জন্য একটি ফাইলের ক্ষতি হতে পারে যদি আপনার অনেক টেবিল থাকে এবং র‍্যাম বেশি না থাকে (উদাহরণস্বরূপ একটি ম্যাজেন্টো স্টোরটিতে প্রায় 1000 টেবিল থাকতে পারে)। এবং ওপেন ফাইল সেটিংসকেও অপ্টিমাইজ করতে হবে (ওএসের সীমাবদ্ধতা বিবেচনা করে)। সুতরাং, সাবধানতার সাথে ব্যবহার করুন।
ypercubeᵀᴹ

এটি অবশ্যই পুনরুদ্ধারের প্রচেষ্টাগুলিতে একটি প্রতিরোধ তৈরি করতে পারে। হ্যাঁ আপনার একটি ব্যাকআপ রাখা উচিত, তবে আপনি যদি তা না করেন তবে এই কাঠামোর কারণে InnoDB জিনিসগুলি আরও শক্ত করে তোলে।
মিকাতো

10

এটি ডিফল্ট আচরণ তবে বাধ্যতামূলক নয়। মাইএসকিউএল ডক্স থেকে প্রতি টেবিল টেবিল স্পেসগুলি ব্যবহার করে :

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

কেন, কারণটি সম্ভবত দুটি ইঞ্জিনের বিভিন্ন আর্কিটেকচার (মাইআইএসএএম এবং ইনোডিবি)। উদাহরণস্বরূপ, InnoDB- এ আপনি কেবলমাত্র .ibd ফাইলটিকে অন্য ডাটাবেস বা ইনস্টলেশনতে অনুলিপি করতে পারবেন না। ব্যাখ্যা (একই পৃষ্ঠা থেকে):

.Ibd ফাইলগুলির জন্য বহনযোগ্যতার বিবেচনা

আপনি মাইআইএসএএম টেবিল ফাইলগুলির সাহায্যে অবিচ্ছিন্নভাবে .ibd ফাইলগুলি ডাটাবেস ডিরেক্টরিগুলির মধ্যে স্থানান্তর করতে পারবেন না। InnoDB ভাগ করা টেবিল স্পেসে সারণী সংজ্ঞাটি ডাটাবেসের নাম অন্তর্ভুক্ত করে। টেবিলস্পেস ফাইলগুলিতে সঞ্চিত লেনদেন আইডি এবং লগ সিকোয়েন্স নম্বরগুলি ডাটাবেসের মধ্যেও পৃথক।


খুব তথ্যবহুল উত্তর এবং বিষয়টি স্পষ্ট করে দিয়েছে, তবে এখনও আমি আগ্রহী যে সমস্ত ডেটাবেসযুক্ত একটি বড় ফাইল কীভাবে কর্মক্ষমতা (যদি হয়) উন্নত করতে পারে।
গুগলবট

সবার জন্য একটি ফাইল থাকার কারণে পারফরম্যান্সটি ভাল হয় না। সারণি-স্তরের পরিবর্তে সারি-স্তরের লক করার মতো বিভিন্ন বৈশিষ্ট্য কার্য সম্পাদন করতে সহায়তা করে। এবং অবশ্যই প্রধান সুবিধা হ'ল লেনদেন এবং এফকে বাধা (এবং এইভাবে ডাটাবেসের অখণ্ডতা)।
ypercubeᵀᴹ

1
সততা সম্পর্কে আপনি বেশ সঠিক! আমি বুঝতে পেরেছি কেন ডাটাবেসের সমস্ত টেবিলকে একটি সিজ ফাইলে রাখা ভাল is তবে আমি বুঝতে পারি না কেন সমস্ত ডাটাবেস (যা সম্পূর্ণ স্বতন্ত্র) একই ফাইলে রাখে। ডিফল্টরূপে InnoDB ডেটা সংরক্ষণ করার জন্য একটি ফাইল ব্যবহার করে।
গুগলবট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.