it-swarm.asia

لماذا يستمر سجل المعاملات في النمو أو نفاد المساحة؟

يبدو أن هذا السؤال هو سؤال شائع في معظم المنتديات وفي جميع أنحاء الويب ، يتم طرحه هنا في العديد من التنسيقات التي تبدو عادة مثل هذا:

في SQL Server -

  • ما هي بعض الأسباب التي تجعل سجل المعاملات كبيرًا جدًا؟
  • لماذا ملف السجل الخاص بي كبير للغاية؟
  • ما هي بعض الطرق لمنع حدوث هذه المشكلة؟
  • ماذا أفعل عندما أحصل على المسار الصحيح مع السبب الأساسي وأريد أن أضع ملف سجل المعاملات الخاص بي على حجم سليم؟
271
Mike Walsh

إجابة أقصر:

من المحتمل أن يكون لديك إما معاملة طويلة الأمد قيد التشغيل (صيانة الفهرس؟ حذف دفعة كبيرة أو تحديث؟) أو أنك في وضع الاسترداد "الافتراضي" (المزيد أدناه فيما هو المقصود افتراضيًا) Full ولم تقم بذلك تم أخذ سجل النسخ الاحتياطي (أو لا يتم أخذها بشكل متكرر).

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

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


إجابة أطول: ما هي السيناريوهات التي يمكن أن تتسبب في استمرار نمو السجل؟ هناك العديد من الأسباب ، ولكن عادة ما تكون هذه الأسباب من النمطين التاليين: هناك سوء فهم حول نماذج الاسترداد أو توجد معاملات جارية. تابع القراءة للحصول على التفاصيل.

السبب الأول 1/2: عدم فهم نماذج الاسترداد

( التواجد في وضع الاسترداد الكامل وعدم أخذ تسجيل النسخ الاحتياطية - هذا هو السبب الأكثر شيوعًا - الغالبية العظمى من الذين يواجهون هذه المشكلة. )

في حين أن هذه الإجابة ليست غوصًا عميقًا في نماذج استرداد SQL Server ، فإن موضوع نماذج الاسترداد أمر بالغ الأهمية لهذه المشكلة.

في SQL Server ، هناك ثلاثة نماذج الاسترداد :

  • Full ،
  • Bulk-Logged و
  • Simple.

سنتجاهل Bulk-Logged في الوقت الحالي سنقول نوعًا ما إنه نموذج هجين ومعظم الأشخاص الموجودين في هذا النموذج موجودون لسبب ويفهمون نماذج الاسترداد.

الاثنان اللذان نهتم بهما وارتباكهما هو سبب غالبية حالات الأشخاص الذين يعانون من هذه المشكلة هم Simple و Full.

الاستراحة: التعافي بشكل عام

قبل أن نتحدث عن نماذج الاسترداد: لنتحدث عن الاسترداد بشكل عام. إذا كنت تريد التعمق أكثر في هذا الموضوع ، فما عليك سوى قراءة مدونة Paul Randal والعديد من المنشورات عليه كما تريد. بالنسبة لهذا السؤال ، على الرغم من:

  1. تحطم/إعادة تشغيل الاسترداد
    أحد أغراض ملف سجل المعاملات هو = تعطل/إعادة تشغيل الاسترداد. للتدحرج للأمام والتراجع عن العمل الذي تم القيام به (التدحرج إلى الأمام/الإعادة) قبل حدوث عطل أو إعادة تشغيل والعمل الذي بدأ ولكن لم ينته بعد حدوث أعطال أو إعادة تشغيل (التراجع/التراجع). إنها مهمة سجل المعاملات أن ترى أن المعاملة قد بدأت ولكن لم تنته أبدًا (تم التراجع أو التعطل/إعادة التشغيل قبل أن تتم المعاملة). في هذه الحالة من وظيفة السجل أن نقول "مرحبًا .. هذا لم ينتهي أبدًا ، دعنا نعيده" أثناء الاسترداد. إنها أيضًا وظيفة السجل لمعرفة أنك قد أنهيت شيئًا وأنه تم إخبار تطبيق العميل الخاص بك بأنه قد انتهى (حتى لو لم يكن قد وصل إلى ملف البيانات الخاص بك) ويقول "مرحبًا .. حدث هذا بالفعل ، دعنا ننقلها إلى الأمام ، دعنا نجعلها تعتقد أن التطبيقات كانت " بعد إعادة التشغيل. الآن هناك المزيد ولكن هذا هو الغرض الرئيسي.

  2. نقطة في استعادة الوقت
    والغرض الآخر لملف سجل المعاملات هو أن تكون قادرًا على منحنا القدرة على الاسترداد إلى point in time بسبب "عفوًا" في قاعدة بيانات أو لضمان نقطة الاسترداد في حالة فشل الأجهزة التي تتضمن البيانات و/أو ملفات السجل لقاعدة البيانات. إذا كان سجل المعاملات هذا يحتوي على سجلات المعاملات التي تم بدءها وإنهائها للاسترداد ، فيمكن لـ SQL Server ويستخدم هذه المعلومات ثم يستخدم هذه المعلومات للحصول على قاعدة بيانات إلى مكانها قبل حدوث المشكلة. ولكن هذا ليس دائمًا خيارًا متاحًا لنا. لكي ننجح في العمل ، يجب أن يكون لدينا قاعدة البيانات الخاصة بنا على اليمين نموذج الاسترداد ، وعلينا أن نأخذ النسخ الاحتياطي السجل.

نماذج الاسترداد

في نماذج الاسترداد:

  • نموذج استرداد بسيط
    لذا مع المقدمة أعلاه ، من الأسهل التحدث عن نموذج Simple Recovery أولاً. في هذا النموذج ، أنت تخبر SQL Server: "أنا بخير معك باستخدام ملف سجل المعاملات الخاص بك من أجل التعطل وإعادة الاسترداد ..." (ليس لديك حقًا خيار هناك. ابحث عن - خصائص ACID وهذا يجب أن يكون له معنى سريعًا.) "... ولكن بمجرد عدم الحاجة إليه لغرض التعطل/إعادة التشغيل هذا ، استمر وأعد استخدام ملف السجل."

    يستمع SQL Server إلى هذا الطلب في Simple Recovery ويحتفظ فقط بالمعلومات التي يحتاجها لإجراء الاسترداد/إعادة التشغيل. بمجرد أن يتأكد SQL Server من قدرته على الاسترداد لأنه يتم تقسية البيانات في ملف البيانات (أكثر أو أقل) ، فإن البيانات التي تم تصليبها لم تعد ضرورية في السجل وتم وضع علامة عليها للاقتطاع - مما يعني إعادة استخدامها.

  • نموذج الاسترداد الكامل
    باستخدام Full Recovery ، فأنت تخبر SQL Server أنك تريد أن تكون قادرًا على الاسترداد إلى نقطة زمنية محددة ، طالما أن ملف السجل الخاص بك متاح أو إلى نقطة زمنية محددة تكون مغطى بنسخة احتياطية من السجل. في هذه الحالة عندما يصل SQL Server إلى النقطة التي يكون فيها من الآمن اقتطاع ملف السجل في Simple Recovery Model ، فلن يقوم بذلك. وبدلاً من ذلك فإنه يتيح استمرار نمو ملف السجل وسيسمح له بمواصلة النمو ، حتى خذ نسخة احتياطية من السجل (أو نفدت المساحة على محرك ملف السجل) في الظروف العادية.

التبديل من Simple إلى Full لديه Gotcha.

هناك قواعد واستثناءات هنا. سنتحدث عن المعاملات الطويلة الأمد بالتفصيل أدناه.

ولكن من المحاذير التي يجب وضعها في الاعتبار وضع الاسترداد الكامل ما يلي: إذا قمت بالتبديل فقط إلى وضع Full Recovery ، ولكن لم تأخذ نسخة احتياطية كاملة أولية ، فلن يقوم SQL Server احترم طلبك لتكون في نموذج Full Recovery. سيستمر سجل المعاملات في العمل كما كان في Simple حتى تنتقل إلى نموذج الاسترداد الكامل وتأخذ أول Full Backup.

نموذج الاسترداد الكامل بدون النسخ الاحتياطية للسجل سيئ.

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

يحدث هذا كل الوقت للناس.

لماذا هذا خطأ شائع؟

لماذا يحدث كل الوقت؟ لأن كل قاعدة بيانات جديدة تحصل على إعداد نموذج الاسترداد الأولي من خلال النظر في قاعدة بيانات النموذج.

إعداد نموذج الاسترداد الأولي للنموذج دائمًا هو Full Recovery Model - حتى وما لم يغيره أحد. لذا يمكنك القول أن "نموذج الاسترداد الافتراضي" هو Full. كثير من الناس ليسوا على علم بذلك ولديهم قواعد بيانات تعمل في Full Recovery Model مع عدم وجود نسخ احتياطية للسجل ، وبالتالي ملف سجل المعاملات أكبر بكثير من اللازم. هذا هو السبب في أنه من المهم تغيير الإعدادات الافتراضية عندما لا تعمل لمؤسستك واحتياجاتها)

يعد نموذج الاسترداد الكامل مع عدد قليل جدًا من النسخ الاحتياطية للسجل سيئًا.

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

كيف يمكنني معرفة تردد النسخ الاحتياطي للسجل الذي أحتاجه؟

يجب مراعاة تكرار النسخ الاحتياطي للسجل مع مراعاة شيئين:

  1. احتياجات الاسترداد - نأمل أن يكون هذا أولاً. في حالة أن محرك الأقراص الذي يحتوي على سجل المعاملات الخاص بك سيء أو إذا واجهت تلفًا خطيرًا يؤثر على النسخ الاحتياطي للسجل الخاص بك ، فكم من البيانات يمكن فقدانها؟ إذا كان هذا الرقم لا يزيد عن 10-15 دقيقة ، فأنت بحاجة إلى أخذ نسخة احتياطية من السجل كل 10-15 دقيقة ، في نهاية المناقشة.
  2. نمو السجل - إذا كانت مؤسستك جيدة لفقدان المزيد من البيانات بسبب القدرة على إعادة إنشاء ذلك اليوم بسهولة ، فقد يكون من الجيد أن يكون لديك نسخة احتياطية من السجل أقل بكثير بشكل متكرر من 15 دقيقة. ربما تكون مؤسستك على ما يرام كل 4 ساعات. ولكن عليك أن تنظر في عدد المعاملات التي تقوم بإنشائها في 4 ساعات. هل سيؤدي السماح للسجل بالاستمرار في النمو خلال هذه الساعات الأربع إلى جعل ملف السجل كبيرًا جدًا؟ هل يعني ذلك أن النسخ الاحتياطية للسجل تستغرق وقتًا طويلاً؟

السبب الرئيسي 2/2: المعاملات الجارية الطويلة

( "نموذج الاسترداد الخاص بي على ما يرام! السجل لا يزال ينمو! )

يمكن أن يكون هذا أيضًا سببًا في نمو السجل غير المنضبط وغير المقيد. بغض النظر عن نموذج الاسترداد ، ولكنه غالبًا ما يأتي على النحو التالي = "لكنني في نموذج استرداد بسيط - لماذا لا يزال السجل الخاص بي ينمو؟!"

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

إذا كانت لديك معاملة تستغرق وقتًا طويلاً أو تقوم بالكثير من التغييرات ، فلا يمكن قطع السجل عند نقطة التحقق لأي من التغييرات التي لا تزال في المعاملات المفتوحة أو التي بدأت منذ بدء تلك المعاملة.

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

ماذا يمكنني أن أفعل حيال هذه المعاملات الطويلة الأمد؟

يمكنك إنقاذ نفسك هنا عن طريق:

  • تحجيم ملف السجل الخاص بك بشكل صحيح لمراعاة أسوأ سيناريو - مثل الصيانة أو العمليات الكبيرة المعروفة. وعندما تقوم بتطوير ملف السجل الخاص بك ، يجب أن تنظر إلى هذا التوجيه (والارتباطين اللذين ترسلهما إليك) بواسطة Kimberly Tripp. الحجم الصحيح أمر بالغ الأهمية هنا.
  • مشاهدة استخدامك للمعاملات. لا تبدأ معاملة في خادم التطبيق الخاص بك وتبدأ في إجراء محادثات طويلة مع SQL Server والمخاطرة بترك واحدة مفتوحة لفترة طويلة جدًا.
  • مشاهدة المعاملات الضمنية في عبارات DML الخاصة بك. على سبيل المثال: UPDATE TableName Set Col1 = 'New Value' هي معاملة. لم أضع BEGIN TRAN هناك ولا يتعين علي ذلك ، فهي لا تزال معاملة واحدة يتم تنفيذها تلقائيًا عند الانتهاء. لذا ، إذا كنت تجري عمليات على عدد كبير من الصفوف ، ففكر في تجميع هذه العمليات إلى قطع أكثر قابلية للإدارة وإعطاء الوقت اللازم للتعافي. أو النظر في الحجم الصحيح للتعامل مع ذلك. أو ربما ننظر في تغيير نماذج الاسترداد أثناء نافذة التحميل المجمع.

هل ينطبق هذان السببين أيضًا على تسجيل الشحن؟

إجابة قصيرة: نعم. إجابة أطول أدناه.

السؤال: "أنا أستخدم سجل الشحن ، لذلك يتم عمل نسخ احتياطية من السجل تلقائيًا ... لماذا ما زلت أرى نموًا في سجل المعاملات؟"

الجواب: قراءة.

ما هو سجل الشحن؟

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

  • مهمة عمل نسخة احتياطية من السجل على خادم واحد ،
  • مهمة لنسخ ذلك السجل الاحتياطي و
  • وظيفة لاستعادتها بدون استرداد (إما NORECOVERY أو STANDBY) على الخادم الوجهة.

هناك أيضًا بعض الوظائف للمراقبة والتنبيه إذا لم تسر الأمور كما خططت لها.

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


استكشاف الأخطاء وإصلاحها بشكل عام عبر رموز الحالة

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

بالاستعلام عن sys.databases عرض الكتالوج ، يمكنك الاطلاع على معلومات تصف سبب انتظار ملف السجل الخاص بك عند اقتطاع/إعادة استخدام.

يوجد عمود يسمى log_reuse_wait بمعرف بحث لرمز السبب وعمود log_reuse_wait_desc مع وصف لسبب الانتظار. من المقالة الإلكترونية على الإنترنت هي غالبية الأسباب (الأسباب التي من المحتمل أن تراها والأسباب التي يمكن أن نوضح أسبابها. تلك المفقودة إما غير مستخدمة أو للاستخدام الداخلي) مع بعض الملاحظات حول الانتظار في مائل:

  • 0 = لا شيء
    كيف يبدو .. لا يجب الانتظار

  • 1 = نقطة تفتيش
    في انتظار حدوث نقطة تفتيش. يجب أن يحدث هذا ويجب أن تكون بخير - ولكن هناك بعض الحالات التي تبحث عنها هنا للحصول على إجابات أو تعديلات لاحقة.

  • 2 = سجل النسخ الاحتياطي
    أنت في انتظار حدوث نسخة احتياطية من السجل. إما أن يكون لديك جدول زمني لها وسيحدث قريبًا ، أو لديك أول مشكلة تم وصفها هنا وأنت تعرف الآن كيفية إصلاحها

  • 3 = النسخ الاحتياطي أو الاستعادة النشط
    يتم تشغيل عملية النسخ الاحتياطي أو الاستعادة في قاعدة البيانات

  • 4 = معاملة نشطة
    هناك معاملة نشطة تحتاج إلى إكمال (في كلتا الحالتين - ROLLBACK أو COMMIT) قبل أن يتم نسخ السجل احتياطيًا. هذا هو السبب الثاني الموصوف في هذه الإجابة.

  • 5 = النسخ المتطابق لقاعدة البيانات
    إما أن المرآة تتأخر أو تحت بعض الكمون في حالة انعكاس عالية الأداء أو النسخ المتطابق مؤقتًا لسبب ما

  • 6 = التكرار
    قد تكون هناك مشكلات في النسخ المتماثل قد تتسبب في ذلك - مثل عدم تشغيل وكيل قارئ السجلات ، وقاعدة بيانات تعتقد أنه تم وضع علامة للنسخ المتماثل الذي لم يعد موجودًا وأسباب أخرى متنوعة. يمكنك أيضًا مشاهدة هذا السبب وهو أمر طبيعي تمامًا لأنك تنظر في الوقت المناسب تمامًا ، تمامًا مثلما يتم استهلاك المعاملات بواسطة قارئ السجل

  • 7 = إنشاء لقطة قاعدة البيانات
    أنت بصدد إنشاء لقطة قاعدة بيانات ، سترى هذا إذا نظرت في اللحظة المناسبة فقط أثناء إنشاء لقطة

  • 8 = سجل المسح
    ما زلت أواجه مشكلة في هذا الأمر إلى الأبد. إذا نظرت طويلًا بما فيه الكفاية وبشكل متكرر ، يمكنك أن ترى هذا يحدث ، ولكن لا يجب أن يكون سببًا في النمو المفرط لسجل المعاملات ، الذي رأيته.

  • 9 = تقوم نسخة متماثلة ثانوية من مجموعات AlwaysOn Availability بتطبيق سجلات سجل المعاملات لقاعدة البيانات هذه على قاعدة بيانات ثانوية مقابلة. حول أوضح وصف حتى الآن ..

331
Mike Walsh

نظرًا لأنني لست راضيًا حقًا عن أي من الإجابات انتهى على Stack Overflow ، بما في ذلك الاقتراح الذي تم التصويت عليه بشدة ، ولأن هناك بعض الأشياء التي أود أن أتطرق إليها في إجابة مايك لا ، اعتقدت أنني سأقدم مدخلاتي هنا أيضًا. لقد وضعت نسخة من هذه الإجابة أيضًا.

يجب أن يكون حجز ملف السجل أصغر للسيناريوهات حيث واجه نموًا غير متوقع لا تتوقع حدوثه مرة أخرى. إذا كان ملف السجل سينمو إلى نفس الحجم مرة أخرى ، فلا يتم إنجازه كثيرًا عن طريق تقليصه مؤقتًا. الآن ، اعتمادًا على أهداف الاسترداد لقاعدة بياناتك ، هذه هي الإجراءات التي يجب عليك اتخاذها.

أولاً ، خذ نسخة احتياطية كاملة

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

إذا كنت تهتم بالتعافي من وقت لآخر

(ومن خلال التعافي من نقطة إلى أخرى ، أعني أنك تهتم بالقدرة على استعادة أي شيء بخلاف النسخ الاحتياطي الكامل أو التفاضلي.)

من المفترض أن قاعدة البيانات الخاصة بك في وضع الاسترداد FULL. إذا لم يكن كذلك ، فتأكد من أنه:

ALTER DATABASE yourdb SET RECOVERY FULL;

حتى إذا كنت تأخذ نسخًا احتياطية كاملة ومنتظمة ، فسوف ينمو ملف السجل وينمو حتى تقوم بإجراء نسخ احتياطي سجل - هذا لحمايتك ، وليس للتخلص من مساحة القرص بلا داع . يجب إجراء عمليات النسخ الاحتياطي للسجل بشكل متكرر ، وفقًا لأهداف الاسترداد. على سبيل المثال ، إذا كانت لديك قاعدة عمل تنص على أنه يمكنك تحمل فقدان ما لا يقل عن 15 دقيقة من البيانات في حالة وقوع كارثة ، فيجب أن يكون لديك وظيفة تقوم بعمل نسخة احتياطية من السجل كل 15 دقيقة. في ما يلي نص برمجي سينشئ أسماء ملفات ذات طابع زمني بناءً على الوقت الحالي (ولكن يمكنك أيضًا القيام بذلك مع خطط الصيانة وما إلى ذلك ، فقط لا تختار أيًا من خيارات الانكماش في خطط الصيانة ، فهي فظيعة).

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\yourdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

لاحظ أن \\backup_share\ يجب أن يكون على جهاز مختلف يمثل جهاز تخزين أساسي مختلفًا. نسخ هذه النسخ احتياطيًا إلى نفس الجهاز (أو إلى جهاز مختلف يستخدم نفس الأقراص الأساسية ، أو VM الموجود على نفس المضيف الفعلي) لا يساعدك حقًا ، لأنه إذا كان الجهاز تفجير ، لقد فقدت قاعدة البيانات الخاصة بك و النسخ الاحتياطية الخاصة بها. اعتمادًا على البنية التحتية لشبكتك ، قد يكون من المنطقي إجراء النسخ الاحتياطي محليًا ثم نقلها إلى موقع مختلف خلف الكواليس ؛ في كلتا الحالتين ، تريد إزالتها من جهاز قاعدة البيانات الأساسية في أسرع وقت ممكن.

الآن ، بمجرد تشغيل النسخ الاحتياطية العادية للسجل ، يجب أن يكون من المعقول تقليص ملف السجل إلى شيء أكثر معقولية من أي شيء تم تفجيره حتى الآن. هذا لا يعني تشغيل SHRINKFILE مرارًا وتكرارًا حتى يبلغ حجم ملف السجل 1 ميغابايت - حتى إذا كنت تجري نسخًا احتياطيًا للسجل بشكل متكرر ، فإنه لا يزال بحاجة إلى استيعاب مجموع أي معاملات متزامنة يمكن أن تحدث. تعتبر أحداث التسجيل التلقائي لملف السجل باهظة الثمن ، حيث يجب على SQL Server إزالة الملفات من الصفر (بخلاف ملفات البيانات عند تمكين تهيئة الملفات الفورية) ، ويجب أن تنتظر معاملات المستخدم أثناء حدوث ذلك. أنت تريد أن تفعل روتين النمو والتقليص والنمو والتقليص هذا بأقل قدر ممكن ، ولا تريد بالتأكيد جعل المستخدمين يدفعون مقابل ذلك.

لاحظ أنك قد تحتاج إلى عمل نسخة احتياطية من السجل مرتين قبل أن يتقلص (شكرا روبرت).

لذلك ، تحتاج إلى التوصل إلى حجم عملي لملف السجل الخاص بك. لا أحد هنا يمكنه أن يخبرك ما هو ذلك دون معرفة المزيد عن نظامك ، ولكن إذا كنت تقوم بتقليص ملف السجل بشكل متكرر وكان ينمو مرة أخرى ، فمن المحتمل أن تكون العلامة المائية الجيدة أعلى بنسبة 10-50٪ من أكبرها . دعنا نقول أن هذا يصل إلى 200 ميجابايت ، وتريد أن تكون أي أحداث تلقائية لاحقة 50 ميجابايت ، ثم يمكنك ضبط حجم ملف السجل بهذه الطريقة:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

لاحظ أنه إذا كان ملف السجل حاليًا> 200 ميغابايت ، فقد تحتاج إلى تشغيل هذا أولاً:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

إذا كنت لا تهتم بالتعافي في الوقت المناسب

إذا كانت هذه قاعدة بيانات اختبارية ، ولا تهتم لاسترداد نقطة في الوقت ، فيجب عليك التأكد من أن قاعدة البيانات الخاصة بك في وضع الاسترداد SIMPLE.

ALTER DATABASE yourdb SET RECOVERY SIMPLE;

سيضمن وضع قاعدة البيانات في وضع الاسترداد SIMPLE أن SQL Server يعيد استخدام أجزاء من ملف السجل (بشكل أساسي التخلص التدريجي من المعاملات غير النشطة) بدلاً من النمو للاحتفاظ بسجل الكل المعاملات (مثل FULL الاسترداد حتى النسخ الاحتياطي للسجل). CHECKPOINT ستساعد الأحداث في التحكم في السجل والتأكد من أنه لا يحتاج إلى النمو إلا إذا أنتجت الكثير من نشاط سجل t بين CHECKPOINTs.

بعد ذلك ، يجب أن تتأكد تمامًا من أن نمو السجل هذا يرجع حقًا إلى حدث غير طبيعي (على سبيل المثال ، التنظيف السنوي في الربيع أو إعادة بناء أكبر الفهارس الخاصة بك) ، وليس بسبب الاستخدام العادي اليومي. إذا قمت بتقليص ملف السجل إلى حجم صغير بشكل مثير للسخرية ، وكان على SQL Server أن ينموه مرة أخرى لاستيعاب نشاطك الطبيعي ، فماذا ربحت؟ هل تمكنت من الاستفادة من مساحة القرص التي قمت بتحريرها مؤقتًا فقط؟ إذا كنت بحاجة إلى إصلاح فوري ، فيمكنك تشغيل ما يلي:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
-- 200 MB
DBCC SHRINKFILE(yourdb_log, 200);
GO

بخلاف ذلك ، قم بتعيين الحجم المناسب ومعدل النمو. وفقًا للمثال الموجود في حالة الاسترداد عند نقطة زمنية ، يمكنك استخدام نفس الرمز والمنطق لتحديد حجم الملف المناسب وتعيين معلمات النمو الذاتي المعقولة.

بعض الأشياء التي لا تريد القيام بها

  • قم بعمل نسخة احتياطية من السجل باستخدام TRUNCATE_ONLY الخيار ثم SHRINKFILE. لواحد ، هذا TRUNCATE_ONLY تم تجاهل الخيار ولم يعد متاحًا في الإصدارات الحالية من SQL Server. ثانيًا ، إذا كنت في نموذج الاسترداد FULL ، فسيؤدي ذلك إلى تدمير سلسلة السجل الخاصة بك وسيتطلب نسخة احتياطية جديدة كاملة.

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

  • استخدم خيار "تقليص قاعدة البيانات" . DBCC SHRINKDATABASE وخيار خطة الصيانة لفعل الشيء نفسه أفكار سيئة ، خاصة إذا كنت تحتاج فقط إلى حل مشكلة في مشكلة السجل. استهدف الملف الذي تريد تعديله وتعديله بشكل مستقل ، باستخدام DBCC SHRINKFILE أو ALTER DATABASE ... MODIFY FILE (أمثلة أعلاه).

  • تقليص ملف السجل إلى 1 ميجابايت . يبدو هذا مغريًا لأنه ، يتيح لي SQL Server القيام بذلك في سيناريوهات معينة ، وإلقاء نظرة على كل المساحة التي يوفرها! ما لم يتم قراءة قاعدة البيانات الخاصة بك فقط (وهي كذلك ، يجب عليك وضع علامة عليها على هذا النحو باستخدام ALTER DATABASE) ، سيؤدي هذا فقط إلى العديد من أحداث النمو غير الضرورية ، حيث يجب على السجل استيعاب المعاملات الحالية بغض النظر عن نموذج الاسترداد. ما الفائدة من تحرير هذه المساحة مؤقتًا ، حتى يتمكن SQL Server من استعادتها ببطء وبشكل مؤلم؟

  • إنشاء ملف سجل ثانٍ . سيوفر ذلك راحة مؤقتة لمحرك الأقراص الذي ملأ القرص الخاص بك ، ولكن هذا يشبه محاولة إصلاح رئة مثقوبة باستخدام ضمادة. يجب أن تتعامل مع ملف السجل الإشكالي مباشرة بدلاً من مجرد إضافة مشكلة محتملة أخرى. بخلاف إعادة توجيه بعض أنشطة سجل المعاملات إلى محرك أقراص مختلف ، فإن ملف السجل الثاني لا يفعل شيئًا بالنسبة لك (على عكس ملف البيانات الثاني) ، نظرًا لأنه يمكن استخدام ملف واحد فقط من الملفات في المرة الواحدة. يشرح Paul Randal أيضًا لماذا يمكن لدغات متعددة للملفات أن تعضك لاحقًا .

كن استباقيًا

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

أسوأ الإعدادات الممكنة هنا هي نمو 1 ميجابايت أو نمو 10٪. مضحك بما فيه الكفاية ، هذه هي الإعدادات الافتراضية لـ SQL Server (التي اشتكت منها و طلبت تغييرات دون جدوى ) - 1 ميغابايت لملفات البيانات ، و 10٪ لملفات السجل. الأول صغير جدًا في هذا اليوم وهذا العصر ، ويؤدي الأخير إلى أحداث أطول وأطول في كل مرة (على سبيل المثال ، ملف السجل الخاص بك 500 ميجا بايت ، النمو الأول 50 ميجا بايت ، النمو التالي 55 ميجا بايت ، النمو التالي 60.5 ميجا بايت ، إلخ. وما إلى ذلك - وعلى I/O البطيء ، صدقوني ، ستلاحظ هذا المنحنى حقًا).

قراءة متعمقة

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

117
Aaron Bertrand

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

لا يُظهر إعادة تنظيم الفهرس ، ولكنه يُظهر جميع DML وأحداث DDL المختلفة: ALTER ، CREATE ، DROP ، تشغيل/تعطيل الأذونات ، منح/إلغاء الأذونات ، الكائن إعادة تسمية.

ApexSQLLogProject.temp - ApexSQL.log

إخلاء المسؤولية: أعمل في ApexSQL كمهندس دعم

30
Milena Petrovic

هذه هي المشكلة الأكثر شيوعًا لجميع DBAs تقريبًا حيث تنمو السجلات وتملأ القرص.

• ما هي بعض الأسباب التي تجعل سجل المعاملات كبيرًا جدًا؟

  1. معاملة نشطة طويلة
  2. معاملات تسجيل عالية مثل إعادة بناء الفهرس وإعادة التنظيم والإدراج الجماعي والحذف وما إلى ذلك.
  3. أي HA مثل النسخ المتماثل ، تم تكوين النسخ المطابق الذي يحمل السجل ولا يسمح له بتحرير مساحة السجل

• لماذا ملف السجل الخاص بي كبير للغاية؟

تحقق من log_reuse_wait_desc عمود في sys.databases جدول لمعرفة ما الذي يمنع السجلات من قطع:

select name, log_reuse_wait_desc 
from sys.databases

• ما هي بعض الطرق لمنع حدوث هذه المشكلة؟

سوف تساعدك النسخ الاحتياطية للسجل في التحكم في نمو السجل ما لم يكن هناك شيء يمنع السجلات من إعادة استخدامها.

• ماذا أفعل عندما أضع نفسي على المسار الصحيح مع السبب الأساسي وأريد أن أضع ملف سجل المعاملات الخاص بي على حجم سليم؟

إذا كنت قد حددت سبب ذلك بالفعل ، فحاول إصلاحه وفقًا لما هو موضح في الصفحة أدناه.

https://www.brentozar.com/archive/2016/03/my-favorite-system-column-log_reuse_wait_desc/

جدولة النسخ الاحتياطية المناسبة من السجل هي أفضل طريقة للتعامل مع نمو السجل إلا في حالة غير عادية.

7
Ramakant Dadhichi