2013年3月13日 星期三

如何結合Database Mirroring與Log Shipping

         在我前面多篇的文章中已有介紹到多種HA(High Availability Solutions)的架設方式,而其實最簡單也是最多人入門使用的,就是Log Shipping與Database Mirroring,但由於Database Mirroring不像AlwaysOn可以擁有多個複本,只能有一個鏡射節點,所以這時候我們就可以透過Database Mirroring與Log Shipping的整合,藉以達到多個複本,也可以達到同地與異地的備援方案。

前導文章:
如何建立 Log Shipping
http://caryhsu.blogspot.com/2012/02/log-shipping.html
SQL Server - 如何建立 Database Mirroring
http://caryhsu.blogspot.com/2011/12/sql-server-database-mirroring.html


相關的架設方式,其實可以參考MSDN上的說明,但可惜的是官網上說的太過於簡單,所以我才整理這篇文章來加以說明,希望大家可以更清楚的了解到如何整合Database Mirroring與Log Shipping.


架構說明:
1、Database Mirroring:
1-1 建議使用高可用性的架構(High-Safety Mode)。
1-2 建議有一台監控伺服器(Witness Server)

2、Lop Shipping:
2-1 不一定要有監控伺服器(Witness Server),可以透過手動進行Log Shipping的Failover。
2-2 備份的檔案必須放在第三台上面,也就是檔案放在一台獨立的主機上。
2-3 還原交易記錄請選擇不復原模式。



設定方式:
1、請先參考之前的文章進行架設,但整合上有些注意事項,詳細的部份,請一定要依照架構說明的部份進行。

SQL Server - 如何建立 Database Mirroring
http://caryhsu.blogspot.com/2011/12/sql-server-database-mirroring.html

2、設定Log Shipping。
2-1 指定備份的位址,此時我將備份的位置指定到備份主機上的目錄,再次提醒,此位置必須讓Database Mirroring與Log Shipping的主機都要能有讀寫的權限。


PS:由於資料的限制,所以我先將檔案備份的位址放在AD的主機上,其實應該要在一台獨立的主機上,而不是放在AD上,以免影響AD主機的運作。


2-2 選擇加入Log Shipping的Secondary主機後,由於我在Secondary沒有這個資料庫的存在,所以我選擇第一項進行。

2-3 切換到 [複製檔案] 的頁次,輸入Log Shipping中Secondary上的分享路徑上。

2-4 切換到 [還原交易記錄] 的頁次後,此部份請選擇 [不復原模式] ,藉以避免在復原的情況下,其他使用者的存取,造成復原的失敗。

2-5 設定完成後,請將此設定輸出成指令檔,後續上會使用到。

2-6 建立完成後,請先確認各個Job執行上應該都能正常的執行。

2-6-1 Primary上的 Job清單
LSBackup_Northwind

2-6-2 Secondary上的Job清單
a. LSAlert_CARY-TEST
b. LSCopy_WIN-2008R2-1_Northwind
c. LSRestore_WIN2008R2-1_Northwind


3、整合Database Mirroring與Log Shipping
3-1 請在Database Mirroring上進行手動的Failover,將節點切換到Mirror的機器上。
3-2 請在原本是Mirror的機器上(目前為Principal)執行之前儲存的Script。

PS:
a. Script的部份分成兩大區塊,上半部是在(Primary)的主機上執行,而下半部是在Secondary的主機上執行,但請注意,我們在目前Principal(之前的Mirror)的機器上只需執行上半部即可。
b. 基本上你另存的語法不需作任何的修改,只需執行在Principal (之前的Mirror)的主機上即可。
c. 由於Log Shipping的GUI介面只能指定到一個Primary主機,所以一定要透過語法的方式進行。


語法內容 -- 只截取上半部
-- 在主要伺服器端執行下列陳述式,以設定記錄傳送
-- 針對資料庫 [WIN-2008R2-1].[Northwind]
-- 指令碼需要在主要伺服器端的 [msdb] 資料庫內容中執行。
-------------------------------------------------------------------------------------
-- 加入記錄傳送組態

-- ****** 開始: 要在主要伺服器端執行的指令碼: [WIN-2008R2-1] ******


DECLARE @LS_BackupJobId AS uniqueidentifier
DECLARE @LS_PrimaryId AS uniqueidentifier
DECLARE @SP_Add_RetCode As int


EXEC @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database
@database = N'Northwind'
,@backup_directory = N'\\win-cary-ad\log_backup'
,@backup_share = N'\\win-cary-ad\log_backup'
,@backup_job_name = N'LSBackup_Northwind'
,@backup_retention_period = 4320
,@backup_compression = 2
,@backup_threshold = 60
,@threshold_alert_enabled = 1
,@history_retention_period = 5760
,@backup_job_id = @LS_BackupJobId OUTPUT
,@primary_id = @LS_PrimaryId OUTPUT
,@overwrite = 1


IF (@@ERROR = 0 AND @SP_Add_RetCode = 0)
BEGIN

DECLARE @LS_BackUpScheduleUID As uniqueidentifier
DECLARE @LS_BackUpScheduleID AS int


EXEC msdb.dbo.sp_add_schedule
@schedule_name =N'LSBackupSchedule_WIN-2008R2-11'
,@enabled = 1
,@freq_type = 4
,@freq_interval = 1
,@freq_subday_type = 4
,@freq_subday_interval = 15
,@freq_recurrence_factor = 0
,@active_start_date = 20130312
,@active_end_date = 99991231
,@active_start_time = 0
,@active_end_time = 235900
,@schedule_uid = @LS_BackUpScheduleUID OUTPUT
,@schedule_id = @LS_BackUpScheduleID OUTPUT

EXEC msdb.dbo.sp_attach_schedule
@job_id = @LS_BackupJobId
,@schedule_id = @LS_BackUpScheduleID

EXEC msdb.dbo.sp_update_job
@job_id = @LS_BackupJobId
,@enabled = 1


END


EXEC master.dbo.sp_add_log_shipping_alert_job

EXEC master.dbo.sp_add_log_shipping_primary_secondary
@primary_database = N'Northwind'
,@secondary_server = N'cary-test'
,@secondary_database = N'Northwind'
,@overwrite = 1

-- ****** 結束: 要在主要伺服器端執行的指令碼: [WIN-2008R2-1]  ******

3-3 此時請再執行各個Log Shipping上的Job,藉以確認是否正常運作,如此即完成此兩個功能的整合。


參考網址:
Database Mirroring and Log Shipping (SQL Server)
http://msdn.microsoft.com/en-us/library/ms187016.aspx


關鍵字:Database MirroringLog ShippingDatabase Mirroring and Log Shipping Working TogetherSetup database mirroring and log shipping together

3 則留言:

  1. 你好 , 請問我在做Database Mirroring與Log Shipping的時候如果交易紀錄太大了需要刪除交易紀錄 , 在這樣的架構下Mirror和LogShipping會不會出現問題

    因為不管事Mirror或是Log Shipping都是使用交易紀錄再還原 , 若是刪除資料是否會造成中間的資料無法還原或是流失

    回覆刪除
    回覆
    1. 是的,刪除的話的確會造成Mirror與Log Shipping失敗,如果你不清楚交易紀錄檔為何這麼大的話,你可以透過下列的語法查詢確認,這樣會比較好。

      select log_reuse_wait_desc from sys.databases

      sys.databases (Transact-SQL)
      http://technet.microsoft.com/zh-tw/library/ms178534.aspx

      刪除
  2. 如果要進行刪除Log的話,是否要重新同步Mirror與Log Shipping,因為若要進行的話線上系統都需要停機,有更有效率並不需要停機就可以清除交易紀錄的方法嗎。

    謝謝

    回覆刪除