মাইএসকিউএল টেবিল ক্র্যাশ হয় কেন? আমি কীভাবে এটি প্রতিরোধ করব?


9

আমি একটি মুডল সাইটের প্রশাসক যা এর ব্যবহারকারীর টেবিলটি দূষিত হয়ে গেছে এবং এটি ব্যবহারযোগ্য নয়।

সৌভাগ্য যে, একটি সহজ REPAIR TABLE mdl_userএটি ফিরিয়ে আবার কাজ করেন। জিনিসটি হ'ল আমি জানি না কেন এটি আসলে ক্র্যাশ হয়ে গেছে এবং এটিকে অযোগ্য করে তুলেছে এবং আমি এটি নিশ্চিত করতে চাই যে আমি পরের বার আরও ভাল প্রস্তুত prepared

আমি পুরোপুরি অভিজ্ঞ ডিবিএ নই - আমি কেবল একজন বিকাশকারী যিনি প্রচুর স্টাফ করেন, তাই দয়া করে আমার সহ্য করুন।

আমি কেবল একটি ব্যাকআপ পুনরুদ্ধার করতে পারি, তবে আমার ধারণা ক্র্যাশ প্রতিরোধের উপায় রয়েছে।

এই টেবিলগুলি utf8_ জেনারাল_সি এবং মাইআইএসএএম ব্যবহার করছে।

কেন একটি মাইএসকিউএল টেবিল ক্রাশ হয়? এটি যাতে না ঘটে সে জন্য আমি কী করতে পারি?

উত্তর:


11

মাইআইএসএএম টেবিলের ক্রাশ হওয়া বরং এটি সহজ।

প্রতিটি মাইআইএসএএম টেবিলের শিরোনামে এমন একটি কাউন্টার রয়েছে যা টেবিলের বিপরীতে কতগুলি মুক্ত ফাইল হ্যান্ডেল রয়েছে তা সনাক্ত করে।

যদি আপনি মাইএসকিএল শুরু করেন এবং শিরোনামের মধ্যে নম্বরটি প্রকৃত ফাইল হ্যান্ডলের সংখ্যার সাথে মেলে না, মাইএসকিএলএডটি টেবিলটিকে ক্র্যাশ হওয়ার সাথে সাথে আচরণ করে।

যদি কোনও সাধারণ REPAIR TABLE mdl_userকোনও ডেটা ক্ষতি ছাড়াই প্রতিবার এটি কাজ করে, তবে এটি সূচিত করতে পারে যে আপনার কাছে খুব উচ্চ পাচার হওয়া একটি সাইট রয়েছে যা এখানে লিখেছিল mdl_user

কয়েক ডজন টেবিলের যদি এটির প্রয়োজন হয় REPAIR TABLE, আমি সমস্ত টেবিলগুলিকে InnoDB তে রূপান্তর করব। তবে, যদি mdl_userএই সমস্যাটি সহ টেবিলটি একমাত্র সারণী হয় তবে আপনি কিছু করতে পারেন (উদাহরণস্বরূপ, বলুন ডাটাবেসটি হয় moodle);

আপনি চাইলে সমস্ত সারণী মাইআইএসএএম হিসাবে রেখে দেওয়া হয়েছে

পদক্ষেপ 01: একটি মেরামত সারণী স্ক্রিপ্ট তৈরি করুন

echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql

পদক্ষেপ 02: মেরামত স্ক্রিপ্টটি স্টার্টআপ ফাইল হিসাবে ঘোষণা করুন

এটিকে /etc/my.cnf এ যুক্ত করুন

[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql

পদক্ষেপ 03: মাইএসকিএল পুনরায় আরম্ভ করুন

মাইএসকিএল-এর প্রতিটি পুনঃসূচনা মেরামত সারণী স্ক্রিপ্টটি ট্রিগার করবে

আপনি যদি চান সমস্ত টেবিল InnoDB হয়ে যায়

মাইআইএসএএম টেবিলগুলির একটি বাল্ক রূপান্তর স্ক্রিপ্ট ইনোডিবিতে তৈরি করতে এই কোডটি চালান, এবং এটি দেখুন

MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql

একবার আপনি রূপান্তর স্ক্রিপ্টের বিষয়বস্তুতে সন্তুষ্ট হয়ে গেলে এটি চালান

mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql

আপডেট 2012-03-15 14:00 ইডিটি

কেভিন , মাইআইএসএএম ব্যবহার করার সময়, যদি ডিস্ক স্পেসের বাইরে চলে যাওয়া আপনার ব্যয় হয়?

এখানে বিবেচনা করার মতো কিছু রয়েছে: মাইএসকিউএল 5.0 শংসাপত্রের স্টাডি গাইড অনুসারে ,

এখানে চিত্র বর্ণনা লিখুন

বুলেটপয়েন্ট # 11 পৃষ্ঠাগুলিতে 408,409 ধারা 29.2 তে নিম্নলিখিতটি বলেছেন:

আপনি যদি মাইআইএসএএম টেবিলটিতে সারি যুক্ত করার সময় ডিস্কের জায়গাটি সরিয়ে ফেলে থাকেন তবে কোনও ত্রুটি ঘটেনি। সার্ভার স্থান উপলব্ধ না হওয়া অবধি অপারেশন স্থগিত করে এবং তারপরে অপারেশন সম্পূর্ণ করে।

আপনি যখন ডিস্কের স্থানটি সরিয়ে ফেলেন, কেবল বন্ধ বা মাইএসকিএল মারবেন না। বর্তমানে ব্যবহৃত মাইআইএসএএম-তে খোলা ফাইল হ্যান্ডলগুলির গণনা সাফ করা হবে না। সুতরাং, মাইআইএসএএম টেবিলটি ক্র্যাশযুক্ত চিহ্নিত হয়েছে। যদি আপনি এখনও মাইএসকিএলডি সহ ডেটা ভলিউমে ডিস্কের স্থান খালি করতে পারেন, ডিস্কের স্পেস উপলব্ধ হয়ে গেলে মাইএসকিএলডি সৈনিক হবে।


দুর্দান্ত প্রতিক্রিয়া। ফাইল হ্যান্ডলগুলি কিছুটা জানত না এবং আপনি ইতিমধ্যে সমাধান করেছেন যে কোনও সমস্যা হয়ে গেলে আমি কীভাবে (বা স্বয়ংক্রিয়ভাবে মেরামতের) রোধ করতে পারি। সুরক্ষার জন্য কোনও পরামর্শ যদি সাইটটি mdl_user (বা অন্য কোনও টেবিল) কে প্রচুর লেখেন?
এয়ারক্রস

আপনার তিনটি জিনিস করা উচিত: ১) র‌্যাম বাড়ানো, ২) সর্বোচ্চ_সংযোগ বাড়ানো, ৩) ইনোডিবিতে স্যুইচ করুন।
RolandoMySQLDBA

এখানে নুব। আমি এই কোডটি কোথায় "চালনা" করব? সার্ভারে আপলোড করা কোনও ফাইল থেকে বা কোনও কমান্ড লাইন থেকে?
আনক্যাচটাইপ এরির

0

আমি মাইএসকিএল-তে একটি মুডল সাইটও পরিচালনা করি এবং আমাদের জন্য সারণী দুর্নীতির সর্বাধিক সাধারণ কারণটি ডিস্কের জায়গা ছাড়াই।


@ রোল্যান্ডোমাইএসকিউএলডিবিএ - হ্যাঁ, ডিস্কের স্পেস অবশ্যই সমস্যা (কিছু অন্যান্য প্রক্রিয়া এবং সাধারণভাবে পরিচালনার দর্শনের সাথে সম্পর্কিত)। দুর্ভাগ্যক্রমে, স্থানটি সাফ হয়ে গেলে আমরা সমস্যার সমাধান নিজেই দেখতে পাই না বা সময় মতো পর্যাপ্ত পরিমাণে এটি সমাধান করা যায় না। আমার প্রতিক্রিয়াটি কেবল এটিই বোঝাতে হয়েছিল যে আমাদের মুডল / মাইএসকিএল উদাহরণস্বরূপ, ডিস্ক স্পেসের সমস্যাগুলি মাইএসকিএল / মাইসাম যা করণীয় তা বিবেচনা না করেই টেবিল ক্রাশের কারণ হতে পারে।
কেভিন

-3

সমস্ত টেবিল InnoDB এ রূপান্তর করতে আমি একটি ভাল লাইন পেয়েছি:

mysql -u root -p dbName -e "show table status where Engine='MyISAM';" | 
    awk 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
    mysql -u root -p dbName

কোডটির জন্য ঠিক আছে তবে এটি প্রথম অংশের প্রশ্নের উত্তর দেয় না (কেন একটি মাইএসকিউএল টেবিল ক্র্যাশ করে?)। যদি আপনি বোঝাতে চান যে এটি দ্বিতীয় ভাগটির উত্তর দেয় (এটি কীভাবে প্রতিরোধ করবেন?), দয়া করে আরও কিছু ব্যাখ্যা যুক্ত করুন।
ypercubeᵀᴹ

আরও বিশদ যুক্ত করুন। এটি কি কোনও ডাটাবেসে সমস্ত টেবিলকে রূপান্তর করে? নাকি পুরো সার্ভার? যদি কোনও টেবিল রূপান্তর করতে ব্যর্থ হয় এবং আমরা ত্রুটি পাই তবে কী হবে? এটা সম্ভব যে আমরা কিছু সারণী রূপান্তরিত করেছি এবং কিছু মাইস্যামে রেখেছি? সাধারণভাবে, ডিবিএ চালানোর আগে অন্য কোন বিষয় বিবেচনা করা উচিত?
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.