سؤال

يتم نسخ البيانات من نظام آخر إلى قاعدة بيانات SQL Server 2005 في الوقت الفعلي (خلال اليوم، مئات المعاملات في الثانية) باستخدام Goldengate.أود أن أكون قادرًا على معرفة ما إذا كانت هناك معاملة مؤخرًا، مما سيخبرني ما إذا كان النسخ المتماثل يحدث حاليًا.حتى في غير ساعات العمل، يمكنني أن أتوقع إجراء معاملة كل بضع دقائق، على الرغم من أنني لا أعرف أي من الجداول الأربعمائة ستدخل فيها.

ها هي عمليتي الحالية:

  1. تشغيل اللولب على الجدول المنسوخ الأكثر شيوعًا
  2. يتم تحديث التاريخ في جدول "إشعارات المزامنة" في كل مرة يوجد فيها أي نشاط على هذا الجدول
  3. يتم تشغيل مهمة SQL Agent كل بضع دقائق وتقارن هذا التاريخ بـ GETDATE().إذا كان طويلا جدا، فإنه يرسل لي رسالة عبر البريد الإلكتروني.

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

هل هناك أي اقتراحات أخرى غير إضافة نفس المشغل إلى كل جدول في قاعدة البيانات؟إذا قمت بإضافة المشغلات، فكيف يمكنني منع حالة الجمود والتنافس في جدول "إشعارات المزامنة"؟نظرًا لأنني لا أهتم بأن يكون التاريخ الأحدث دقيقًا خلال فترات التنافس الشديد، فهل هناك طريقة يمكنني من خلالها أن أطلب من SQL محاولة تحديث التاريخ ولكن فقط تخطيه إذا قامت عملية أخرى بتأمينه؟

الخيار الوحيد "على مستوى التطبيق" الذي أملكه هو توصيل TELNET إلى شاشة Goldengate والمطالبة بتأخر النسخة المتماثلة، ثم مسح النتائج من الشاشة.أنا منفتح على ذلك، ولكني أرغب في القيام بشيء من جانب SQL إذا كان ذلك أكثر جدوى.

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

المحلول

هل هذا لوظيفة آلية أم شيء تريد إلقاء نظرة عليه بين الحين والآخر؟إذا كان الخيار الأخير، فيمكنك استخدام أداة فحص سجل المعاملات (Redgate Log Rescue، Apex SQLLog، وربما غيرها).

هناك خيار آخر مفتوح لك وهو إلقاء نظرة على sysindexes (SQL Server 2000:dbo.sysindex;2005:sys.sysindexes).العمود Rowmodctr (على حد تعبير MSDN) "حساب العدد الإجمالي للصفوف المدرجة أو المحذوفة أو المحدثة منذ آخر مرة تم فيها تحديث إحصائيات الجدول".قد لا يُرجع كل ما تحتاج إلى معرفته، ولكن بشرط أن يكون لديك فهارس تغطية، فإنه سيعطي إشارة إلى عدد التغييرات التي حدثت ومكانها إذا تم أخذ عينات منها على أساس منتظم.

نصائح أخرى

يمكنك التحقق SELECT * FROM ::fn_dblog(@startLSN, NULL) ومعرفة ما إذا كان أي LOP_MODIFY_ROW حدثت العملية منذ آخر فحص (منذ آخر LSN قمت بالتحقق منه).

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