درک عمیق تراکنشها در SqlServer Transactional Replication
درک چگونگی رفتار تراکنشها در SqlServer Transactional Replication برای کارشناسان پایگاه داده ضروری است. در حالی که replication به طور خودکار بیشتر جنبهها را مدیریت میکند، دانستن مکانیسمهای زیربنایی میتواند در عیبیابی و بهینهسازی عملکرد کمککننده باشد. این مقاله به جزئیات نحوه پردازش تراکنشها در replication تراکنشی میپردازد و جنبههایی مانند فرمانهای DML، شمارههای توالی تراکنش و کوئریهای مفید را پوشش میدهد.
یکی از نکات مهم این است که تراکنشهای تعریفشده توسط کاربر به طور عادی از طریق replication تراکنشی پردازش میشوند. این بدان معناست که اگر شما یک تراکنش را در ناشر (publisher) آغاز کنید، همان تراکنش در مشترک (subscriber) نیز اجرا خواهد شد. این امر پایداری دادهها را در محیطهای توزیعشده تضمین میکند.
SQL Server برای تریگرها و ستونهای Identity گزینهی `NOT FOR REPLICATION` را ارائه میدهد. این گزینه به شما امکان میدهد تریگرها یا مدیریت محدوده Identity را طوری پیکربندی کنید که در عملیاتهایی که توسط replication agents انجام میشوند، فعال یا اعمال نشوند. این کار برای جلوگیری از فعالسازیهای تکراری یا تنظیمات اشتباه در محیطهای replicated بسیار مهم است.
Agentهای replication معمولاً از رویههای ذخیره شده برای انجام عملیات DML (INSERT، UPDATE، DELETE) استفاده میکنند. برای هر جدول که بخشی از یک انتشار (publication) باشد، SQL Server به طور خودکار رویههای ذخیره شده سفارشی را ایجاد میکند. برای مثال، برای یک جدول به نام `tblTest`، رویههایی مانند `sp_MSins_tblTest` برای درج (inserts)، `sp_MSupd_tblTest` برای بهروزرسانی (updates) و `sp_MSdel_tblTest` برای حذف (deletes) ایجاد میشوند. این رویهها به Agentهای replication اجازه میدهند تا تغییرات را به طور کارآمد به مشترکین منتقل کنند.
یکی از جنبههای کلیدی در replication تراکنشی، مفهوم شماره توالی تراکنش (Transaction Sequence Number) است. این شماره برای هر فرمان در یک تراکنش استفاده میشود و به Agentهای replication کمک میکند تا ترتیب صحیح عملیات را حفظ کنند. شماره توالی تراکنش برای فرمان فعلی به شکل زیر مشخص میشود:
@xact_seqno
در برخی موارد، Agentها از پارامترهایی برای تعیین محدوده شمارههای توالی تراکنش استفاده میکنند. این پارامترها به شکل زیر تعریف میشوند:
@xact_seqno_start and @xact_seqno_end
شماره توالی تراکنش دارای فرمت خاصی است:
X:Y:Z
هر یک از `X`، `Y` و `Z` اجزای مختلفی از تراکنش را نشان میدهند. `X` نشاندهنده `transaction log id` (شناسه لاگ تراکنش)، `Y` نشاندهنده `Log Sequence Number (LSN)` (شماره توالی لاگ) و `Z` نشاندهنده `command id` (شناسه فرمان) است. این فرمت برای ردیابی دقیق و منسجم تغییرات در کل توپولوژی replication استفاده میشود.
برای کوئری کردن این اطلاعات و مشاهده جزئیات تراکنشها در صف replication، میتوانید از دستور زیر استفاده کنید. این کوئری به شما کمک میکند تا نحوه نگهداری شمارههای توالی تراکنش در `MSreplication_queue` را بررسی کنید.
SELECT
xact_seqno,
command_id,
xact_seqno + CAST(command_id AS VARBINARY(4)) AS TransactionSequenceNumber
FROM
msreplication_queue;
کوئری بالا شماره توالی تراکنش (`xact_seqno`) و شناسه فرمان (`command_id`) را از جدول `msreplication_queue` برمیگرداند. همچنین، یک ستون ترکیبی به نام `TransactionSequenceNumber` را نشان میدهد که ترکیب `xact_seqno` و `command_id` است. این ترکیب به شکل زیر خروجی میدهد:
CAST(@xact_seqno as VARBINARY(16)) + CAST(@command_id as VARBINARY(4))
شما همچنین میتوانید از کوئری زیر برای مشاهده فرمانهای replication در حال انتظار استفاده کنید. این کوئری برای عیبیابی و درک عملیات در حال انجام در محیط replication بسیار مفید است:
SELECT
publisher_database_id,
xact_seqno,
type,
command_id,
command,
CAST(xact_seqno as VARBINARY(16)) + CAST(command_id as VARBINARY(4)) as TransactionSequenceNumber
FROM
msreplication_queue
ORDER BY
xact_seqno, command_id;
خروجی برای `xact_seqno` در این کوئری، مانند `0x00000030000001D40003` و `0000` برای `command_id` خواهد بود. این مقادیر هگزادسیمال به شما اطلاعات دقیقی درباره هر تراکنش و فرمان آن میدهند. فرمت `X:Y:Z` را میتوان از این شمارههای توالی استخراج کرد، اگرچه برای تبدیل مستقیم LSN به زمان، تابع `sys.fn_cdc_map_lsn_to_time()` کاربرد دارد.
درک نحوه مدیریت و ردیابی تراکنشها در SQL Server Transactional Replication، به ویژه از طریق شمارههای توالی تراکنش و رویههای ذخیره شده مرتبط، به شما امکان میدهد تا عملکرد replication را بهتر نظارت و عیبیابی کنید. این دانش به شما کمک میکند تا از پایداری و همگامسازی صحیح دادهها در سراسر محیطهای پایگاه داده توزیعشده خود اطمینان حاصل کنید.