رویهها و توابع سیستمی مربوط به CDC
SQL Server تعدادی رویه و تابع سیستمی برای کار با CDC ارائه میدهد که به مختصر با آنها آشنا میشویم:
-
sys.sp_cdc_enable_db
و sys.sp_cdc_disable_db
: برای فعال و غیرفعالسازی CDC در سطح دیتابیس (پارامتر ندارند).
-
sys.sp_cdc_enable_table
و sys.sp_cdc_disable_table
: برای فعال/غیرفعالسازی CDC روی جداول مشخص. (در فعالسازی میتوان پارامترهایی مانند نام ایندکس یکتا و ستونهای مورد نظر را داد).
-
sys.sp_cdc_add_job
و sys.sp_cdc_drop_job
: رویههای داخلی که به ترتیب، ایجاد و حذف SQL Agent Jobهای مربوط به CDC را انجام میدهند. معمولاً نیاز نیست مستقیماً صدا زده شوند، چون sp_cdc_enable_table
در اولین جدول فعالسازی آنها را ایجاد میکند.
-
sys.sp_cdc_change_job
: برای تغییر تنظیمات پیشفرض Jobها (مثلاً تعداد تراکنش در هر اسکن یا دوره نظرسنجی و مقدار نگهداری) استفاده میشود. مثال:
-
sys.sp_cdc_help_jobs
: نمایش پیکربندی فعلی Jobهای CDC (جداول msdb.dbo.cdc_jobs
).
-
sys.sp_cdc_start_job
و sys.sp_cdc_stop_job
: برای متوقف و راهاندازی دوباره Job ضبط تغییرات (capture job) یا پاکسازی (با تعیین @job_type
) به کار میروند. توجه شود که توقف Job ضبط، دادهها را از بین نمیبرد، بلکه فقط موقتا مانع از اسکن لاگ میشود.
-
sys.sp_cdc_help_change_data_capture
: گزارش وضعیت هر نمونهی CDC در دیتابیس (از جمله LSNهای فعلی، نام جدول و…) را نمایش میدهد.
-
sys.fn_cdc_get_all_changes_<capture_instance>
و sys.fn_cdc_get_net_changes_<capture_instance>
: دو تابع جدولی که به ترتیب تمام تغییرات یا تغییرات خالص را در بازهی LSN دلخواه برمیگردانند. پارامترهای ورودی این توابع، LSN آغاز و LSN پایان (باینری(۱۰)) و یک رشته برای تعیین حالت ('all'
یا 'all update old'
) هستند.
-
sys.fn_cdc_map_time_to_lsn
و sys.fn_cdc_map_lsn_to_time
: توابعی برای تبدیل مقدار زمانی به LSN یا برعکس. مثلاً برای گرفتن کوچکترین LSN پس از زمان مشخص، یا یافتن زمان مرتبط با یک.
-
sys.fn_cdc_get_min_lsn
و sys.fn_cdc_get_max_lsn
: برگرداننده کمینه/بیشینه LSN موجود در جدول تغییرات برای یک نمونهی ضبط (معادل LSNهای مرز پایین و بالا).
-
sys.sp_cdc_get_ddl_history
: نمایش تاریخچه DDLهای مرتبط با CDC (مثلاً در صورت تغییرات ساختاری جدول مبنا). تغییرات ساختاری جداول تحت CDC در جدول cdc.ddl_history
ثبت میشوند و این رویه امکان مشاهده آنها را میدهد.
-
sys.sp_cdc_cleanup_change_table
: برای پاکسازی دستی جدول تغییرات بر اساس مقدار LSN (آستانه) استفاده میشود. این رویه با تنظیم مقدار @low_water_mark
(LSN جدید پایین) میتواند بهصورت دستی دادههای قدیمی را حذف کند؛ اما باید با احتیاط استفاده شود، چون ممکن است بر مصرفکنندگان تغییرات تأثیر بگذارد.
بازه زمانی نگهداری دادهها (Retention) و پاکسازی
پیشفرض، CDC دادهها را به مدت سه روز نگه میدارد (۴۳۲۰ دقیقه). اگر دادهای قدیمیتر شود، Job پاکسازی دورهای آن را حذف میکند. این کار بر اساس یک بازه زمانی نگهداری (retention) انجام میشود: ابتدا نقطه پایین (low watermark) اعتبار (LSN مربوط به سه روز قبل) بهروزرسانی میشود، سپس کلیه ردیفهایی که پایینتر از آن LSN هستند حذف میشوند.
برای تغییر این مقدار میتوان از sys.sp_cdc_change_job
استفاده کرد. به طور مثال، برای افزایش نگهداری تا ۷ روز:
(حداکثر مقدار قابل تنظیم ۵۲۴۹۴۸۰۰ دقیقه یا ۱۰۰ سال است.) همچنین sys.sp_cdc_help_jobs
میتواند مقدار فعلی نگهداری را گزارش کند. اگر بخواهید بدون محدودیت زمانی (بینهایت) داده را نگهداری کنید، میتوانید مقدار بسیار بزرگ یا مقدار ۰ را تنظیم کنید (اما توجه داشته باشید که حذف ردیفها را به کلی غیرفعال میکند و فضای دیسک مصرفی افزایش مییابد).
برای پاکسازی فوری یا کنترل شدهتر نیز میتوان از sys.sp_cdc_cleanup_change_table
استفاده کرد. در این حالت با تعیین LSN پایین جدید (@low_water_mark
) میتوانید دیتای قدیمی تا آن LSN را پاک کنید. به عنوان مثال:
این رویه پس از اعمال، هر رکورد با __$start_lsn
کمتر از مقدار تعیینشده را حذف میکند.
تفاوت CDC با تریگرها و سایر روشهای ثبت تغییر
در مقابل روش تریگرها (Trigger) که تغییرات را در همان زمان تراکنش روی جدول اصلی ثبت میکنند، CDC مبتنی بر خواندن غیرهمزمان لاگ است. یعنی تغییرات ابتدا در لاگ ثبت میشوند و بعداً توسط یک Job پردازش شده و در جداول تغییرات ذخیره میشوند. بنابراین عملیات نوشتن تاریخچهی تغییرات از تراکنش اصلی جداست و تاخیر ناچیزی دارد (معمولاً چند ثانیه یا کمتر). این به معنی کارایی بهتر تراکنشهای عملیاتی است، چرا که آنها تحت تأثیر سربار تریگرها قرار نمیگیرند. اما از سوی دیگر، در CDC امکان افزودن خودکار ستونهای دلخواه به تغییرات وجود ندارد (برخلاف تریگرهای دلخواه) و ساختار جدول تغییرات ثابت است؛ هرگونه تغییر ساختاری در جدول مبنا باعث ثبت null یا نیاز به ساخت نمونه ضبط جدید میشود.
به طور خلاصه، مزایا و معایب CDC نسبت به تریگرها:
-
مزایا: توسعه سریعتر (تنظیمات کمتر از نوشتن تریگرها)، عدم سربار سنگین روی تراکنشها (زیرا اسکن لاگ ناهمگام است)، پشتیبانی بومی از SQL Agent و مدیریت خودکار. CDC گزینه مناسبی برای بارگذاری تدریجی دادهها در انبار داده است.
-
معایب: نیاز به SQL Agent و سرویسگیرش دیتابیس (لاگ) دارد، فقط در نسخههای خاصی در دسترس است (نسخههای Enterprise/Developer و Standard جدید) و حجم بالاتر (جداول تغییرات و فایلگروه) میتواند فضای دیسک بیشتری مصرف کند. همچنین اگر تعداد جداول CDCشده یا نرخ تغییرات زیاد باشد، فشار بر پردازش لاگ و CPU/IO افزایش مییابد. به طور کلی تأثیر CDC بر عملکرد مشابه سایر سیستمهای CDC است؛ باید منابع کافی (مانند CPU، حافظه و فضای دیسک) برای پایگاه داشته باشید و در زمانهای پیک میتوانید Job ضبط را موقتاً متوقف کنید تا بار کاهش یابد.
روشهای معمول پیادهسازی CDC در دیتابیس (روشهای مبتنی بر ستون Audit، دلتاها، تریگرها یا لاگ). تفاوت اصلی CDC در استفاده از لاگ است (بخش پایین تصویر).
نگهداری نتایج و مدیریت عملکرد
بهتر است جداول تغییرات CDC را در فایلگروپ جداگانه و جدا از جدوال عملیاتی قرار دهید تا مدیریت بهتری روی آنها داشته باشید. همچنین باید توجه کرد که CDC به طور پیشفرض با مسئله نگهداشتن لاگ همراه است: وقتی CDC فعال است، لاگ تراکنش تا زمان پردازش آخرین تغییرات توسط job ضبط، تراکنشگیری نمیشود. یعنی اگر SQL Agent متوقف باشد یا کند عمل کند، لاگ بیشتری روی سرور انباشته میشود. با این وجود اگر SQL Agent به طور معمول در حال کار باشد و پارامترهای Job بهینه باشند، میتوان تأثیر بر تراکنشهای عملیاتی را کاهش داد. ابزارهای مانیتورینگ و DMVهای مرتبط (مثل sys.dm_cdc_log_scan_sessions
) برای پیگیری وضعیت و عملکرد CDC در دسترس است.
نسخههای پشتیبانیشده
همانطور که گفته شد، CDC در SQL Server 2008 و بالاتر معرفی شده است. در نسخههای اولیه تنها در Enterprise (و نسخهی Developer که ویژگیهای Enterprise را دارد) موجود بود. از SQL Server 2016 SP1 به بعد، نسخه Standard نیز CDC را پشتیبانی میکند. (نسخههای Web و Express فاقد CDC هستند.) بنابراین در هنگام طراحی سیستم باید نسخه SQL Server را در نظر گرفت.
نتیجهگیری
در این مقاله CDC را به طور جامع بررسی کردیم: CDC یک راهکار ثبت تغییرات مبتنی بر لاگ در SQL Server است که با فعالسازی ساده میتواند تغییرات جداول را رصد و نگهداری کند. دستورات sp_cdc_enable_db/table
برای فعالسازی، sp_cdc_disable_db/table
برای غیرفعالسازی، توابع fn_cdc_get_*
برای خواندن تغییرات، و Jobهای SQL Agent برای ضبط و پاکسازی، از مهمترین اجزای آن هستند. CDC به کاربران امکان میدهد بدون نوشتن تریگرهای متعدد، تغییرات را جمعآوری کرده و به شکل جدول درآورند (برای ETL یا تطبیق داده). هرچند مصرف منابع در CDC باید مدیریت شود و اندازهی نگهداری دادهها را با تنظیم ریتنشن و پاکسازی کنترل کرد. در مجموع CDC ابزاری پایدار و مقیاسپذیر برای پیگیری تغییرات داده در SQL Server است که با اجرای جزئی تنظیمات، راهکاری آماده ارائه میکند.