HeadlinesBriefing favicon HeadlinesBriefing.com

خطأ ترقية نسخة MySQL المطابقة: عدم تطابق AUTO_INCREMENT

Hacker News •
×

أدى ترقية MySQL الروتينية على AWS RDS إلى تشغيل مشكلة تلف بيانات صامتة عند ترقية نسخة خضراء. بعد ترقية النسخة والتحقق من وظائفها، قام المؤلف بالتبديل إلى حركة المرور. بعد ساعة، ظهر خطأ حرج: كان لجدول واحد (الجدول X) أرقام زيادة تلقائية مُعينة بترتيب مختلف على النسخة مقارنة بالمصدر. كان الصف الذي كان يحمل سابقًا المعرف 1 الآن يحمل المعرف 26.

يعود السبب الجذري إلى ترقية سابقة أضافت مفتاحًا أساسيًا AUTO_INCREMENT إلى الجدول X عبر `ALTER TABLE X ADD COLUMN id INT NOT NULL AUTO_INCREMENT PRIMARY KEY`. تم تحديث ست جداول ذات صلة للإشارة إلى هذا المعرف الجديد باستخدام عبارات UPDATE تعتمد على JOIN. ومع ذلك، تحذر وثائق MySQL من أن إضافة أعمدة AUTO_INCREMENT إلى الجداول المكررة قد تنتج ترتيب صفوف مختلف على المصدر والنسخة اعتمادًا على محرك التخزين وترتيب المعالجة.

ظهر الاختلاف بسبب تنسيق سجل الثنائي لقاعدة بيانات المصدر `binlog_format=MIXED`. قامت خمس جداول بتحديث عبارات UPDATE الخاصة بها في وضع STATEMENT، مما تسبب في النسخة بإعادة تنفيذ عملية JOIN مقابل قيم المعرف المحلية (المختلفة) — مما أدى إلى تعيين المراجع بشكل صحيح. لكن الجدول السادس، الذي كان يحتوي أيضًا على عمود AUTO_INCREMENT، تم اعتباره غير آمن للتكرار القائم على العبارات وسُجل في وضع ROW. قامت النسخة بتطبيق تغييرات الصف الخام من المصدر، ونسخ قيم `x_id` التي تم إنشاؤها في المصدر والتي أصبحت الآن تشير إلى صفوف خاطئة على النسخة.

تسببت هذه التفاعل الدقيق بين ترتيب تعيين AUTO_INCREMENT، وتسجيل الثنائي MIXED، واكتشاف العبارات غير الآمنة في فشل سلامة الإشارة الصامت. يحذر المؤلف من أن مثل هذه المشكلات سهلة التغافل عنها أثناء الترقية ولكنها يمكن أن تفسد البيانات بسرعة.

الكيانات الرئيسية: الشركات: AWS، MySQL