হাওটো: মাইএসকিএল InnoDB স্টোরেজ ইঞ্জিনটি পরিষ্কার করুন?


133

এটি কোনও মুছে ফেলা টেবিলগুলি থেকে ডেটা সংরক্ষণ না করে কোনও মাইএসকিএল ইনোডাব স্টোরেজ ইঞ্জিন পরিষ্কার করা সম্ভব?

বা প্রতিবারই কি আমার একটি নতুন ডেটাবেস পুনরায় তৈরি করতে হবে?


আপনি কী ভাবছেন যে মাইএসকিউএল মুছে ফেলা টেবিলগুলি থেকে ডেটা সংরক্ষণ করছে?
রবার্ট মুন্তানু

1
যদি আমি বিশাল টেবিলগুলির পুরো গুচ্ছটি ফেলে রাখি তবে আমার InnoDB স্টোরেজ ফাইলগুলি সঙ্কুচিত হবে না
ব্রায়ান ফিল্ড

2
@ রবার্টমুন্টানু: দেখুন বাগস.মাইসকিএল.কম
সর্বাধিক

উত্তর:


351

ইনোডিবি সম্পর্কিত আরও একটি সম্পূর্ণ উত্তর এখানে। এটি একটি দীর্ঘ প্রক্রিয়া একটি বিট, কিন্তু প্রচেষ্টা মূল্যবান হতে পারে।

মনে রাখবেন যে /var/lib/mysql/ibdata1InnoDB অবকাঠামোর ব্যস্ততম ফাইল। এটিতে সাধারণত ছয় ধরণের তথ্য থাকে:

InnoDB আর্কিটেকচার

InnoDB আর্কিটেকচার

অনেক লোক ibdataআরও ভাল ডিস্ক-স্পেস ম্যানেজমেন্ট এবং পারফরম্যান্সের আশায় একাধিক ফাইল তৈরি করে তবে বিশ্বাসটি ভুল হয়ে যায়।

আমি কি দৌড়াতে পারি OPTIMIZE TABLE?

দুর্ভাগ্যক্রমে, OPTIMIZE TABLEভাগ করা টেবিল-স্পেস ফাইলে থাকা ibdata1কোনও InnoDB টেবিলের বিরুদ্ধে দৌড়ানো দুটি জিনিস করে:

  • টেবিলের ডেটা এবং সূচিগুলিকে অভ্যন্তরে স্থির করে তোলে ibdata1
  • সংক্ষিপ্ত ibdata1ডেটা এবং সূচী পৃষ্ঠাগুলিতে সংযোজন করা হওয়ায় বাড়ায়ibdata1

তবে আপনি সারণী ডেটা এবং সারণী সূচীগুলি পৃথক করে ibdata1এগুলি স্বাধীনভাবে পরিচালনা করতে পারেন।

আমি কি OPTIMIZE TABLEসাথে চালাতে পারি innodb_file_per_table?

মনে করুন আপনি যোগ innodb_file_per_tableকরতে হবে /etc/my.cnf (my.ini)। আপনি কি কেবলমাত্র OPTIMIZE TABLEসমস্ত InnoDB টেবিলগুলিতে চালাতে পারবেন ?

সুসংবাদ : আপনি যখন সক্ষম OPTIMIZE TABLEহয়ে innodb_file_per_tableচলেছেন তখন .ibdএটি সেই টেবিলের জন্য একটি ফাইল তৈরি করবে । উদাহরণস্বরূপ, আপনার যদি টেবিল mydb.mytableউইথ ড্যাটাডির থাকে তবে /var/lib/mysqlএটি নিম্নলিখিত উত্পাদন করে:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

এই .ibdটেবিলের জন্য ডেটা পৃষ্ঠাগুলি এবং সূচি পৃষ্ঠা থাকবে will গ্রেট।

খারাপ সংবাদ : আপনারা যা কিছু করেছেন তা হ'ল mydb.mytableজীবন যাপনের থেকে ডেটা পৃষ্ঠাগুলি এবং সূচী পৃষ্ঠাগুলি নিষ্কাশন করা ibdata। প্রতিটি সারণীর জন্য ডেটা ডিকশনারি এন্ট্রি সহ mydb.mytableএখনও তথ্য অভিধানে রয়ে গেছে ( আইবডাটা 1 এর চিত্রের উপস্থাপনা দেখুন )। আপনি কেবল ibdata1এই পয়েন্টটি মুছে ফেলতে পারবেন না !!! দয়া করে মনে রাখবেন যে ibdata1এটি মোটেই সঙ্কুচিত হয়নি।

ইনোডিবি ইনফ্রাস্ট্রাকচার ক্লিনআপ

ibdata1একবার সঙ্কোচন করার জন্য আপনাকে নিম্নলিখিতগুলি করতে হবে:

  1. পাঠ্য ফাইলে mysqldumpসমস্ত ডাটাবেস ডাম্প (উদাহরণস্বরূপ ) .sql( SQLData.sqlনীচে ব্যবহৃত হয়)

  2. সমস্ত ডেটাবেস ফেলে দিন ( mysqlএবং ব্যতীত information_schema) ক্যাভিট : একটি সতর্কতা হিসাবে, দয়া করে আপনার সমস্ত ব্যবহারকারীর অনুদানের জায়গায় রয়েছে তা নিশ্চিত করতে এই স্ক্রিপ্টটি চালান:

    mkdir /var/lib/mysql_grants
    cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
    chown -R mysql:mysql /var/lib/mysql_grants
  3. Mysql এ লগইন করুন এবং চালান SET GLOBAL innodb_fast_shutdown = 0;(এটি সম্পূর্ণরূপে ib_logfile0এবং এর থেকে সমস্ত লেনদেনমূলক পরিবর্তনগুলি ফ্লাশ করে দেবে ib_logfile1)

  4. শাটডাউন মাইএসকিউএল

  5. /etc/my.cnf(বা my.iniউইন্ডোজ) এ নিম্নলিখিত লাইনগুলি যুক্ত করুন

    [mysqld]
    innodb_file_per_table
    innodb_flush_method=O_DIRECT
    innodb_log_file_size=1G
    innodb_buffer_pool_size=4G

    (Sidenote জন্য আপনার সেট যাই হোক না কেন innodb_buffer_pool_size, তা নিশ্চিত করতে innodb_log_file_size25% হল innodb_buffer_pool_size

    এছাড়াও: innodb_flush_method=O_DIRECTউইন্ডোজ উপলভ্য নয়)

  6. মুছুন ibdata*এবং ib_logfile*, ptionচ্ছিকভাবে, আপনি /var/lib/mysqlবাদে সমস্ত ফোল্ডার মুছে ফেলতে পারেন /var/lib/mysql/mysql

  7. স্টার্ট মাইএসকিউএল (এই পুনঃ হবে ibdata1[ডিফল্টরূপে 10MB] এবং ib_logfile0এবং ib_logfile11G প্রতিটি)।

  8. আমদানি SQLData.sql

এখন, ibdata1বাড়বে তবে কেবল টেবিল মেটাডেটা থাকবে কারণ প্রতিটি ইনোডিবি টেবিলের বাইরে উপস্থিত থাকবে ibdata1ibdata1অন্য টেবিলের জন্য আর InnoDB ডেটা এবং সূচি থাকবে না।

উদাহরণস্বরূপ, ধরুন আপনার নামের একটি InnoDB টেবিল রয়েছে mydb.mytable। আপনি যদি সন্ধান করেন /var/lib/mysql/mydbতবে টেবিলের প্রতিনিধিত্বকারী দুটি ফাইল দেখতে পাবেন:

  • mytable.frm (স্টোরেজ ইঞ্জিন শিরোনাম)
  • mytable.ibd (সারণী ডেটা এবং সূচি)

সঙ্গে innodb_file_per_tableবিকল্প /etc/my.cnf, আপনি চালাতে পারেন OPTIMIZE TABLE mydb.mytableএবং ফাইল /var/lib/mysql/mydb/mytable.ibdআসলে সঙ্কুচিত হবে।

আমি আমার কেরিয়ারে মাইএসকিউএল ডিবিএ হিসাবে অনেকবার এটি করেছি। প্রকৃতপক্ষে, আমি প্রথমবার এটি করেছি, আমি একটি 50 গিগাবাইট ibdata1 ফাইলটি কেবল 500 এমবিতে নামিয়ে দিয়েছি !

একবার চেষ্টা করে দেখো. যদি আপনার এই বিষয়ে আরও প্রশ্ন থাকে তবে কেবল জিজ্ঞাসা করুন। আমাকে বিশ্বাস কর; এটি স্বল্প মেয়াদে পাশাপাশি দীর্ঘ পথের কাজ করবে।

বিচারকার্য স্থগিত রাখার আদেশ

ধাপ 6 এ, যদি মাইএসকিউএল কারণে পুনরায় চালু করতে পারবেন না mysqlস্কিমা বাদ শুরু পদক্ষেপ 2. এ বর্ণন আপনাকে ফেরত শারীরিক কপি তৈরি mysqlস্কিমা। আপনি নিম্নলিখিত হিসাবে এটি পুনরুদ্ধার করতে পারেন:

mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql

Step ধাপে ফিরে যান এবং চালিয়ে যান

আপডেট 2013-06-04 11:13 ইডিটি

ধাপ ৫-এ ইনোডাব_বফলার_পুল_সাইজের 25% এ ইনোডাব_লগ_ফাইল_সাইজ স্থাপনের ক্ষেত্রে , এটি কম্বল নিয়মটি বরং পুরানো স্কুল।

পিছনে July 03, 2006, কেন সঠিক ইনডোড_ব্লগ_ফাইলে_সাইজ চয়ন করতে হবে তা পারকোনার একটি সুন্দর নিবন্ধ ছিল । পরবর্তীতে, Nov 21, 2008পারকোনা আরও একটি নিবন্ধটি অনুসরণ করেছিলেন যাতে কীভাবে এক ঘন্টা মূল্য পরিবর্তনের জন্য শীর্ষের কাজের চাপের উপর ভিত্তি করে সঠিক আকারটি গণনা করা যায়

লগের আকার নির্ণয়ের বিষয়ে এবং যেখানে আমি এই দুটি পারকোনার নিবন্ধটি উল্লেখ করেছি সে সম্পর্কে আমি ডিবিএ স্ট্যাকএক্সচেঞ্জে পোস্ট লিখেছি।

ব্যক্তিগতভাবে, আমি এখনও প্রাথমিক সেটআপের 25% নিয়ম নিয়ে যেতে পারি। তারপরে, কাজের সময় কাজের চাপ আরও সঠিকভাবে নির্ধারণ করা যেতে পারে , আপনি ঠিক কয়েক মিনিটের মধ্যে কোনও রক্ষণাবেক্ষণ চক্রের সময় লগগুলিকে পুনরায় আকার দিতে পারেন


9
আমি ইনডোডবি_ফাইলে_ টেবিল অপশনটি দুর্দান্ত ব্যবহার করতে পেরেছি, একক সার্ভারে 200 টি টেবিল সহ 200 টি ডাটাবেস থাকা, আমি আলাদা পার্টিশনে পার্থক্য ডাটাবেসগুলি সিমিলিং করতে সক্ষম হয়েছি, সুতরাং আরও আইও বাফার এবং স্পিন্ডেলগুলি ব্যবহার করা হয়েছে যা অন্যথায় উপলব্ধ ছিল :)
ডেভ রিক্স

2
@ সানডাউন বিটিডব্লিউ মনে রাখবেন প্রয়োজনে বাড়াতে innodb_open_tablesহবে। ডিফল্টটি 300.
রোল্যান্ডোমাইএসকিউএলডিবিএ

2
@ giorgio79 আপনার বাল্ক সন্নিবেশকে একটি বৃহত্তর মানতে সেট করতে হবে। এটি একটি ভালো দিক. আমি আমার প্রশ্নের উত্তরে আপনার প্রশ্নের সারাংশ যুক্ত করব।
রোল্যান্ডোমাইএসকিউএলডিবিএ

3
32 বিট সিস্টেমে ইনোডাব_বফার_পুল_সাইজের জন্য একটি 4 জিবি মান অনুমোদিত নয়। মাইএসকিএল নিঃশব্দে ইনোডাব অক্ষম করে শুরু হবে এবং পুনরুদ্ধারকৃত টেবিলগুলি মাইসামে পরিবর্তিত হবে। এটি ঠিক করতে কিছুটা ছোট মান ব্যবহার করুন।
ডেভিড

5
ভাল দেবতা. আমি শুধু বলতে চাই এটি সম্ভবত সবচেয়ে ভাল উত্তরগুলির মধ্যে একটি, যা আমি এ পর্যন্ত জঘন্য কাজটি দেখেছি, স্যার। যখন আমি 154g ডিবির আমদানি করার সময় ERROR 2013 (HY000) পাচ্ছিলাম তখন আমার সমস্যার সমাধানের জন্য আমাকে সহায়তা করেছিল। চমৎকার উত্তরের জন্য ধন্যবাদ!
জোশ ব্রাউন

4

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

আপনি টেবিলগুলির ম্যানুয়াল পুনরায় সংগঠনের মাধ্যমে ইঞ্জিনের ব্যবহৃত স্পেস টিউন ও পরিচালনা করতে পারেন। এটি করার জন্য, মাইএসকিএলড্প ব্যবহার করে প্রভাবিত টেবিলগুলিতে ডেটা ফেলে দিন, টেবিলগুলি ফেলে দিন, মাইএসকিএল পরিষেবাটি পুনরায় চালু করুন এবং তারপরে ডাম্প ফাইলগুলি থেকে টেবিলগুলি পুনরায় তৈরি করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.