فرض کنید محیط Clustered مایکروسافت SQL Server شما درحال حاضر میزبان بیش از 200 پایگاه داده در همه نودها است. در حالی که فناوری Clustering مدتی است که وجود داشته است، بسیاری از برنامهها هنوز clustered-aware نیستند. برنامه کاربردی “clustered” بودن به چه معناست؟ به عبارت ساده، به این معنی است که برنامه، در صورت fail شدن یک پایگاه داده در یک اینستنس clustered، سعی میکند دوباره به پایگاه داده متصل شود و اتصالات کلاینت را که قبل از fail شدن پایگاه داده نمونهسازی شده بودند، دوباره برقرار کند. مثلا فرض کنید تنها یک برنامه کاربردی وجود دارد که توسط یک شرکت خارجی به منظور ردیابی عملکرد سیستمهای گرمایش و سرمایش شما برای تفاوت دما ارائه و نظارت میشود و این برنامه clustered-aware نیست و هر زمان که خرابی رخ میدهد از کار میافتد. از آنجایی که این راه حل مهم است، شما به سادگی نیاز دارید که فروشنده را در صورت وقوع failover مطلع کنید. در حالی که میتوانید از Microsoft System Center یا Microsoft Operations Manager برای هشدار در زمان وقوع این رویداد استفاده کنید، باید برای انجام این کار تحت آن طرح و برنامه، منابعی را در تیمهای مختلف جمعآوری کنید.
راه حلی که ما بکار میبریم این است که به سادگی یک Job در اینستنس SQL Server کلاسترد شده ایجاد کنیم که یک ایمیل از طریق database mail به آدرس ایمیل پشتیبانی فروشنده ارسال می کند، آدرس Database Administrator on-callوAnalyst on-call را در ایمیل کپی کند. سپس برنامه ای را برای این کار تعیین میکنیم که هر زمان که سرویس ها شروع به کار کنند، خبر بدهد. به این ترتیب هر بار که سرویس SQL Agent شروع به کار می کند، ایمیلی ارسال می شود که به ما اطلاع می دهد که سرویس مجدداً راه اندازی شده است.
برای آن دسته از شما که با فرآیند failover Microsoft SQL Server آشنایی ندارید، این سرویس ها با گروه های منابع واقع در shared server volume (SAN/NAS) مرتبط هستند. گروه منبع (resource group) در هر زمان خاص متعلق به یک سرور فیزیکی است که در اصطلاح میگویند که آن گره (منبع) در clustering است. اگر یک گره (سرور) خاموش شدن را تجربه کند، مالکیت گروه منبع از گره خراب به گره دردسترس دیگری در cluster منتقل می شود. این شامل چرخه سرویس های SQL Server در طول این فرآیند هم می شود و بنابراین هنگام راه اندازی مجدد سرویس ها، اجرای این Job SQL Server Agent را آغاز می کند. همچنین اگر سرویسها به هر دلیلی، علاوه بر فرآیند failover برنامه ریزی شده یا فوری، مجدداً ری استارت شوند، اتفاق میافتد، اما در این مورد نیز برای نیازهای ما مناسب است.
چند شکل بعدی شما را با فرآيند تنظيم آن از طريق Microsoft SQL Server Management Studio آشنا مي كند. میتوانید این کارها را از طریق کدنویسی T-SQL انجام دهید، اما من متوجه شدم که فرآیند ایجاد job از طریق رابط کاربری گرافیکی SQL Server Management Studio بهتر عمل میکند، سپس اگر میخواهید بعداً این فرآیند را روی اینستنسهای دیگر SQL Server اجرا کنید، جاب را با دکمه Script اسکریپت میکنید. در پایان این مقاله، برخی از الزامات این فرآیند را برای موفقیت در محیط شما شرح خواهم داد. در حال حاضر، اکثر شما یک جاب SQL Server Agent ایجاد کرده اید. هدف از این نکته ارائه نحوه مدیریت اعلان از راه دور یک نمونه خرابی SQL Server در یک محیط clustering است، ایجاد Job صرفاً فرآیندی است که برای من بهترین کارایی را داشته و اجرای آن سادهترین است.
از داخل SQL Server Management Studio به اینستنس clustered ای که میخواهید پیکربندی کنید متصل شوید، به SQL Server Agent/Jobs بروید، کلیک راست کرده و New Job… را از منوی پاپ آپ موجود مطابق شکل زیر انتخاب کنید.
مقادیر پارامترهای Job Name، Owner، Category و Description را وارد کنید.
به صفحه Steps در ویزارد SQL Agent Job بروید و یک Step جدید ایجاد کنید. مقادیر پارامتر نشان داده شده در زیر را وارد کنید (یا مقادیری که با محیط شما مطابقت دارند.) به ویژه باید در این مرحله کدگذاری صحیحی برای پارامتر Command وارد کنید. توصیه من این است که همیشه متن command را در چارچوب یک پرس و جوی SQL Server Management Studio قبل از اجرای آن از داخل یک جاب SQL Server Agent آزمایش کنید. برای استفاده از پروسیجر ارسال ایمیل dbo.sp_send_dbmail در command جاب، باید مقادیر پارامتر صحیح (از محیط خود) را برای @profile_name، @recipients، @copy_recipients، @subject و @body وارد کنید.
به صفحه Advanced فرم Job Step بروید و مقادیر زیر را وارد کنید و مکان فایل Output را جایگزین کنید که برای نیازهای شما بهترین کارایی را دارد. ممکن است این عملکردی نباشد که اغلب از آن استفاده میکنید (پیشفرض یک مقدار تهی است) اما من به این فایل خروجی تکیه میکنم که لاگ دقیقتری نسبت به آنچه که معمولاً از طریق فرآیند لاگ پیشفرض SQL Server Agent ارائه میشود به من ارائه میدهد.
برای ذخیره و بستن فرم Job Step، روی OK کلیک کنید. این شما را به فرم های اصلی ایجاد جاب برای SQL Server Agent برمی گرداند. به فرم Job Schedule بروید و مقادیری مشابه با مقادیر ارائه شده در زیر وارد کنید. ممکن است مقادیر برای نوع زمانبندی و Summay/Description ناسازگار به نظر برسند، اما مقدار Description فقط خواندنی است و نمیتوان آن را تغییر داد. در این مورد آن را نادیده بگیرید. این مهمترین تصویر است. دلیل اصلی این است که این فرآیند برای هدف مورد نظر کار می کند. پس از اطمینان از صحیح بودن کد دستوری، مطمئن شوید که جاب هنگام راه اندازی سرویس، به کار می افتد.
پس از تکمیل این فرم، ایجاد جاب را ذخیره کنید (یا اسکریپت) و باید کار را تمام کنید. پیشنهاد میکنم ابتدا این را روی یک کلاستر محیط توسعه یا تست، تنظیم کنید و با failover تست کنید و قبل از پیادهسازی در محیط تولید، تعیین کنید که آیا کار مطابق انتظار عمل میکند یا خیر.
در حال حاضر، برخی از پیش نیازها وجود دارد که باید قبل از اینکه این روند کار کند وجود داشته باشد. آنها عبارتند از:
فعال کردن database mail و پیکربندی آن
ایجاد یک database mail profile معتبر
SQL Server Agent باید به درستی به عنوان یک سرویس پیکربندی شده و در حال اجرا باشد.
حسابهای ایمیل ذکر شده در متن command در جاب SQL Server Agent باید معتبر باشند.
کد command را برای مطابقت با نیازهای خاص خود تغییر دهید. کد command را خارج از زمینه یک job از داخل SQL Server Management Studio تست کنید
در صورت موجود بودن در domain شما، Agent job را همانطور که در بالا گفتیم تست failover برای نتایج مورد انتظار را در یک کلاستر درمحیط test/development SQL Server ایجاد کنید.
هنگامی که نتایج آزمایش با استانداردهای عملکرد شما مطابقت داشت، فرآیندهای یکسانی را در محیط کلاسترد تولید SQL Server خود دنبال کنید.
اسکریپت را در اینجا مشاهده میکنید:
USE [msdb]
GO
/****** [Object: Job [Service_Restart_Notification ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [Administrative Job: Custom] ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N’Administrative Job: Custom’ AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N’JOB’, @type=N’LOCAL’, @name=N’Administrative Job: Custom’
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N’Service_Restart_Notification’,
enabled=1@,
notify_level_eventlog=0@,
notify_level_email=0@,
notify_level_netsend=0@,
notify_level_page=02@,
delete_level=0@,
‘description=N’Notify key users of services restart@,
@ , ‘category_name=N’Administrative Job: Custom@,
owner_login_name=N’ServiceAccount’, @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** [Object: Step [Send Email Alerts ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N’Send Email Alerts’,
step_id=1@,
cmdexec_success_code=0@,
on_success_action=1@,
on_success_step_id=0@,
on_fail_action=2@,
on_fail_step_id=0@,
retry_attempts=0@,
retry_interval=0@,
@ ,’os_run_priority=0, @subsystem=N’TSQL@,
command=N’EXEC msdb.dbo.sp_send_dbmail
”profile_name = ” SQL Server Notification Service@
”recipients = ”DBA@domain.com@,
@ , ”copy_recipients = ”Analyst@domain.com;User@domain.com@,
body = ”This is an informational message only: SQL services possibly restarted on SQL01. Please restart any dependent application services after ”verifying status with DBA Team first
”subject = ”SQL Services Restarted on SQL01@,
‘,
@, ‘database_name=N’master@
flags=4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N’On Startup’,
enabled=1@,
freq_type=64@,
freq_interval=0@,
freq_subday_type=0@,
freq_subday_interval=0@,
freq_relative_interval=0@,
freq_recurrence_factor=0@,
active_start_date=20220721@,
active_end_date=99991231@,
@, active_start_time=0@,
active_end_time=235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)’
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
:QuitWithRollback
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
:EndSave
نظر بگذارید