
CU12 چه تغییراتی برای SQL Server 2022 داره
- تکنولوژی
- 1404/02/29
- 29 اردیبهشت 1404
cumulativeupdate12 برای SQl Server 2022
در این مقاله به بررسی تغغیرات موجود در cumulativeupdate12 برای SQl Server 2022 میپردازیم
سناریوی هر کدوم رو هم در صورت امکان برای تست در محیط لوکال ارایه میدیم
نکته اینکه برای سناریو های تست دو تا راه هست
1) یکی اینکه دو تا Instance روی دو تا سرور یا VM نصب کرنید یکی شون رو به نسخه قبلی آپدیت کنید و یکی شون رو به نسخه بعدی
2) یکی دیگه هم میتونید تست ها رو ی روی محیط خودتون قبل از اپدیت انجم بدین و بعد از آپدیت کردن مجددا بررسی کنید
خب بریم سراغ تغییران این آپدیت
Programmability
2941532 – Scalar UDF Inlining issues
شرح:
مشکلات مربوط به inlining توابع اسکالر که گاهی باعث خطا یا اجرای نادرست میشد.
سناریوی تست:
Code |
CREATE FUNCTION dbo.SlowFn (@i INT) — قبل از CU12، این تابع ممکن بود باعث مشکل در اجرای این کوئری بشه: SELECT dbo.SlowFn(a.object_id) FROM sys.all_objects a;
|
Code |
SELECT * FROM sys.dm_exec_query_plan(plan_handle) WHERE statement_text LIKE ‘%SlowFn%’ |
- بررسی وضعیت inlining قبل و بعد از CU12.
2961007 – OOM caused by CACHESTORE_PHDR
شرح:
افزایش غیرمنتظره حافظه در cache مربوط به Prepared Handles (PHDR)
سناریوی تست:
Code |
— آمادهسازی حجم زیادی از query های prepared بهصورت دستی: DECLARE @i INT = 0; |
- قبل از CU12 ممکن بود sys.dm_os_memory_cache_counters رشد غیرعادی برای CACHESTORE_PHDR نشان دهد.
- بعد از CU12: رشد باید کنترلشدهتر باشد.
Query Execution
2833605 – Assertion lobss.cpp:707 (varchar(max), lob not found)
شرح:
در کوئریهای پیچیده با varchar(max)، خطای assertion ممکن بود رخ بدهد.
سناریوی تست:
Code |
CREATE TABLE dbo.TestLob (ID INT, Data VARCHAR(MAX)); — کوئری پیچیده با UDF یا APPLY |
- قبل از CU12 گاهی باعث crash یا dump میشد.
2850899 – Process termination with BLOB cleanup error
شرح:
در صورت وجود خطا در BLOB هنگام shutdown کوئری، ممکن است SQL Server crash کند.
سناریوی تست:
Code |
CREATE TABLE dbo.BLOBTest (ID INT, Data VARBINARY(MAX)); — اجرای کوئری که باعث خطا شود |
- در SQL Server crash لاگ را باید بررسی کرد، مخصوصاً در SQLDump یا ERRORLOG.
2914479 – Contention on sys.dm_exec_query_statistics_xml
شرح:
زمانی که چند اتصال به طور همزمان این DMV را بخوانند، ممکن است قفل یا کندی ایجاد شود.
سناریوی تست:
- اجرای اسکریپت همزمان در چند پنجره SSMS:
Code |
— اجرا در چند تب همزمان |
- قبل از CU12: احتمال افزایش LATCH یا SOS_SCHEDULER_YIELD
- بعد از CU12: بهبود انتظار قفلها
Query Optimizer
2695507 – Parallel Spool باعث نتایج ناسازگار در DML
سناریوی تست:
Code |
CREATE TABLE dbo.TestParallel (ID INT PRIMARY KEY, Val INT); — اجرای UPDATE با شرایطی که ممکن است spool موازی ایجاد کند |
- بررسی Plan Execution با ACTUAL EXECUTION PLAN
- قبل از CU12 احتمال داشت نتایج گاهی متفاوت یا ناپایدار باشند.
2850915 – Access Violation در هنگام Abort در Batch Mode Sort
سناریوی تست:
ایجاد کوئری با ORDER BY در حالت Batch Mode:
Code |
CREATE TABLE dbo.SortTest (ID INT, Val INT); — کوئری با Sort در حالت Batch Mode |
- قبل از CU12 ممکن بود هنگام لغو کوئری (Cancel) خطای INVALID_POINTER_READ بدهد.
- بعد از CU12 رفتار پایدارتر و بدون Crash.
2850932 – Access Violation با Adaptive Join
سناریوی تست:
Code |
— جدولهای کوچک و بزرگ برای فعالسازی Adaptive Join INSERT INTO dbo.Small VALUES (1), (2); — کوئری با Adaptive Join (در حالت CE جدید) |
- در ورژنهای قبلی ممکن بود در تابع CBpXteHashJoin::FSeparateHash access violation بدهد.
2890724 – Plan cache dereferencing بدون حذف صحیح Plan
- CE_FEEDBACK فقط روی Parameter-Sensitive Plan (PSP) کار میکنه.
- این ویژگی در SQL Server 2022 و در Compatibility Level 160 فعال میشه.
Code |
ALTER DATABASE [YourDB] SET COMPATIBILITY_LEVEL = 160;
|
تست:
- اجرای کوئری با CE Feedback فعال و چندبار اجرای همان کوئری با پارامترهای مختلف:
توضیح کوتاه CE Feedback:
Cardinality Estimator (CE) مسئول تخمین تعداد ردیفهایی است که در هر بخش از یک کوئری بازگردانده میشود. این تخمین خیلی مهم است چون روی پلن اجرای کوئری تاثیر زیادی میگذارد.
CE Feedback قابلیتی است که اجازه میدهد SQL Server بازخوردهای واقعی اجرای کوئری را بگیرد و این تخمینها را اصلاح کند تا کوئریهای بعدی بهینهتر اجرا شوند.
چه زمانی مفید است؟
- وقتی که کوئریهای شما بر اساس تخمینهای نادرست (مثلاً خیلی کمتر یا بیشتر تخمین زده شده) کند اجرا میشوند.
- کمک میکند که SQL Server خودش یاد بگیرد و در اجرای آینده بهینهتر عمل کند.
Code |
ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK = ON; EXEC sp_executesql N‘SELECT COUNT(*) FROM dbo.Big WHERE Val = @val’, N‘@val INT’, 10; |
- مانیتور کردن sys.dm_exec_cached_plans و sys.dm_os_memory_objects
- بررسی رشد plan cache و مشاهده عدم حذف کامل پلان در ورژن قبلی
2916821 – Access Violation به دلیل Type Casting اشتباه در CE Feedback
تست:
- مشابه مورد قبل، اما تمرکز بر ایجاد CE Feedback روی جداول خاص با ستونهای غیر نرمال مثل computed column
Replication
2612953 – Conflict Detection و خطای bigint به int
تست:
— سناریوی ساده conflict merge replication با ستون bigint که ممکن است به int تبدیل شود
— نیاز به تنظیم محیط replication دارد
- ایجاد جدول با ستون bigint و بررسی رفتار conflict resolution در agent
2693175 – sp_addsubscription روی Secondary Replica خطا میدهد
تست:
- ایجاد AG (Availability Group) و تلاش برای ایجاد اشتراک روی Secondary با sp_addsubscription
- مشاهده خطاهای Msg 20032 و 14070 قبل از CU12
2864330 – replmerg.exe با پارامتر MakeGenerationInterval
تست:
- اجرای replmerg.exe با پارامتر custom در MakeGenerationInterval و بررسی لاگ برای عملکرد صحیح
2870454 – sp_helpsubscription خروجی نمیدهد بعد از in-place upgrade
تست:
- پس از in-place upgrade به SQL Server 2022، اجرای:
Code |
EXEC sp_helpsubscription; |
- مشاهده میکنید که نتیجه خالی است قبل از CU12 – این باگ رفع شده.
2870518 – ستون _$update_bitmap تطابق ندارد با ساختار جدول
تست:
- ایجاد سناریوی peer-to-peer replication و تغییر در ساختار جدول اصلی (افزایش ستون)
- بررسی خطای truncation توسط Agent
2929215 – خطای 18482 هنگام تعریف Distributor با نام کوچک و collation حساس
تست:
- شبیهسازی محیطی با collation حساس روی Distributor (مثل Latin1_General_CS_AS) و نام Publisher کوچک (مثلاً sqlpub)
- اجرای sp_adddistributor و مشاهده خطای 18482
اگر اوکی هست، بخش بعدی یعنی Search، Security، SQL OS و سایر بخشها رو ادامه بدم؟
Search
2877337 – اضافه شدن فیلدهای جدید به XEvent مربوط به fulltext_filter_usage
سناریوی تست:
Code |
— فعالسازی XEvent جدید ALTER EVENT SESSION [fts_usage_test] ON SERVER STATE = START; |
- بعد از اجرای جستجو، فایل .xel را در SSMS باز کنید و فیلدهای جدید min_input_size, max_input_size, min_output_size, max_output_size را بررسی کنید.
2956576 – مشکل overflow در full-text merging
تست:
- راهاندازی index و جمعآوری حجم زیادی از دادهها که باعث merge شود (با ردیابی via sys.dm_fts_index_population)
- قبل از CU12، ممکن بود در شرایط خاص با دادههای پرتکرار، overflow رخ دهد
Security
2917001 – پشتیبانی از iterated و salted hash password verifiers
تست:
- فقط در CU12 و بالاتر فعال است. اگر از custom membership providers یا داخلی SQL Server password hash ها استفاده میکنید:
Code |
— ایجاد لاگین جدید |
- با فعال بودن این آپدیت، امنیت ذخیرهسازی پسورد افزایش یافته، اما تست مستقیم نیاز به ابزار خارجی دارد.
SQL OS
2830811 – Trace flag 2616 برای جلوگیری از dump تکراری
تست:
Code |
— فعالسازی TF جدید |
- لاگ را چک کنید: در صورت فعال بودن این TF، فقط یک بار dump برای یک exception خاص ایجاد میشود.
2899892 – بهبود در dump فشردهشده (Compressed Memory Dump)
تست:
- نیاز به راهاندازی وضعیت بحرانی (مثلاً OOM یا memory pressure شدید)
- بررسی استفاده از FILE_FLAG_NO_BUFFERING در لاگ
- مشاهده بهبود I/O و CPU برای dump فایلها نسبت به نسخه قبل
2956541 – پیام خطای دقیقتر برای azure blob targets نامعتبر
تست:
Code |
— ایجاد Extended Events با target اشتباه روی Azure Blob |
- در CU12، پیغام خطا دقیقتر مانند: “invalid or expired credentials” را دریافت میکنید.
Storage Management
2153698 – اضافه شدن لینک راهنما به خطای 824
تست:
— تزریق خطای منطقی با ابزار DBCC WRITEPAGE یا استفاده از دیسک معیوب در محیط تست (بسیار بااحتیاط)
— اجرای DBCC CHECKDB یا کوئری روی صفحه آسیبدیده
- در نسخه جدید، پیغام خطا لینک https://go.microsoft.com/fwlink/?linkid=2252374 را شامل میشود که راهنمای کامل رفع خطا است.
Table Index Partition
2766481 – رفع Access Violation هنگام RESUME کردن عملیات REBUILD
تست:
Code |
— ایجاد جدول پارتیشنبندیشده و اجرای REBUILD با RESUME |
- قبل از CU12، اجرای RESUME بعد از قطع عملیات گاهی باعث Access Violation میشد.
اگر آمادهای، در مرحله آخر بریم سراغ بخش Transaction Services و مورد باقیمانده از Availability Group. بریم؟
Transaction Services
2820084 – رفع مشکل non-yielding scheduler بهعلت contention در Redo Manager روی secondary replica
شرح:
در برخی سناریوها، وقتی حجم بالایی از عملیات لاگ بهصورت همزمان روی Secondary Replica در Availability Group در حال Redo شدن است، contention روی Redo Manager باعث ایجاد non-yielding scheduler میشود و SQL Server پاسخ نمیدهد.
سناریوی تست پیشنهادی:
پیشنیاز:
- یک Availability Group با حداقل یک Secondary Replica راهاندازی شود.
- قابلیت readable secondary فعال باشد.
- بررسی اینکه نسخه SQL Server روی هر دو نود CU12 باشد.
مراحل تست:
Code |
اجرای حجم بالای تراکنش روی Primary: USE TestDB; |
Code |
بررسی رفتار Secondary:
|
SELECT * FROM sys.dm_hadr_database_replica_states
WHERE is_primary_replica = 0;
همچنین بررسی پیامهای non-yielding scheduler در SQL Error Log روی Secondary:
EXEC xp_readerrorlog 0, 1, N‘non-yielding’;
پیش از CU12: اگر contention روی redo threads زیاد باشد، ممکن بود سرور قفل کند یا پیامهای critical non-yielding دریافت شود.
پس از CU12: رفتار باید پایدارتر باشد و contention روی Redo کاهش یابد.
اگر خواستی، میتونم یک اسکریپت PowerShell یا T-SQL مانیتورینگ Redo Queue و Lag هم بهت بدم که بتونی دقیقتر رفتار رو در لحظه بررسی کنی. مایلی؟
اسکریپت مانیتورینگ Redo Queue / Redo Lag روی Secondary Replica
Code |
— اجرا روی نود Secondary |
این خروجی را با حالت قبل از CU12 مقایسه کن. در صورت بروز مشکل، RedoLag_Seconds یا RedoQueueSize_KB بالا میمانند و در نهایت ممکن است Non-yielding رخ دهد. پس از CU12، وضعیت پایدارتر خواهد بود.
حالا بریم سراغ مورد نهایی در CU12:
SQL Server Agent
2907888 – رفع خطایی که باعث termination شدن SQL Server Agent میشد:
پیام خطا:
php
Code |
Exception 5 caught at line <LineNumber> of file <FileName>. SQLServerAgent initiating self-termination. |
سناریوی تست:
پیشنیاز:
- یک job با stepهای متفاوت (T-SQL, PowerShell, SSIS Package)
مراحل تست:
- ساخت یک job با step زیر (مثلاً اجرای یک فایل اشتباه PowerShell):
Code |
USE msdb; |
- اجرای job:
Code |
EXEC sp_start_job @job_name = N‘TestAgentFailure’; |
- بررسی اینکه Agent همچنان در حال اجرا باقی میماند:
Code |
— بررسی وضعیت سرویس |
پیش از CU12:
در برخی شرایط خاص، Agent به علت exception داخلی از کار میافتاد.
پس از CU12:
Agent باید بدون کرش، فقط step را fail کند و log مناسب بنویسد.