InnoDB টেবিল দুর্নীতি আপনি কীভাবে সনাক্ত করবেন?


24

আমার কয়েকটি টেবিল রয়েছে যা বিভক্ত হয়ে গেছে এবং একটি প্রতিলিখিত গোলামে বেশ কয়েকটি সূচি রয়েছে। নতুন দাসে স্ন্যাপ শট (যাচাই করা নিরাপদ) অনুলিপি করার পরে এবং মাইএসকিএলএডকে 5.1.42 থেকে 5.5.15 আপগ্রেড করার পরে এবং পুনরায় প্রতিলিপি শুরু করার পরে, আমি ত্রুটি বার্তায় "অবৈধ পয়েন্টার ..." দিয়ে ইনোডিবি ক্র্যাশ পেয়ে যাচ্ছি getting

এই ত্রুটিগুলি বিভিন্ন হার্ডওয়্যার এবং ও / এস এর সাথে 2 টি সার্ভার জুড়ে হয়েছে। দৌড়ানোর পরে:

ALTER TABLE .... COALESCE PARTION n;

সমস্যাটি সেই টেবিলটির জন্য চলে যায়।

যদিও আমার প্রশ্ন স্কোপের চেয়ে বড়, এবং এটি "আপনি কীভাবে ইনোডিবি সারণী দুর্নীতি চিহ্নিত করবেন?" বা পুনঃপ্রণোদিত "কীভাবে আপনি ইনোডিবি টেবিলের স্বাস্থ্য মূল্যায়ন করবেন?" ক্র্যাশ প্রাক-ক্রাশ সনাক্তকরণের জন্য কি "চেক টেবিল" একমাত্র সরঞ্জাম উপলব্ধ?

এটি গুরুত্বপূর্ণ কিনা তা নিশ্চিত না হলেও ক্র্যাশগুলি চলমান হয়েছে: সংস্করণ: '5.5.15-55-লগ' সকেট: '/opt/mysql.sock' পোর্ট: 3306 পারকোনা সার্ভার (জিপিএল), রিলিজ 2121.0, সংশোধন 158


2
হাই র্যান্ডি! আমি মনে করি এখানে প্রতিক্রিয়াগুলি বিশ্বাসযোগ্য - InnoDB তার নিজস্ব দুর্নীতি চিহ্নিত করেছে। হতে পারে আপনার প্রশ্নটি পুনর্বিবেচনা করা উচিত, আপনি কী করছেন ইনোডিবি দুর্নীতিগ্রস্থ হওয়ার কারণ?
মরগান টকার

উত্তর:


18

মরগান তার মন্তব্যে একটি ইঙ্গিত দেয় যে ইনোডিবি এটি পড়তে থাকা পৃষ্ঠাগুলিতে চেকসাম করে ক্রমাগত দূষিত পৃষ্ঠাগুলি অনুসন্ধান করছে। InnoDB যদি একটি চেকসাম অমিল খুঁজে পায় তবে এটি সার্ভার বন্ধ করে দিয়ে ক্র্যাশ করবে ।

আপনি যদি সেই প্রক্রিয়াটি দ্রুত করতে চান (কলুষিত পৃষ্ঠাটি পড়ার জন্য InnoDB অপেক্ষা না করে), আপনি ব্যবহার করতে পারেন innochecksum:

যেহেতু চেকসাম মেলেনি ম্যাচগুলি InnoDB ইচ্ছাকৃতভাবে একটি চলমান সার্ভারটি বন্ধ করে দেবে, ক্ষতিগ্রস্থ পৃষ্ঠাগুলির মুখোমুখি হওয়ার জন্য উত্পাদন ব্যবহারে কোনও সার্ভারের অপেক্ষা না করে এই সরঞ্জামটি ব্যবহার করা ভাল।

একটি আকর্ষণীয় সতর্কতা:

সার্ভারের ইতিমধ্যে খোলা টেবিলস্পেস ফাইলগুলিতে ইনোচেকসাম ব্যবহার করা যাবে না। এই জাতীয় ফাইলগুলির জন্য, টেবিল স্পেসের মধ্যে টেবিলগুলি পরীক্ষা করতে আপনার চেক টেবিল ব্যবহার করা উচিত।

সুতরাং হ্যাঁ, একটি অনলাইন টেবিলের CHECK TABLEজন্য সম্ভবত হাতিয়ার (বা আপনি যদি একবারে একক ডাটাবেসের চেয়ে আরও কিছু করতে চান তবে অন্য উত্তরে নির্দেশিত as mysqlcheck)

আপনি যদি আপনার ডাটাবেসটি বন্ধ করতে পারেন তবে আপনি এটি ব্যবহার করে চেকসামগুলিকে জোর করতে পারেন innochecksum

উপাখ্যান : 29 জিবি (সহ innodb_file_per_table=1) এর একটি ইনোডাব টেবিল স্পেসে , এই স্ক্রিপ্টটি প্রায় 2 মিনিট সময় নেয়

#!/bin/bash
for i in $(ls /var/lib/mysql/*/*.ibd)
do
  innochecksum -v $i
done

বোনাস হিসাবে, যদিও আপনি পারকোনা চালাচ্ছেন, তারা দ্রুত ইনডোডব চেকসামের জন্য একটি নতুন পদ্ধতি প্রয়োগ করেছেন । আমি এটি কখনও ব্যবহার করি নি, তবে এটি প্রক্রিয়াটি দ্রুততর করতে পারে।


1
এখানে এটি চেষ্টা করে দেখুন, সমাধানটি মনে হচ্ছে @randymelder +1 খুঁজছেন
মারসিও

2
পারকোনা সার্ভারে আরও কিছু দুর্দান্ত বৈশিষ্ট্য রয়েছে। ইনোডোবি_করপট_ট্যাবল_অ্যাকশন পেরকোনা / ডক / স্পিকারকোনা- সার্ভার / ৫.৫ / সত্যতা / ((!!) দেখুন
মরগান টকার

@ ডিস্টেস্ট: ইনোচেকসাম যাওয়ার উপায়। এই একজন রক্ষক +1 !!!
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ ডিস্টেস্ট: আজকে এটির জন্য আপনার হাতে টুপি !!!!
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ মরগানটকার আকর্ষণীয় আমার জ্ঞানের শূন্যতা পেতে এবং পেরকোনায় কিছু গবেষণা করতে যাচ্ছেন
ডেরেক

6

সতর্কতা: এই নির্দেশাবলীর যে কোনও একটি চেষ্টা করার আগে আপনার হাতে আপনার ডাটাবেসের স্বাস্থ্যকর ব্যাকআপ রয়েছে তা যাচাই করার জন্য দৃ strongly়ভাবে সুপারিশ করা হয়। (সতর্কতার জন্য @ নিককে ধন্যবাদ)

mysqlcheckকমান্ডটি ব্যবহার করার চেষ্টা করুন । টার্মিনালে:

mysqlcheck -u username -p --databases database1 database2

এই কমান্ডটি সমস্ত টেবিলের একটি তালিকা এবং একটি স্থিতি যা আপনাকে জানায় যে এখানে কোনও ধরণের দুর্নীতি হয়েছে কিনা:

table1  OK
table2  OK
table3  OK
tableN  OK

এটি হাতে নিয়ে আপনি ইতিমধ্যে জানতে পারবেন আপনাকে কোন টেবিলগুলি মেরামত করতে হবে। আপনি যদি একবারে সমস্ত কিছু মেরামত করতে চান তবে:

mysqlcheck -u username -p --auto-repair --databases database1 database2 

সম্পর্কে আরও mysqlcheck: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html

দ্রষ্টব্য: আপনি আপনার প্রশ্নটি সাথে ট্যাগ করেছেন । আমার কী ছিল সে সম্পর্কে কোনও ধারণা ছিল না তাই আমি গুগল করেছিলাম। এটি মাইএসকিউএল এর একটি কাঁটাচামচ বলে মনে হচ্ছে, তবে আদেশগুলি অসম্পূর্ণ (আঙ্গুলগুলি অতিক্রম করা) বিশ্বাস করার কোনও কারণ নেই।


কেউ আমাকে এই গাইডটির দিকে ইঙ্গিত করেছেন যাতে আরও জটিল পরিস্থিতিতে যেখানে পুরো ডাটাবেসটি শুরু হয় না তার জন্য InnoDB ডাটাবেস পুনরুদ্ধারের জন্য আরও সুনির্দিষ্ট নির্দেশনা রয়েছে: http ://www.softwarepro پروژې.com/resources/programming/t-how-to-fix-mysql -database-myisam-InnoDB-1634.html


1
mysqlcheck 'চেক টেবিল ...' -1
র্যান্ডমেক্স


সত্য না. প্রথমত, mysqlcheck একটি কমান্ড-লাইন ইউটিলিটি এবং চেক টেবিলটি একটি এসকিউএল স্টেটমেন্ট (এটি কমলা তুলনামূলকভাবে লেমনের সাথে তুলনা করার মতো)। এছাড়াও, আপনি এসকিউএল বিবৃতিতে সমস্ত টেবিলের নাম অন্তর্ভুক্ত না করে চেক টেবিলের সাথে একটি সম্পূর্ণ ডাটাবেস পরীক্ষা করতে পারবেন না ( এটি খুব বেশি উত্পাদনশীল হবে না)
মার্সিও

এবং মাইএসকিএল চেকের একটি বিকল্প রয়েছে - টেবিলগুলি দূষিত হয়েছে - অটো-মেরামত করার সময় টেবিলগুলি কেবল টেবিলগুলি ক্ষতিগ্রস্থ হয়েছে কি না তা পরীক্ষা করে দেখুন, তবে কোনও মেরামত করতে পারবেন না।
মার্সিও

2
@ ইরানডিমেল্ডার - মাইএসকিএলচেক এর সমার্থক শব্দটি বলতে ভুল হয় CHECK TABLE। ডকুমেন্টেশন আপনি রাজ্যের লিঙ্ক: " mysqlcheckব্যবহার এসকিউএল স্টেটমেন্ট CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, এবং OPTIMIZE TABLEব্যবহারকারীর জন্য একটি সুবিধাজনক উপায়ে তা যা বিবৃতি অপারেশন আপনি যে কাজটি করতে চান তাদের জন্য ব্যবহার নির্ধারণ করে, এবং তারপর সার্ভারে বিবৃতি কার্যকর করা এ পাঠায়।। " এটি প্রতিশব্দ নয়; যে বিবৃতি সংগ্রহের জন্য একটি ইউজার ইন্টারফেস।
নিক চ্যামাস

6

মতে মাইএসকিউএল 5.0 সার্টিফিকেশন স্টাডি গাইড, পৃষ্ঠা 443.444 অনুচ্ছেদ 30.4 :

আপনি চেক টেবিল কমান্ড ব্যবহার করে বা আপনার পক্ষে বিবৃতি জারি করতে একটি ক্লায়েন্ট প্রোগ্রাম ব্যবহার করে InnoDB টেবিলগুলি পরীক্ষা করতে পারেন। যাইহোক, যদি কোনও ইনোডিবি টেবিলের সমস্যা থাকে তবে আপনি মেরামত টেবিলটি ব্যবহার করে এটি ঠিক করতে পারবেন না কারণ এই বিবৃতিটি কেবল মাইআইএসএএম এর জন্য প্রযোজ্য।

যদি কোনও টেবিল চেক ইঙ্গিত করে যে কোনও ইনোডিবি টেবিলটিতে সমস্যা রয়েছে, আপনার এই টেবিলটি মাইএসকিএলডাম্প দিয়ে ডাম্প করে, ড্রপ করে, এবং সেই ডাম্প থেকে পুনরায় পুনরায় তৈরি করে একটি সুসংগত অবস্থায় ফিরিয়ে আনতে সক্ষম হবেন।

মাইএসকিউএল সার্ভারের ক্র্যাশ বা হোস্টে এটি চালিত হোস্টের ক্ষেত্রে, কিছু ইনোডিবি টেবিলগুলির মেরামতের প্রয়োজন হতে পারে। সাধারণত, সার্ভারটি পুনরায় আরম্ভ করার পক্ষে এটি যথেষ্ট হয় কারণ InnoDB স্টোরেজ ইঞ্জিনটি তার প্রারম্ভিক ক্রমের অংশ হিসাবে স্বতঃ-পুনরুদ্ধার করে। বিরল ক্ষেত্রে, ইনোডিবি স্বতঃ-পুনরুদ্ধারের ব্যর্থতার কারণে সার্ভারটি আরম্ভ হবে না। যদি এটি হয় তবে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:

  • 1 - 6 থেকে রাগের জন্য একটি মান হিসাবে সেট করা --innodb_for_recovery বিকল্পের সাহায্যে সার্ভারটি পুনরায় আরম্ভ করুন values একটি ভাল মান দিয়ে শুরু 4।

  • যখন আপনি সার্ভারটি --innodb_for_recovery একটি অ-শূন্য মান সেট করে শুরু করেন, তখন InnoDB টেবিলস্পেসটিকে কেবল পঠনযোগ্য হিসাবে বিবেচনা করে। ফলস্বরূপ, আপনার MynoDB টেবিলগুলি mysqldump সহ ডাম্প করা উচিত এবং বিকল্পটি কার্যকর হওয়ার সময় সেগুলি ফেলে দিন। তারপরে সার্ভারটি পুনরায় আরম্ভ করুন --innodb_for_recovery বিকল্প ছাড়া। সার্ভারটি উপস্থিত হলে, ডাম্প ফাইলগুলি থেকে InnoDB টেবিলগুলি পুনরুদ্ধার করুন।

  • পূর্ববর্তী পদক্ষেপগুলি ব্যর্থ হলে, পূর্ববর্তী ব্যাকআপ থেকে InnoDB টেবিলগুলি পুনরুদ্ধার করা প্রয়োজন।

দয়া করে InnoDB জোরপূর্বক পুনরুদ্ধারে মাইএসকিউএল ডক্স পড়ুন  


3
এফডব্লিউআইডাব্লু, শংসাপত্রের নির্দেশিকাটির একটি অত্যন্ত রাজনৈতিকভাবে সঠিক উত্তর রয়েছে :) আপনি যদি কোনও ইনোডিবি টেবিলের উপরে টেবিলে পরীক্ষা করেন এবং এটি আসলে দুর্নীতিগ্রস্থ হয় তবে এটি কখনই "দুর্নীতিগ্রস্থ" হিসাবে ফিরে আসবে না, এটি সার্ভারটি ক্র্যাশ করবে। বিবৃতিটি ইনোডিবিতে প্রায় অপ্রচলিত, কারণ আপনি যখনই ইনোডিবি পৃষ্ঠাগুলি পড়েন ততবার এটি দুর্নীতির জন্য পরীক্ষা করছে (পৃষ্ঠা চেকসামের মাধ্যমে)।
মরগান টকার

2

আমি আশ্চর্য হয়েছি যে কেউ যদি ইনোডিবি প্লাগইনের মাধ্যমে তৈরি ইনোডিবি ডেটা ব্যবহার করে এবং তারপরে ইনোডিবি'র অন্য সংস্করণে স্যুইচ করে what এটি mysqld এর দৃষ্টিতে পৃষ্ঠাটি দুর্নীতি তৈরি করতে পারে।

InnoDB ফাইল ফর্ম্যাটে মাইএসকিউএল ডকুমেন্টেশন এই সম্ভাবনা সম্পর্কে কী বলেছে তা নোট করুন :

সাধারণভাবে, ইনোডিবি-র একটি নতুন সংস্করণ এমন একটি টেবিল বা সূচক তৈরি করতে পারে যা ক্রম, হ্যাং, ভুল ফলাফল বা দুর্নীতির ঝুঁকি ছাড়াই ইনোডিবি-র পূর্ব সংস্করণ সহ নিরাপদে পড়া বা লেখা যায় না। InnoDB প্লাগইন এই শর্তগুলি থেকে রক্ষা করার জন্য এবং InnoDB এর ডাটাবেস ফাইল এবং সংস্করণগুলির মধ্যে সামঞ্জস্যতা রক্ষা করতে একটি নতুন প্রক্রিয়া প্রবর্তন করে।

আমি গোলামের উপর ডেটা স্ক্র্যাপ করব। প্রকৃতপক্ষে, আমি কেবল ডেটাটির লজিকাল ডাম্প (মাইএসকিএলডাম্প) পেয়ে ব্রুট ফোর্স ব্যবহার করব:

  • স্লেভটিতে InnoDB ব্যবহার করে সমস্ত ডাটাবেস ফেলে দিন
  • দাসের উপর শাটডাউন মাইএসকিএল
  • আইভডাটা 1, ইব_লগফিল 0 এবং আইভুলগফিল 1 স্লেভটিতে মুছুন
  • দাসের উপর মাইএসকিএল শুরু করুন, ইবদাতা 1, ইব_লগফিল 0 এবং ইব_লগফিল 1 পুনরায় তৈরি করতে দিন
  • মাস্কালডম্প মাস্টার থেকে স্লেভের মধ্যে ডেটা

পোস্ট করা আমার মূল আনসারকে 'পুরাতন স্কুল' হিসাবে বিবেচনা করা হয়। তবুও, এই ক্ষেত্রে, আমি অবশ্যই .bd এবং / অথবা ibdata1 দ্বারা ব্যবহৃত ফাইল ফর্ম্যাটগুলি সন্ধান করব।

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