استكشاف أخطاء سجل المعاملات وإصلاحها باستخدام قاعدة بيانات 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.
لحل هذه المشكلة، حاول باستخدام الطرق التالية:
- يمكن أن تحدث المشكلة بسبب إدراج أو تحديث أو حذف العمليات. راجع المعاملة لتجنب الكتابات غير الضرورية. حاول تقليل عدد الصفوف التي يتم تشغيلها على الفور عن طريق تنفيذ الدفعات أو التقسيم إلى معاملات أصغر متعددة. لمزيد من المعلومات، راجع كيفية استخدام الدفعات لتحسين أداء تطبيق قاعدة بيانات SQL.
- يمكن أن تحدث المشكلة بسبب عمليات إعادة إنشاء الفهرس. لتجنب هذه المشكلة، تأكد من صحة الصيغة التالية: (عدد الصفوف المتأثرة في الجدول) مضروباً في (متوسط حجم الحقل الذي تم تحديثه بالبايت + 80) < 2 غيغابايت (GB). بالنسبة للجداول الكبيرة، ضع في اعتبارك إنشاء أقسام وإجراء صيانة الفهرس فقط على بعض أقسام الجدول. لمزيد من المعلومات، راجع إنشاء جداول وفهارس مقسمة.
- إذا قمت بإجراء إدراجات مجمعة باستخدام
bcp.exe
الأداة المساعدة أو الفئةSystem.Data.SqlClient.SqlBulkCopy
، حاول استخدام خيارات-b batchsize
أوBatchSize
لتحديد عدد الصفوف المنسوخة إلى الخادم في كل معاملة. لمزيد من المعلومات، راجع bcp Utility. - إذا كنت تقوم بإعادة إنشاء فهرس باستخدام العبارة
ALTER INDEX
، استخدم الخيارينSORT_IN_TEMPDB = ON
وONLINE = ON
. لمزيد من المعلومات، راجع ALTER INDEX (Transact-SQL).
ملاحظة
لمزيد من المعلومات حول أخطاء محافظ الموارد الأخرى، راجع أخطاء إدارة الموارد.
الخطوات التالية
- استكشاف مشكلات الاتصال وإصلاحها والأخطاء الأخرى مع قاعدة بيانات azure SQL والمثيل المدار Azure SQL
- استكشاف أخطاء الاتصال العابرة وإصلاحها في قاعدة بيانات SQL والمثيل المدار SQL
- الفيديو: أفضل ممارسات تحميل البيانات في Azure SQL Database
للحصول على معلومات حول أحجام سجل المعاملات، راجع:
- بالنسبة إلى حدود موارد vCore لقاعدة بيانات واحدة، راجع حدود الموارد لقواعد البيانات المفردة باستخدام نموذج شراء vCore
- بالنسبة إلى حدود موارد vCore للمجمعات المرنة، راجع حدود الموارد للمجمعات المرنة باستخدام نموذج شراء vCore
- بالنسبة إلى حدود موارد وحدة الإرسال الكبرى لقاعدة بيانات واحدة، راجع حدود الموارد لقواعد البيانات المفردة باستخدام نموذج الشراء DTU
- للحصول على حدود موارد وحدة الإرسال الكبرى للمجمعات المرنة، راجع حدود الموارد للمجمعات المرنة باستخدام نموذج شراء وحدة الإرسال الكبرى
- للحصول على حدود موارد المثيل المدار SQL، راجع حدود موارد المثيل المدار SQL.
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ