كيف أستطيع تغيير محرك قاعدة البيانات لعدة جداول دفعة واحدة

لدي قاعدة بيانات تحتوي على جداول بعضها MyISAM والبعض الآخر InnoDB

يمكنني تحويل جداول MyISAM إلى InnoDB باستخدام الأمر:

alter table table_name engine = InnoDB

سؤالي: لنفترض أن لدي عدد (20) جدول MyISAM وأرغب في تحويلها. هل يوجد أمر يمكنني من تحويل هذه الجداول كلها دفعة واحدة وليس واحدا تلو الآخر؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

مرحبا صديقي :)

للأسف لا أمتلك إجابة على سؤالك، لكن يُمكنك طرحه في قسم الأسئلة والأجوبة على أكاديمية حسوب:

ربّما تجد من لديه الخبرة الكافية للإجابة :)

يوسف سيد أضف ردا

أخي عبد الهادي، لماذا أنت مُصِرٌّ على السؤال هنالك؟ قسم الأسئلة هنالك كئيبٌ ومملٌ؛ لا يشجع على المشاركة :)

يوسف سيد أضف ردا

أذكر أني فعلت ذلك مرة باستخدام SQL فقط، عمومًا توصلت إلى أن أبدأ بإسعلام الجداول من قاعدة البيانات عبر Information_schema؛ مما سيعطي حرية بكتابة تعليمة لكل جدول على حدى لتغييره إلى innoDB عبر الدالة CONCAT من ثم جمعهم مع بعضهم البعض باستخدام الدالة GROUP_CONCAT وجعل الفاصلة بينهم ';' إذًا يكون لدينا اسعلامات لتغيير الجداول كلها نقوم بتنفيذها عبر استعلام ابن، مثال:

SELECT ( 
    SELECT GROUP_CONCAT(CONCAT('ALTER TABLE DBNAME.', TABLE_NAME, ' ENGINE=InnoDB') SEPARATOR ';') AS TQ
    FROM Information_schema.TABLES 
    WHERE TABLE_SCHEMA = 'DBNAME'  
    AND ENGINE = 'MyISAM' AND TABLE_TYPE = 'BASE TABLE'
);

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

شكرا يوسف.

نسيت أن أذكر أني أعمل على MySQL (وتحديدا MariaDB إن كان هناك فرق).

جربت الاستعلام الذي ذكرته. لم يظهر لي أخطاء. تم تحديد الجداول بشكل صحيح. ولكن .. لم يتغير شيء :-)

نسيت أن أذكر أني أعمل على MySQL (وتحديدا MariaDB إن كان هناك فرق).

عرفت ذلك عندما كتبتَ innoDB.

بما أنه عمل بدون أخطاء هل يعمل الإستعلام التالي "alter table table_name engine = InnoDB

"؟؛ إن لم يعمل يبدواْ أنّ لديك مشكلة شاهد هذا السؤال

وهذا:

أهلا سيد.

راجعت مثالك مرة أخرى ووجدت مثال آخر شبيه له:

SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME,' ENGINE=InnoDB;') 
FROM Information_schema.TABLES
WHERE TABLE_SCHEMA = 'DBNAME'
AND ENGINE = 'MyISAM' AND TABLE_TYPE = 'BASE TABLE'

لكني وجدت أن الهدف من هذه الطريقة هو سرد قائمة بالأوامر المطلوب تشغيلها. ثم تشغيل هذه الأوامر واحدا تلو الآخر عبر النسخ واللصق!

إذًا يكون لدينا استعلامات لتغيير الجداول كلها نقوم بتنفيذها عبر استعلام ابن

لم أفهم كيف يمكن تشغيل أمر alter عبر استعلام select

(أعذرني .. لست بذلك المحترف في MySQL)

حقيقةً لا أتذكر كيف صنعته مسبقًا، عمومًا كما أخبرتك مسبقًا هل أمر alter يعمل وحده؟

الشيفرة التي لديك يمكنك استخدامها على مرتين أي النتائج ستقوم باستعلامها مرة أخرى، عبر النسخ واللصق أو بكتابة برمجية -بلغة PHP مثلًا- تقوم بالأمر.

لم أفهم كيف يمكن تشغيل أمر alter عبر استعلام select

(أعذرني .. لست بذلك المحترف في MySQL)

ما أعرفه أنّ select بهذا الشكل select() يمكن كتابة نتائج استعلام بها كإسعلام آخر، وإلا كانت يجب أن تخرج خطأً!، لا أفهم كيف لا تخرج خطأ ولاتعمل إذًا!. ولا أنا لستُ بالمحترف في MySQl لم أعد أستخدمها أبدًا؛ إلا لو اضطرورتُ لذلك.

نعم alter يعمل على الجدول ولا توجد مشكلة في المحركات.

طرحت نفس السؤال في الأكاديمية، بمكنك المتابعة على هذا الرابط:

عرفت الحل عندما نقلته شاهد الرد هنالك.

@عبد الهادي يبدو أنك كنت محقًا :)