استكشاف أخطاء سجل المعاملات وإصلاحها باستخدام قاعدة بيانات azure SQL والمثيل المدار لـ Azure SQL

ينطبق على: Azure SQL Database مثيل Azure SQL المُدار

قد تشاهد أخطاء مثل 9002 أو 40552 عندما يكون سجل المعاملة ممتلئاً ولا يمكن قبول المعاملات الجديدة. تحدث هذه الأخطاء عندما يتجاوز سجل معاملات قاعدة البيانات، الذي تديره قاعدة بيانات Azure SQL أو المثيل المدار Azure SQL، حدود المساحة ولا يمكنه الاستمرار في قبول المعاملات.

تشبه هذه الأخطاء المشكلات الموجودة في سجل معاملات كامل في SQL Server ولكن لها دقة مختلفة في قاعدة بيانات azure SQL أو المثيل المدار Azure SQL.

ملاحظة

تركز هذه المقالة على قاعدة بيانات SQL Azure والمثيل المدار SQL Azure. تستند قاعدة بيانات azure SQL ومثيل Azure SQL المدار إلى أحدث إصدار مستقر من مشغل قاعدة بيانات Microsoft SQL Server، لذلك فإن الكثير من المحتوى مشابه على الرغم من أن خيارات وأدوات استكشاف الأخطاء وإصلاحها قد تختلف. للحصول على مزيد من المعلومات حول استكشاف أخطاء سجل المعاملات وإصلاحها في SQL Server، راجع استكشاف أخطاء سجل المعاملات الكامل (SQL Server خطأ 9002).

النسخ الاحتياطية التلقائية وسجل المعاملات

هناك بعض الاختلافات الرئيسية في قاعدة بيانات azure SQL والمثيل المدار Azure SQL فيما يتعلق بإدارة مساحة ملف قاعدة البيانات.

  • في قاعدة بيانات azure SQL أو Azure SQL المثيل المدار، يتم إجراء النسخ الاحتياطي لسجل المعاملات تلقائياً. للحصول على التردد، والاحتفاظ، والمزيد من المعلومات، راجع النسخ الاحتياطية التلقائية - قاعدة بيانات Azure SQL & ومثيل SQL المُدار.
  • في قاعدة البيانات Azure SQL، تتم إدارة مساحة القرص الحرة ونمو ملف قاعدة البيانات وموقع الملف أيضا، لذلك تختلف الأسباب والحلول النموذجية لمشكلات سجل المعاملات عن SQL Server.
  • في المثيل المدار Azure SQL، لا يمكن إدارة موقع واسم ملفات قاعدة البيانات، ولكن يمكن للمسؤولين إدارة ملفات قاعدة البيانات وإعدادات النمو التلقائي للملفات. الأسباب النموذجية وحلول مشكلات سجل المعاملات مشابهة SQL Server.

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

منع اقتطاع سجل المعاملة

لاكتشاف ما يمنع اقتطاع السجل في حالة معينة، راجع log_reuse_wait_desc في sys.databases. انتظار إعادة استخدام السجل يخبرك بما هي الشروط أو الأسباب التي تمنع سجل المعاملة من اقتطاعه بواسطة نسخة احتياطية عادية للسجل. لمزيد من المعلومات، راجع sys.databases (Transact-SQL).

SELECT [name], log_reuse_wait_desc FROM sys.databases;

قد تشير القيم التالية لـ log_reuse_wait_desc في sys.databases إلى السبب في منع اقتطاع سجل معاملات قاعدة البيانات:

log_reuse_wait_desc التشخيص الاستجابة المطلوبة
لا يوجد شيء الحالة النموذجية. لا يوجد شيء يمنع السجل من الاقتطاع. كلا.
نقطة فحص هناك حاجة إلى نقطة فحص لاقتطاع السجل. نادر. لا حاجة إلى استجابة ما لم يتم الحفاظ عليها. في حالة الاستمرار قم بتقديم طلب دعم من خلال Azure Support.
نسخة احتياطية للسجل نسخة احتياطية للسجل قيد التقدم. لا حاجة إلى استجابة ما لم يتم الحفاظ عليها. في حالة الاستمرار قم بتقديم طلب دعم من خلال Azure Support.
النسخ الاحتياطي النشط أو الاستعادة نسخة احتياطية لقاعدة بيانات قيد التقدم. لا حاجة إلى استجابة ما لم يتم الحفاظ عليها. في حالة الاستمرار قم بتقديم طلب دعم من خلال Azure Support.
معاملة نشطة معاملة جارية تمنع اقتطاع السجل. لا يمكن اقتطاع ملف السجل بسبب المعاملات النشطة و/أو غير المنفذة. انظر القسم التالي.
نسخ متماثل في قاعدة بيانات azure SQL، من المحتمل أن يكون ذلك بسبب تغيير ميزة التقاط البيانات (CDC).
في المثيل المدار Azure SQL، بسبب النسخ المتماثل أو CDC.
في قاعدة بيانات azure SQL الاستعلام sys.dm_cdc_errors وحل الأخطاء. في حالة الاستمرار قم بتقديم طلب دعم من خلال Azure Support.
في حالة المثيل المدار Azure SQL، إذا استمر، فتحقق من العوامل المتضمنة مع CDC أو النسخ المتماثل. لاستكشاف أخطاء CDC وإصلاحها، قم بفحص المهام في msdb.dbo.cdc_jobs. إذا لم يكن موجوداً، فقم بإضافته عبر sys.sp_cdc_add_job. لإجراء النسخ المتماثل، خذ بعين الاعتبار استكشاف أخطاء النسخ المتماثل للمعاملات. في حالة الاستمرار قم بتقديم طلب دعم من خلال Azure Support.
AVAILABILITY_REPLICA المزامنة إلى النسخة المتماثلة الثانوية قيد التقدم. لا حاجة إلى استجابة ما لم يتم الحفاظ عليها. في حالة الاستمرار قم بتقديم طلب دعم من خلال Azure Support.

منع اقتطاع السجل بواسطة معاملة نشطة

السيناريو الأكثر شيوعاً لسجل المعاملات التي لا يمكن قبول المعاملات الجديدة هي معاملة طويلة الأمد أو محظورة.

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

  • إرجاع معلومات حول خصائص المعاملة من sys.dm_tran_active_transactions.
  • إرجاع معلومات اتصال جلسة العمل، من sys.dm_exec_sessions.
  • إرجاع معلومات الطلب (للطلبات النشطة)، من sys.dm_exec_requests. يمكن استخدام هذا الاستعلام أيضاً لتعريف جلسات العمل التي يتم حظرها، والبحث عن request_blocked_by. لمزيد من المعلومات حول الحظر، راجع تجميع معلومات الحظر.
  • إرجاع نص الطلب الحالي أو إدخال نص المخزن المؤقت باستخدام sys.dm_exec_sql_text أو sys.dm_exec_input_buffer DMVs. إذا كانت البيانات التي تم إرجاعها text بواسطة الحقل sys.dm_exec_sql_text فارغة، فإن الطلب غير نشط ولكن لديه معاملة معلقة. في هذه الحالة، فإن الحقل event_info الخاص بـ sys.dm_exec_input_buffer سيتضمن سلسلة الأوامر الأخيرة التي تم تمريرها إلى مشغل قاعدة البيانات.
SELECT [database_name] = db_name(s.database_id)
, tat.transaction_id, tat.transaction_begin_time, tst.session_id 
, session_open_transaction_count = tst.open_transaction_count --uncommitted and unrolled back transactions open. 
, transaction_duration_s = datediff(s, tat.transaction_begin_time, sysdatetime())
, input_buffer = ib.event_info
, request_text = CASE  WHEN r.statement_start_offset = 0 and r.statement_end_offset= 0 THEN left(est.text, 4000)
                       ELSE    SUBSTRING ( est.[text],    r.statement_start_offset/2 + 1, 
                                           CASE WHEN r.statement_end_offset = -1 THEN LEN (CONVERT(nvarchar(max), est.[text])) 
                                                ELSE r.statement_end_offset/2 - r.statement_start_offset/2 + 1
                                           END  )  END
, request_status = r.status
, request_blocked_by = r.blocking_session_id
, transaction_state = CASE tat.transaction_state    
                     WHEN 0 THEN 'The transaction has not been completely initialized yet.'
                     WHEN 1 THEN 'The transaction has been initialized but has not started.'
                     WHEN 2 THEN 'The transaction is active - has not been committed or rolled back.'
                     WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
                     WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
                     WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
                     WHEN 6 THEN 'The transaction has been committed.'
                     WHEN 7 THEN 'The transaction is being rolled back.'
                     WHEN 8 THEN 'The transaction has been rolled back.' END 
, transaction_name = tat.name
, azure_dtc_state    --Applies to: Azure SQL Database only
             =    CASE tat.dtc_state 
                 WHEN 1 THEN 'ACTIVE'
                 WHEN 2 THEN 'PREPARED'
                 WHEN 3 THEN 'COMMITTED'
                 WHEN 4 THEN 'ABORTED'
                 WHEN 5 THEN 'RECOVERED' END
, transaction_type = CASE tat.transaction_type    WHEN 1 THEN 'Read/write transaction'
                                             WHEN 2 THEN 'Read-only transaction'
                                             WHEN 3 THEN 'System transaction'
                                             WHEN 4 THEN 'Distributed transaction' END
, tst.is_user_transaction
, local_or_distributed = CASE tst.is_local WHEN 1 THEN 'Local transaction, not distributed' WHEN 0 THEN 'Distributed transaction or an enlisted bound session transaction.' END
, transaction_uow    --for distributed transactions. 
, s.login_time, s.host_name, s.program_name, s.client_interface_name, s.login_name, s.is_user_process
, session_cpu_time = s.cpu_time, session_logical_reads = s.logical_reads, session_reads = s.reads, session_writes = s.writes
, observed = sysdatetimeoffset()
FROM sys.dm_tran_active_transactions AS tat 
INNER JOIN sys.dm_tran_session_transactions AS tst  on tat.transaction_id = tst.transaction_id
INNER JOIN Sys.dm_exec_sessions AS s on s.session_id = tst.session_id 
LEFT OUTER JOIN sys.dm_exec_requests AS r on r.session_id = s.session_id
CROSS APPLY sys.dm_exec_input_buffer(s.session_id, null) AS ib 
OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) AS est;

إدارة الملفات لتحرير مساحة أكبر

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

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

لمزيد من المعلومات حول إدارة مساحة ملف قواعد البيانات والتجمعات المرنة، راجع إدارة مساحة الملف لقواعد البيانات في قاعدة بيانات azure SQL.

خطأ 40552: تم إنهاء جلسة العمل بسبب الاستخدام الزائد لمساحة سجل المعاملة

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

لحل هذه المشكلة، حاول باستخدام الطرق التالية:

  1. يمكن أن تحدث المشكلة بسبب إدراج أو تحديث أو حذف العمليات. راجع المعاملة لتجنب الكتابات غير الضرورية. حاول تقليل عدد الصفوف التي يتم تشغيلها على الفور عن طريق تنفيذ الدفعات أو التقسيم إلى معاملات أصغر متعددة. لمزيد من المعلومات، راجع كيفية استخدام الدفعات لتحسين أداء تطبيق قاعدة بيانات SQL.
  2. يمكن أن تحدث المشكلة بسبب عمليات إعادة إنشاء الفهرس. لتجنب هذه المشكلة، تأكد من صحة الصيغة التالية: (عدد الصفوف المتأثرة في الجدول) مضروباً في (متوسط حجم الحقل الذي تم تحديثه بالبايت + 80) < 2 غيغابايت (GB). بالنسبة للجداول الكبيرة، ضع في اعتبارك إنشاء أقسام وإجراء صيانة الفهرس فقط على بعض أقسام الجدول. لمزيد من المعلومات، راجع إنشاء جداول وفهارس مقسمة.
  3. إذا قمت بإجراء إدراجات مجمعة باستخدام bcp.exe الأداة المساعدة أو الفئة System.Data.SqlClient.SqlBulkCopy، حاول استخدام خيارات -b batchsize أو BatchSize لتحديد عدد الصفوف المنسوخة إلى الخادم في كل معاملة. لمزيد من المعلومات، راجع bcp Utility.
  4. إذا كنت تقوم بإعادة إنشاء فهرس باستخدام العبارة ALTER INDEX، استخدم الخيارين SORT_IN_TEMPDB = ON وONLINE = ON . لمزيد من المعلومات، راجع ALTER INDEX (Transact-SQL).

ملاحظة

لمزيد من المعلومات حول أخطاء محافظ الموارد الأخرى، راجع أخطاء إدارة الموارد.

الخطوات التالية

للحصول على معلومات حول أحجام سجل المعاملات، راجع: