הגדרת Log Shipping של MS SQL Server עבור זמינות גבוהה והתאוששות מאסון
דמיינו שמסד הנתונים הראשי שלכם קורס בשעות השיא, והגיבוי האחרון הוא מאתמול—12 שעות של אובדן נתונים. חלופה היא Log Shipping: שכפול אסינכרוני של יומן העסקאות לשרת משני, עם גיבויים רעננים כל 15–30 דקות. RPO: 15 דקות, RTO: 5–10 דקות בעת מעבר failover. אין צורך ברישיונות Enterprise או בחומרה יקרה.
המהנדסים שלנו עם ניסיון של למעלה מ-10 שנים מיישמים פתרונות DR עבור SQL Server במקרים שבהם אין תקציב ל-Always On AG או FCI. Log Shipping הוא מנגנון מוכח, שעובד מ-SQL Server 2000 ועד הגרסאות העדכניות ביותר. העיקרון פשוט: השרת הראשי מגבה את יומן העסקאות, מעתיק את הקובץ לשרת המשני, והשרת המשני משחזר אותו. הכל מטופל על ידי משימות SQL Server Agent, ללא צורך בתשתית נוספת.
למה Log Shipping הוא פתרון DR אמין?
Log Shipping מציע חיסכון בעלויות בהשוואה ל-Always On AG: עלויות ההטמעה נמוכות פי 3–5, אין צורך ברישיונות Enterprise, ואין צורך בחומרה זהה. RPO של 15–30 דקות עונה על רוב הדרישות העסקיות. האסינכרוניות היא פשרה: במהלך תקלה, מרווח הזמן האחרון שלא אורכב אובד. אבל זה המחיר עבור עלות-תועלת. עבור מערכות קריטיות עם אפס אובדן נתונים, Always On AG היא הבחירה; עם זאת, עבור DR טיפוסי, Log Shipping הוא אופטימלי.
איך זה עובד ואיפה זה בדרך כלל נשבר
שלוש משימות: גיבוי (בשרת הראשי), העתקה (בשרת המשני), שחזור (בשרת המשני). אופציונלית, שרת ניטור שעוקב אחר הפיגור ומתריע על בעיות.
הטעות הנפוצה ביותר בהתקנה עצמית: משימת הגיבוי רצה, אבל משימת ההעתקה נשארת שקטה, ומופיע ב-Error Log בשרת המשני: Cannot open backup device '\\PRIMARY\LogShipping\AppDB_20240315_0230.bak'. Operating system error 5. אבחון: Access Denied על ה-share. ה-SQL Server Agent בשרת המשני רץ תחת חשבון ללא הרשאות לנתיב ה-UNC של השרת הראשי. אנחנו פותרים זאת על ידי הגדרת הרשאות share או שינוי חשבון השירות. מקרים כאלה הם הניסיון היומיומי שלנו.
התיעוד של Microsoft ממליץ להשתמש בחשבון נפרד עבור SQL Server Agent עם הרשאות מינימליות על נתיב ה-UNC.
דוגמה לסקריפט ניטור:
-- Проверка состояния log shipping после настройки
SELECT primary_server, primary_database, last_backup_file, last_backup_date,
DATEDIFF(MINUTE, last_backup_date, GETDATE()) AS minutes_since_backup
FROM msdb.dbo.log_shipping_monitor_primary;
SELECT secondary_server, secondary_database, last_restored_file, last_restored_date,
restore_threshold,
DATEDIFF(MINUTE, last_restored_date, GETDATE()) AS minutes_since_restore
FROM msdb.dbo.log_shipping_monitor_secondary; איך להגדיר Log Shipping עם RPO מינימלי?
הגדרה באמצעות T-SQL היא גישה ניתנת לשחזור. ה-GUI ב-SSMS מתאים ללמידה, אבל עבור אוטומציה, סקריפטים הם הטובים ביותר.
בשרת הראשי, אתחלו את משימת הגיבוי:
-- На primary: настройка backup job
EXEC msdb.dbo.sp_add_log_shipping_primary_database
@database = N'AppDB',
@backup_directory = N'\\SQLPRIMARY\LogShipping',
@backup_share = N'\\SQLPRIMARY\LogShipping',
@backup_job_name = N'LSBackup_AppDB',
@backup_retention_period = 4320,
@backup_threshold = 60,
@threshold_alert_enabled = 1,
@history_retention_period = 5760,
@backup_compression = 1,
@primary_id = @LS_BackupJobId OUTPUT;בשרת המשני, הגדירו משימות העתקה ושחזור:
-- На secondary: настройка copy + restore
EXEC msdb.dbo.sp_add_log_shipping_secondary_primary
@primary_server = N'SQLPRIMARY',
@primary_database = N'AppDB',
@backup_source_directory = N'\\SQLPRIMARY\LogShipping',
@backup_destination_directory = N'D:\LogShippingLocal',
@copy_job_name = N'LSCopy_SQLPRIMARY_AppDB',
@restore_job_name = N'LSRestore_SQLPRIMARY_AppDB',
@file_retention_period = 4320,
@secondary_id = @LS_Secondary OUTPUT;
EXEC msdb.dbo.sp_add_log_shipping_secondary_database
@secondary_database = N'AppDB',
@primary_server = N'SQLPRIMARY',
@primary_database = N'AppDB',
@restore_delay = 0,
@restore_mode = 1,
@disconnect_users = 0,
@restore_threshold = 45,
@threshold_alert_enabled = 1,
@history_retention_period = 5760,
@secondary_id = @LS_Secondary;-- Проверка состояния log shipping после настройки SELECT primary_server, primary_database, last_backup_file, last_backup_date, DATEDIFF(MINUTE, last_backup_date, GETDATE()) AS minutes_since_backup FROM msdb.dbo.log_shipping_monitor_primary; SELECT secondary_server, secondary_database, last_restored_file, last_restored_date, restore_threshold, DATEDIFF(MINUTE, last_restored_date, GETDATE()) AS minutes_since_restore FROM msdb.dbo.log_shipping_monitor_secondary; (STANDBY) מאפשר קריאה של השרת המשני בין שחזורים—נוח לדיווחים. -- На primary: настройка backup job EXEC msdb.dbo.sp_add_log_shipping_primary_database @database = N'AppDB', @backup_directory = N'\\SQLPRIMARY\LogShipping', @backup_share = N'\\SQLPRIMARY\LogShipping', @backup_job_name = N'LSBackup_AppDB', @backup_retention_period = 4320, @backup_threshold = 60, @threshold_alert_enabled = 1, @history_retention_period = 5760, @backup_compression = 1, @primary_id = @LS_BackupJobId OUTPUT; (NORECOVERY) נותן RTO מינימלי בעת failover. -- На secondary: настройка copy + restore EXEC msdb.dbo.sp_add_log_shipping_secondary_primary @primary_server = N'SQLPRIMARY', @primary_database = N'AppDB', @backup_source_directory = N'\\SQLPRIMARY\LogShipping', @backup_destination_directory = N'D:\LogShippingLocal', @copy_job_name = N'LSCopy_SQLPRIMARY_AppDB', @restore_job_name = N'LSRestore_SQLPRIMARY_AppDB', @file_retention_period = 4320, @secondary_id = @LS_Secondary OUTPUT; EXEC msdb.dbo.sp_add_log_shipping_secondary_database @secondary_database = N'AppDB', @primary_server = N'SQLPRIMARY', @primary_database = N'AppDB', @restore_delay = 0, @restore_mode = 1, @disconnect_users = 0, @restore_threshold = 45, @threshold_alert_enabled = 1, @history_retention_period = 5760, @secondary_id = @LS_Secondary; הוא העיכוב בהחלת היומנים. הגנה מפני @restore_mode = 1 מקרי: הגדירו עיכוב של 60 דקות—יש לכם שעה לעצור את השחזור ולחלץ נתונים.
אתחול מסד הנתונים המשני
לפני התחלת Log Shipping, שחזרו גיבוי מלא של השרת הראשי לשרת המשני במצב NORECOVERY:
-- На primary: полный бэкап
BACKUP DATABASE AppDB TO DISK = N'\\SQLPRIMARY\LogShipping\AppDB_init.bak'
WITH COMPRESSION, STATS = 10;
-- На secondary: восстановление
RESTORE DATABASE AppDB FROM DISK = N'\\SQLPRIMARY\LogShipping\AppDB_init.bak'
WITH NORECOVERY,
MOVE 'AppDB' TO 'D:\SQLData\AppDB.mdf',
MOVE 'AppDB_log' TO 'D:\SQLLog\AppDB_log.ldf',
STATS = 10;לאחר מכן, התחילו את המשימות—הן יתחילו להעתיק ולהחיל קבצי יומן עסקאות. לוחות זמנים טיפוסיים להגדרה: מסד נתונים אחד – יום אחד, מספר מסדי נתונים עם שרת ניטור – 2-3 ימים, העברה – עד 3 ימים.
מעבר בעת Failover
-- На secondary при failover:
-- 1. Применить все доступные логи вручную
RESTORE LOG AppDB FROM DISK = N'D:\LogShippingLocal\AppDB_last.trn' WITH NORECOVERY;
-- 2. Вывести базу в онлайн
RESTORE DATABASE AppDB WITH RECOVERY;
-- 3. Переключить connection string приложения на secondary сервер
השוואה: Log Shipping לעומת Always On AG
| קריטריון | Log Shipping | Always On AG |
|---|---|---|
| Failover אוטומטי | לא | כן |
| קריאה מהשרת המשני | רק במצב STANDBY | כן |
| דרישות רישוי | Standard | Enterprise |
| עלות הטמעה | נמוכה | גבוהה |
| RPO | 15-30 דקות | 0 (מצב סינכרוני) |
| RTO בעת failover | 5-10 דקות (ידני) | 30 שניות (אוטומטי) |
RPO/RTO טיפוסיים לפי תצורה
| תצורה | RPO | RTO | מורכבות הגדרה |
|---|---|---|---|
| Log Shipping בסיסי (מרווח 15 דקות) | 15 דקות | 10 דקות | נמוכה |
| Log Shipping עם עיכוב (restore_delay=60) | 75 דקות | 10 דקות | בינונית |
| Log Shipping + שרת ניטור | 15 דקות | 5 דקות | בינונית |
| Log Shipping + mirror (failover ידני) | 0 (אם מסונכרן) | 5 דקות | גבוהה |
סקריפט מורחב לבדיקת סטטוס
-- Детальный мониторинг отставания
SELECT db.name, ls.primary_database, ls.last_backup_date, ls.last_restored_date,
DATEDIFF(MINUTE, ls.last_backup_date, GETDATE()) AS backup_age_min,
DATEDIFF(MINUTE, ls.last_restored_date, GETDATE()) AS restore_age_min
FROM sys.databases db
JOIN msdb.dbo.log_shipping_monitor_primary ls ON db.name = ls.primary_database; מה כלול
- ביקורת של תשתית SQL Server הקיימת
- הגדרת משימות גיבוי/העתקה/שחזור
- הגדרת שרת ניטור עם התראות
- בדיקות failover וחזרה למצב רגיל
- תיעוד ו-Runbook התאוששות
- הדרכה לצוות התמיכה
המהנדסים שלנו מחזיקים בהסמכות Microsoft וביצעו למעלה מ-50 פרויקטי Log Shipping מוצלחים. קבלו ייעוץ—נעריך את המשימה שלכם ונציע את סכמת השכפול האופטימלית.
טעויות הגדרה נפוצות
- הרשאות נתיב UNC שגויות (Access Denied)
- חוסר במצב NORECOVERY בעת אתחול השרת המשני
- restore_delay שגוי—ייתכן אובדן נתונים במהלך failover מהיר
- התעלמות מניטור פיגור—בעיות מתגלות רק בזמן אסון
כדי להימנע מבעיות אלו, צרו קשר—נקים Log Shipping במפתח מלא תוך 1–3 ימים, בהתאם למורכבות.







