هندسة البيانات / دليل حلول تحريري
تشخيص البيانات المكررة أو المفقودة بعد الإعادة
تتبع هوية الحدث وحد المؤشر والنشر المقبول قبل إعادة دفعة فاشلة، وميز العمل المحاول والأثر المقبول الدائم.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
قد تضاعف إعادة التشغيل المجاميع، أو يفقد انقطاع صفحة سجلات، أو تبلغ نقطة الحفظ تقدماً يتجاوز بيانات الوجهة المرئية. لا تثبت محاولة مجدول ناجحة اكتمال التسليم. احفظ الفترة المتأثرة والهويات المتوقعة المعلومة قبل إعادة أخرى قد تغير الأدلة أو تضيف آثاراً مكررة جديدة.
افهم الأسباب المحتملة
- تشمل الأسباب استخدام هوية المحاولة بدلاً من الحدث، وصفحات تعتمد الوقت وحده، وتعارضاً يخفيه DO NOTHING، وحفظ التقدم قبل الأثر، أو فقد رد تتبعه عملية جديدة غير آمنة للتكرار. قد يعيد التداخل والتصحيحات المتأخرة سجلات المصدر عمداً؛ لذلك لا يعد تكرار المدخل عيب مصدر تلقائياً.
حدد فترة واحدة وآخر حد مقبول
سجل إصدار المصدر والفترة المنطقية والمؤشر قبل وبعد وإصدار الوجهة والتحويل وهوية المحاولة من الأدلة الموجودة المصرح بها. افصل القراءة الخالية الناجحة عن الجلب الفاشل. حدد الآثار التي حُفظت فعلاً والإقرارات التي ضاعت. لا تبدأ بتصفير مؤشر مشترك أو حذف أقسام الوجهة أو إعادة التاريخ كاملاً. يحتاج التصحيح نطاق مالك المجموعة وخطة رجوع ومصالحة، مع استبعاد الحمولات الخاصة من سجلات الحادث العامة.
عد المحاولات والأحداث المنطقية منفصلة
يحدد البرنامج المحلي الكامل وسوم أحداث مكررة في قائمة تسليم مخترعة. لا يقرر تطابق المحتوى المعاد أو أي آثار حدثت في الوجهة. قارن هوية المصدر والمحتوى أو الإصدار، ثم افحص قاعدة التفرد والتحديث الفعلية للوجهة. قد يمنع مفتاح حدث مستقر تكرار الصفوف ويخفي مع ذلك تصحيحاً متعارضاً. احفظ دليل المحاولة للتشخيص، ولا تمنح كل إعادة هوية عمل جديدة لمجرد نجاح إدراجها.
from collections import Counter
deliveries = ['e1', 'e1', 'e2']
counts = Counter(deliveries)
duplicates = sorted(key for key, count in counts.items() if count > 1)
print(f'attempts={len(deliveries)} unique={len(counts)} duplicates={duplicates}')
attempts=3 unique=2 duplicates=['e1']
تحوي ثلاث محاولات هويتين، مع تكرار e1. لا يستعلم البرنامج مصدراً أو مجدولاً أو وجهة.
افحص كل مكون لحد الصفحة
قد يتخطى شرط أكبر من الوقت وحده صفوفاً تشارك الطابع النهائي. يقارن البرنامج المحلي الثاني هذا الحد الخاطئ بمؤشر مركب من الوقت والمعرف. إنه يوضح قاعدة ترتيب مضبوطة لا ضمان لقطة لمصدر متغير. أكد سياسة null وفرادة التعادل وتطابق ORDER BY والشرط الفعليين بالمحرك المختار. قد يحتاج الحذف التاريخي النهائي أو التحديث المؤرخ للخلف CDC أو مصالحة أعمق؛ فلا يستعيد تمديد تداخل قصير تغييرات مفقودة قديمة بلا حد.
rows = [(10, 1), (10, 2), (11, 3)]
cursor = (10, 1)
wrong = [row[1] for row in rows if row[0] > cursor[0]]
correct = [row[1] for row in rows if row > cursor]
print(f'timestamp_only_ids={wrong}')
print(f'complete_cursor_ids={correct}')
timestamp_only_ids=[3]
complete_cursor_ids=[2, 3]
يختفي المعرف2 مع المؤشر الناقص، ويبقى مؤهلاً مع الترتيب الكامل المعلن.
أصلح الأثر والتقدم ببروتوكول معلن
إذا اشترك الأثر والنقطة في حد معاملاتي مدعوم، فانشرهما معاً. وإلا فاتبع بروتوكول الهوية والمصالحة الموثق، ولا تفترض أن إعادة المجدول معاملة موزعة. حد الإصلاح بتاريخ مدخل معلوم وإصدارات وجهة مقبولة. افحص تعارض الهوية نفسها صراحة، واحفظ دليل الحذف والإصدار حيث يلزم، ونسق استبدال اللاحق كيلا تضاف المجاميع المصلحة ثانية. الأمثلة حسابات اصطناعية؛ لا يصلح الدليل قاعدة أو يغير مؤشراً أو يعيد إنتاجاً فعلياً.
تحقق من نجاح الإصلاح
في عينة معزولة، اقطع التنفيذ قبل الأثر، وبين الأثر والتقدم، وبعد الحفظ وقبل الرد. أعد المدخل المنطقي نفسه وقارن المفاتيح الدقيقة وعد مرات الحدوث وإصدارات المحتوى والمجاميع ذات المعنى. تأكد من تطابق النقطة المقبولة مع الوجهة، ومن استبدال المستهلكين النشر السابق أو تحديثه كما قصد. لا تكفي حالة مهمة ناجحة وحدها.
امنع تكرار المشكلة
- مركز قواعد الهوية والمؤشر، وثبت إصداري المدخل والتحويل، واحفظ تاريخ الإعادة مدة تكفي للتعافي. ميز المرفوض والخلو والفشل المؤقت والتكرار المتعارض، وراجع ذرية النقطة والوجهة عند تغيير الوجهة أو الموصل.