ذهبت إلى العمل في فترة ما بعد الظهر وشعرت بالصدمة عندما علمت بوجود مشكلة في موقع dedecms الخاص بي، وعندما قمت بزيارته، وجدت خطأً في ملء الشاشة، وقد قمت بفحص سجل mysql وكانت رسالة الخطأ هي:
الجدول '.. تم وضع علامة على dedecmsv4dede_archives على أنها معطلة ويجب إصلاحها،
وتشير الرسالة إلى أن جدول المقالات dede_archives تم وضع علامة عليه على أنه يمثل مشكلة ويحتاج إلى الإصلاح. لذلك قمت بسرعة باستعادة البيانات التاريخية وتوجهت إلى الإنترنت لمعرفة السبب. سيتم حل المشكلة في نهاية المطاف. الحل كالتالي:
ابحث عن أداة bin/myisamchk في دليل تثبيت mysql، وأدخل في سطر الأوامر:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
ثم ستساعدك أداة myisamchk على استعادة الفهرس من جدول البيانات. أعد تشغيل mysql وتم حل المشكلة.
تحليل المشكلة:
1. قال بعض مستخدمي الإنترنت إن هذا خطأ في الفهرس بسبب الاستعلام المتكرر وتحديث جدول dede_archives نظرًا لأن صفحتي لم يتم إنشاؤها بشكل ثابت، ولكنها صفحة ديناميكية، وأنا أتفق تمامًا مع هذا البيان . ويقال أيضًا أن قاعدة بيانات MYSQL قد تعرضت للتلف لسبب ما، على سبيل المثال، انقطاع التيار الكهربائي المفاجئ لخادم قاعدة البيانات، قد تؤدي بعض العمليات على الملف الأصلي للجدول عند تقديم الخدمات لجدول قاعدة البيانات إلى تعطل قاعدة بيانات MYSQL. الجدول تالف ولا يمكن قراءة البيانات. باختصار، الساعة تالفة بسبب بعض المشاكل التي لا يمكن فهمها.
رقم المشكلة هو 145
2. حل المشكلة.
عند محاولة إصلاح مشكلة جدول تالف، هناك ثلاثة أنواع من الإصلاحات. إذا تلقيت رسالة خطأ تفيد بأنه لا يمكن إنشاء ملف مؤقت، فاحذف الملف المشار إليه بالرسالة وحاول مرة أخرى - وهذا عادةً ما يكون استبقاءً من عملية إصلاح سابقة.
الإصلاحات الثلاثة هي كما يلي:
% myisamchk --recover --quick /path/to/tblName
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /path/to/tblName
الأول هو الأسرع ويستخدم لإصلاح المشكلات الأكثر شيوعًا، والأخير هو الأبطأ ويستخدم لإصلاح المشكلات التي لا يمكن حلها بطرق أخرى.
فحص وإصلاح ملفات بيانات MySQL إذا لم تتمكن الطرق المذكورة أعلاه من إصلاح جدول تالف، قبل أن تستسلم، يمكنك أيضًا تجربة هاتين النصيحتين:
إذا كنت تشك في حدوث خطأ لا يمكن إصلاحه في ملف الفهرس (*.MYI) الخاص بالجدول، أو حتى فقدان الملف، فيمكنك استخدام ملف البيانات (*.MYD) وملف تنسيق البيانات (*.frm) لإجراء تجديده. قم أولاً بعمل نسخة من ملف البيانات (tblName.MYD). أعد تشغيل خدمة MySQL واتصل بها. استخدم الأمر التالي لحذف محتويات الجدول:
الخلية> حذف من tblName؛
أثناء حذف محتويات الجدول، سيتم إنشاء ملف فهرس جديد. قم بتسجيل الخروج وأغلق الخدمة مرة أخرى، ثم قم باستبدال ملف البيانات الجديد (الفارغ) بملف البيانات الذي قمت بحفظه للتو (tblName.MYD). أخيرًا، استخدم myisamchk لإجراء إصلاح قياسي (الطريقة الثانية أعلاه) لإعادة إنشاء بيانات الفهرس استنادًا إلى محتويات بيانات الجدول وملف تنسيق الجدول.
إذا كان ملف تنسيق الجدول الخاص بك (tblName.frm) مفقودًا أو يحتوي على خطأ لا يمكن إصلاحه، ولكنك تعرف كيفية استخدام عبارة CREATE TABLE المقابلة لإعادة إنشاء الجدول، فيمكنك إعادة إنشاء ملف .frm جديد واستخدامه مع ملفات البيانات الخاصة بك وملفات الفهرس (إذا كانت هناك مشكلة في ملف الفهرس، فاستخدم الطريقة المذكورة أعلاه لإعادة إنشاء ملف جديد). قم أولاً بعمل نسخة من ملفات البيانات والفهرس، ثم قم بحذف الملفات الأصلية (احذف جميع السجلات المتعلقة بهذا الجدول في دليل البيانات).
ابدأ تشغيل خدمة MySQL وأنشئ جدولًا جديدًا باستخدام ملف CREATE TABLE الأصلي. من المفترض أن يعمل الملف .frm الجديد بشكل جيد، ولكن من الأفضل إجراء إصلاح قياسي (الطريقة الثانية أعلاه).
3. مقدمة إلى أداة myisamchk (راجع الدليل الرسمي لـ mysql).
يمكنك استخدام الأداة المساعدة myisamchk للحصول على معلومات حول جداول قاعدة البيانات أو لفحصها وإصلاحها وتحسينها. ينطبق myisamchk على جداول MyISAM (الجداول المقابلة لملفات .MYI و .MYD).
طريقة الاتصال بـ myisamchk:
shell> myisamchk [خيارات] tbl_name ...
تحدد الخيارات ما تريد أن يفعله myisamchk. تم وصفها لاحقا. يمكنك أيضًا الحصول على قائمة بالخيارات عن طريق الاتصال بـ myisamchk --help.
tbl_name هو جدول قاعدة البيانات الذي تريد فحصه أو إصلاحه. إذا لم تقم بتشغيل myisamchk في مكان ما في دليل قاعدة البيانات، فيجب عليك تحديد المسار إلى دليل قاعدة البيانات لأن myisamchk لا يعرف مكان وجود قاعدة البيانات الخاصة بك. في الواقع، لا يهتم myisamchk بما إذا كان الملف الذي تعمل عليه موجودًا في دليل قاعدة البيانات؛ يمكنك نسخ الملف المقابل لجدول قاعدة البيانات في مكان آخر وإجراء عملية الاستعادة هناك.
إذا كنت ترغب في ذلك، يمكنك استخدام سطر الأوامر myisamchk لتسمية عدة جداول. يمكنك أيضًا تحديد جدول عن طريق تسمية ملف الفهرس (مع اللاحقة ".MYI"). يسمح لك بتحديد كافة الجداول في الدليل باستخدام المخطط "*.MYI". على سبيل المثال، إذا كنت في دليل قاعدة البيانات، فيمكنك التحقق من جميع جداول MyISAM الموجودة في الدليل مثل هذا:
shell> myisamchk *.MYI
إذا لم تكن في دليل قاعدة البيانات، فيمكنك التحقق من جميع الجداول هناك عن طريق تحديد المسار إلى الدليل:
Shell> myisamchk /path/to/database_dir/*.MYI
يمكنك أيضًا التحقق من جميع الجداول في جميع قواعد البيانات عن طريق تحديد حرف بدل للمسار إلى دليل بيانات MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
الطريقة الموصى بها للتحقق بسرعة من جميع جداول MyISAM هي:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
إذا كنت تريد التحقق من جميع جداول MyISAM وإصلاح أي جداول تالفة، فيمكنك استخدام الأمر التالي:
shell> myisamchk --silent --force --fast --update-state
-O key_buffer=64M -Osort_buffer=64M
-يا read_buffer=1M -O write_buffer=1M
/path/to/datadir/*/*.MYI
يفترض هذا الأمر أن لديك أكثر من 64 ميجا بايت من الذاكرة الحرة. للحصول على تفاصيل حول تخصيص الذاكرة باستخدام myisamchk، راجع القسم 5.9.5.5، "استخدام الذاكرة myisamchk".
عند تشغيل myisamchk، يجب عليك التأكد من عدم استخدام البرامج الأخرى للجدول. بخلاف ذلك، عند تشغيل myisamchk، سيتم عرض رسالة الخطأ التالية:
تحذير: العملاء يستخدمون الجدول أو لم يغلقوه بشكل صحيح
يشير هذا إلى أنك تحاول التحقق من جدول يتم تحديثه بواسطة برنامج آخر (مثل خادم mysqld) لم يغلق الملف أو أنهى دون إغلاق الملف بشكل صحيح.
إذا كان mysqld قيد التشغيل، فيجب عليك فرض مسح أي تعديلات على الجدول لا تزال في الذاكرة عبر FLUSH TABLES. عند تشغيل myisamchk، يجب عليك التأكد من عدم استخدام البرامج الأخرى للجدول. أسهل طريقة لتجنب المشكلة هي استخدام CHECK TABLE بدلاً من myisamchk للتحقق من الجدول.