كيف أقوم بإصلاح جدول InnoDB؟
سؤال
(على ما يبدو) قمنا بتنفيذ محرك قاعدة بيانات 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
).
- تأكد من أن لديك نسخة احتياطية أو لقطة لخادم MySQL المعطل (فقط في حالة رغبتك في العودة إلى الخطوة 1 وتجربة شيء آخر!)
CREATE TABLE broken_repair LIKE broken;
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
- كرر الخطوة 3 حتى تعطل قاعدة البيانات (يمكنك استخدام
LIMIT 100000
ثم استخدم قيمًا أقل حتى يتم الاستخدامLIMIT 1
تعطل قاعدة البيانات). - معرفة ما إذا كان لديك كل شيء (يمكنك المقارنة
SELECT MAX(id) FROM broken
مع عدد الصفوف فيbroken_repair
). - في هذه المرحلة، يبدو أن لدي جميع الصفوف الخاصة بي (باستثناء تلك التي ربما تم اقتطاعها بوحشية بواسطة 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 مرة أخرى.