it-swarm.asia

لماذا تتعطل جداول MySQL؟ كيف أمنعها؟

أنا مسؤول موقع Moodle الذي به جدول المستخدمين تالف وأصبح غير قابل للاستخدام.

لحسن الحظ ، بسيط REPAIR TABLE mdl_user جعلها تعمل مرة أخرى. الشيء هو أنني لا أعرف لماذا تحطمت بالفعل وجعلتها غير قابلة للاستخدام ، وأريد أن أتأكد من أنني مستعد بشكل أفضل في المرة القادمة.

أنا لست DBA ذو خبرة كاملة - أنا مجرد مطور يقوم بالكثير من الأشياء ، لذا يرجى أن تتحمل معي.

يمكنني فقط استعادة نسخة احتياطية ، ولكن أعتقد أن هناك طرقًا لمنع الأعطال.

هذه الجداول هي utf8_general_ci وتستخدم MyISAM.

لماذا يتعطل جدول MySQL؟ ماذا يمكنني أن أفعل لمنع حدوث ذلك؟

9
AeroCross

من السهل إلى حد ما أن تتعطل طاولة MyISAM.

يوجد في رأس كل جدول MyISAM عداد يتتبع عدد مقابض الملفات المفتوحة الموجودة على الجدول.

إذا قمت بتشغيل mysql ولم يتطابق الرقم الموجود في الرأس مع عدد مقابض الملفات الفعلية مقابله ، فإن mysqld يعامل الجدول على أنه معطل.

لو بسيط REPAIR TABLE mdl_user يجعله يعمل مرة أخرى في كل مرة دون فقدان البيانات ، قد يشير هذا إلى أن لديك موقعًا يتم الاتجار به بشدة ويكتب على mdl_user.

إذا تطلبت عشرات الجداول هذا REPAIR TABLE ، سوف أقوم بتحويل جميع الجداول إلى InnoDB. ومع ذلك ، إذا كان mdl_user الجدول هو الجدول الوحيد مع هذه المشكلة ، هناك شيء يمكنك القيام به (على سبيل المثال ، لنفترض أن قاعدة البيانات هي moodle) ؛

إذا كنت تريد ترك كافة الجداول كـ MyISAM

الخطوة 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: إعادة تشغيل الخلية

ستؤدي كل إعادة تشغيل لـ mysql إلى تشغيل برنامج Table Repair

إذا كنت تريد أن تصبح جميع الجداول InnoDB

قم بتشغيل هذا الكود لعمل نص تحويل مجمع لجداول MyISAM إلى 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 بتوقيت شرق الولايات المتحدة

@ Kevin أثناء استخدام MyISAM ، ماذا لو نفدت مساحة القرص لديك؟

إليك شيء يجب مراعاته: وفقًا لـ دليل دراسة شهادة MySQL 5.0 ،

enter image description here

النقطة الفرعية رقم 11 تقول ما يلي في الصفحات 408،409 القسم 29.2:

إذا نفدت مساحة القرص أثناء إضافة صفوف إلى جدول MyISAM ، فلن يحدث أي خطأ. يقوم الخادم بتعليق العملية حتى تصبح المساحة متاحة ، ثم يكمل العملية.

عند نفاد مساحة القرص ، لا تغلق أو تقتل الخلية فقط. لن يتم مسح عدد مقابض الملفات المفتوحة في MyISAM المستخدمة حاليًا. وهكذا ، تم وضع علامة على الجدول MyISAM تحطمها. إذا كان بإمكانك تحرير مساحة على القرص في حجم البيانات مع استمرار تشغيل mysqld ، فسيتم تشغيل الخلية على حالما يتم توفير مساحة على القرص.

11
RolandoMySQLDBA

أنا أيضا إدارة موقع موودل على الخلية ، والسبب الأكثر شيوعا لتلف الجدول بالنسبة لنا هو نفاد مساحة القرص.

0
Kevin