سؤال

(على ما يبدو) قمنا بتنفيذ محرك قاعدة بيانات Solaris MySQL بشكل سيء الليلة الماضية.على الأقل بعض جداول InnoDB تالفة، مع وجود أخطاء خارج الترتيب في الطابع الزمني في سجل المعاملات، وخطأ محدد حول تلف الفهرس.

نحن نعرف الأدوات المتاحة لإصلاح جدول MyISAM، ولكن لا يمكننا العثور على أي شيء لـ InnoDB.

ملاحظة جانبية:تؤدي محاولة تحسين الجدول (في محاولتي لإعادة بناء الفهرس التالف) إلى تعطل خادم قاعدة البيانات.

هل كانت مفيدة؟

المحلول

وقبل كل شيء <ط> وقف الخادم وصورة القرص . ليست هناك جدوى وجود طلقة واحدة فقط في هذا. ثم نلقي نظرة هنا .

نصائح أخرى

ووقف تطبيق الخاص بك ... أو وقف الرقيق بحيث يتم إضافة أية صفوف جديدة

create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table  <old table>;
insert <old table> select * from <new table>;

وإعادة تشغيل الخادم أو العبد بك

الحل التالي مستوحى من نصيحة ساندرو أعلاه.

تحذير:بينما نجح الأمر بالنسبة لي، لكن لا يمكنني معرفة ما إذا كان سيعمل من أجلك.

مشكلتي كانت كالتالي:قراءة بعض الصفوف المحددة من جدول (دعنا نسمي هذا الجدول broken) قد يؤدي إلى تعطل MySQL.حتى SELECT COUNT(*) FROM broken سوف يقتله.أتمنى أن يكون لديك PRIMARY KEY في هذا الجدول (في النموذج التالي، إنه id).

  1. تأكد من أن لديك نسخة احتياطية أو لقطة لخادم MySQL المعطل (فقط في حالة رغبتك في العودة إلى الخطوة 1 وتجربة شيء آخر!)
  2. CREATE TABLE broken_repair LIKE broken;
  3. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
  4. كرر الخطوة 3 حتى تعطل قاعدة البيانات (يمكنك استخدام LIMIT 100000 ثم استخدم قيمًا أقل حتى يتم الاستخدام LIMIT 1 تعطل قاعدة البيانات).
  5. معرفة ما إذا كان لديك كل شيء (يمكنك المقارنة SELECT MAX(id) FROM broken مع عدد الصفوف في broken_repair).
  6. في هذه المرحلة، يبدو أن لدي جميع الصفوف الخاصة بي (باستثناء تلك التي ربما تم اقتطاعها بوحشية بواسطة InnoDB).إذا فاتتك بعض الصفوف، يمكنك محاولة إضافة OFFSET إلى LIMIT.

حظ سعيد!

وهنا هو الحل التي قدمتها الخلية: http://dev.mysql.com/doc/refman /5.5/en/forcing-innodb-recovery.html

انظر هذا المقال: http://www.unilogica.com/mysql-innodb-recovery/ (إنها باللغة البرتغالية)

تم شرح كيفية الاستخدام innodb_force_recovery و innodb_file_per_table.لقد اكتشفت هذا بعد الحاجة إلى استعادة قاعدة بيانات معطلة بملف واحد ibdata1.

باستخدام innodb_file_per_table، ستقوم جميع الجداول في InnoDB بإنشاء ملف جدول منفصل، مثل MyISAM.

الخطوة 1.

إيقاف خادم MySQL

الخطوة 2.

أضف هذا السطر إلى my.cnf (في نظام التشغيل Windows يطلق عليه my.ini)

set-variable=innodb_force_recovery=6

الخطوه 3.

يمسح ib_logfile0 و ib_logfile1

الخطوة 4.

ابدأ تشغيل خادم MySQL

الخطوة 5.

قم بتشغيل هذا الأمر:

mysqlcheck --database db_name table_name -uroot -p

بعد إصلاح جدول innodb المعطل بنجاح، لا تنس إزالة #set-variable=innodb_force_recovery=6 من my.cnf ثم أعد تشغيل خادم MySQL مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top