মাইএসকিউএল - লাইভ ডিবি-র জন্য ইনোডাব_ফিল_পিটার_সেবিল পরিবর্তন করা হচ্ছে


18

আমার কাছে একটি বড় মাইএসকিএল ডিবি (১৫০ গিগাবাইট) রয়েছে এবং কেবলমাত্র আমি এখন লক্ষ্য করেছি যে innodb_file_per_tableসেটটি সেট হয়ে গেছে offযার ফলে পুরো ডিবিকে একটি একক ফাইলে ( ibdata1) হোস্ট করা যায় । আমি সক্রিয় করতে চাই innodb_file_per_tableএবং এটি পূর্ববর্তীভাবে ডিবিকে কয়েকটি ফাইলে বিভক্ত করতে চাই, এটি করার সর্বোত্তম উপায় কোনটি?

উত্তর:


32

এটি বন্ধ করার সত্যিই একটি উপায় আছে। আপনাকে মাইএসকিল্ডাম্পস ব্যবহার করে ডেটা রফতানি করতে হবে, সমস্ত ডাটাবেস ফেলে দিতে হবে, শাটডাউন মাইএসকিএলডি করতে হবে, আইব_লগফিলিটি মুছতে হবে, আইব_লগফাইল 1 মুছুন, আইবডাটা 1 মুছুন, শিরোনামের innodb_file_per_tableঅধীনে যুক্ত করুন, মাইএসকিএল [mysqld]শুরু করবেন।

আমি এই উত্তরটি স্ট্যাকওভারফ্লোতে অক্টোবর 2010 এ পোস্ট করেছি posted

উল্লম্বভাবে তালিকাভুক্ত পদক্ষেপগুলি এখানে:

পদক্ষেপ 01) মাইএসকিউএলএক এসকিউএল পাঠ্য ফাইলে সমস্ত ডাটাবেস ড্যাম্প করুন (এটিকে এসকিউএলডাটা.এসকিউএল কল করুন)

পদক্ষেপ 02) সমস্ত ডাটাবেস ফেলে দিন (মাইএসকিএল স্কিমা ব্যতীত)

পদক্ষেপ 03) শাটডাউন মাইএসকিএল

কায়েট : ইনোডিবি ফাইলগুলি থেকে অনির্দিষ্ট লেনদেন সম্পূর্ণরূপে সাফ করার জন্য এটি চালান

mysql -uroot -p... -Ae"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop

পদক্ষেপ 04) /etc/my.cnf এ নিম্নলিখিত লাইনগুলি যুক্ত করুন

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

সিডিনোট: ইনোডাব_ফুফার_পুল_সাইজের জন্য আপনার সেট যাই হোক না কেন, নিশ্চিত করুন যে ইনোডাব_লগ_ফায়াল_সাইজ ইনোডাব_বফার_পুল_সাইজের 25%।

পদক্ষেপ 05) ibdata1, ib_logfile0 এবং ib_logfile1 মুছুন

এই মুহুর্তে, কেবলমাত্র / var / lib / mysql তে মাইএসকিএল স্কিমা থাকা উচিত

পদক্ষেপ 06) মাইএসকিএল পুনরায় চালু করুন

এটি আইবিডেটা 1 10 এমবিতে, ইব_লগফাইল 0 এবং আইবি_লগফাইল 1 প্রতিটি 1 জি তে পুনরায় তৈরি করবে

পদক্ষেপ 07) এসকিউএলডেটা.এসকিউএলকে মাইএসকিএলে পুনরায় লোড করুন

আইবডাটা 1 বৃদ্ধি পাবে তবে কেবল টেবিল মেটাডেটা থাকে

প্রতিটি InnoDB টেবিল ইবদাটা 1 এর বাইরে থাকবে

ধরুন আপনার কাছে একটি আইএনডিবিবি টেবিল আছে যার নাম mydb.mytable। আপনি যদি / var / lib / mysql / mydb এ যান তবে আপনি টেবিলের প্রতিনিধিত্বকারী দুটি ফাইল দেখতে পাবেন

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

আইবডাটা 1-এ আর কখনও ইনোডিবি ডেটা এবং সূচি থাকবে না।

/Etc/my.cnf- এ ইনোডাব_ফিল_পিটার_টিবল অপশনের সাহায্যে আপনি অপ্টিমিজ টেবিল mydb.mytable চালাতে পারবেন এবং /var/lib/mysql/mydb/mytable.ibd ফাইলটি সঙ্কুচিত হবে।

আমি আমার কেরিয়ারে মাইএসকিউএল ডিবিএ হিসাবে অনেকবার এটি করেছি

প্রকৃতপক্ষে, আমি প্রথমবার এটি করেছি, আমি একটি 50 জিবি ইবদাতা 1 ফাইলটি 500 এমবিতে ভেঙে ফেলেছি।

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

এমন একটি বিকল্প রয়েছে যা ইবদাতা 1 সঙ্কুচিত না করে InnoDB টেবিলটি বের করবে।

পদক্ষেপ 01) /etc/my.cnf এ নিম্নলিখিত লাইনগুলি যুক্ত করুন

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

পদক্ষেপ 02) service mysql restart

পদক্ষেপ 03) mydb.mytable নামক একটি একক InnoDB টেবিল বের করতে, এটি করুন:

ALTER TABLE mydb.mytable ENGINE=InnoDB;

এটি একটি ফাইল তৈরি করবে মূল কাঠামোর ফাইলটি রাখুন

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

আপনি প্রতিটি InnoDB টেবিলের জন্য এটি করতে পারেন। দুর্ভাগ্যক্রমে, ইবদাটা 1 150 গিগাবাইট থাকবে।


.sql ফাইলগুলি থেকে পুনরায় লোড চালানোর সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 1000 bytesকোনও ধারণা?
রান

@ রন দয়া করে এটিকে একটি পৃথক প্রশ্ন হিসাবে পোস্ট করুন।
রোল্যান্ডোমাইএসকিউএলডিবিএ


আপনি যদি সেট করে innodb_file_per_tableএবং তারপরে ALTER TABLEপ্রতিটি একক টেবিলে করেন, আপনি কি পুনরুদ্ধার না করেই জায়গাটি দাবি করতে আইবডটা 1 ফাইলটি মুছতে পারবেন?
সিস্টেমপারাডক্স

1
@ সিস্টেমপাড়াডক্স নিখুঁত নয় !!!!!!!! আপনি ডেটা অভিধান হারাবেন।
রোল্যান্ডোমাইএসকিউএলডিবিএ

5

আপনি যদি ইবদাতার স্থানটি পুনরায় দাবি করতে চান তবে রোল্যান্ডো উল্লেখ করেছেন যে , একটি ডাম্প / পুনরুদ্ধার আপনার একমাত্র পছন্দ । এটি করা সম্ভবত পারফরম্যান্সের পক্ষেও সেরা।

তবে, আপনি যদি নিজের লোকসান কাটাতে চান এবং হার্ডড্রাইভে সেই 150 জিবিটি 'হারাতে' চান, আপনি কেবল মাই সিএনএফ এ সক্ষম করতে পারেন innodb_file_per_tableএবং আপনার সার্ভারটি পুনরায় চালু করতে পারেন।

তারপরে প্রতিটি টেবিলের জন্য, ইস্যু করুন:

ALTER TABLE x DISABLE KEYS;
ALTER TABLE x ENGINE=InnoDB;
ALTER TABLE x ENABLE KEYS; 

এখানে সমস্যাটি হচ্ছে বড় টেবিল স্পেসগুলিতে কিছুটা সময় লাগবে।

আমার পরামর্শটি হ'ল আপনার লাইভ ডিবি-এর একটি স্লেভ স্থাপন করা, দাসের উপর রূপান্তর চালানো, তবে হয় মাস্টার / দাসকে বন্ধ করুন এবং নতুন ডেটাস্পেসটি মাস্টারের কাছে অনুলিপি করুন, বা দাসটি একবার এটি মাস্টার হয়ে উঠলে তাকে উন্নীত করুন promote ।

একেবারে ডাউনটাইম ছাড়াই আপনার এই পরিবর্তন করতে অসুবিধা হতে চলেছে।


নির্মমভাবে সৎ হয়ে বলা এবং 'আপনার লোকসান কাটুন' বলে +1। আপনিও 'বুলেট কামড়' বলতে পারতেন।
রোল্যান্ডোমাইএসকিউএলডিবিএ

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