參考文獻:
http://msdn.microsoft.com/en-us/library/ms187103.aspx
概述
SQL Server 使用日志傳送,您可以自動將“主服務器”實例上“主數據庫”內的事務日志備份發送到單獨“輔助服務器”實例上的一個或多個“輔助數據庫”。 事務日志備份分別應用於每個輔助數據庫。 可選的第三個服務器實例(稱為“監視服務器”)記錄備份和還原操作的歷史記錄及狀態,還可以在無法按計划執行這些操作時引發警報。
優點
- 為單個主數據庫以及一個或多個輔助數據庫(每個數據庫都位於單獨的 SQL Server 實例上)提供災難恢復解決方案。
- 支持對輔助數據庫的受限的只讀訪問權限(在還原作業之間的間隔期間)。
- 允許用戶將延遲時間定義為:從主服務器備份主數據庫日志到輔助服務器必須還原(應用)日志備份之間的時間。 例如,如果主數據庫上的數據被意外更改,則較長的延遲會很有用。 如果很快發現意外更改,則通過延遲,您可以在輔助數據庫反映此更改之前從其中檢索仍未更改的數據。
術語和定義
- 主服務器 (primary server):位於生產服務器上的 SQL Server 實例。
- 主數據庫 (primary database):希望備份到其他服務器的主服務器上的數據庫。 通過 SQL Server Management Studio 進行的所有日志傳送配置管理都是在主數據庫中執行的。
- 輔助服務器 (secondary server):想要在其中保留主數據庫的熱備用副本的 SQL Server 實例。
- 輔助數據庫 (secondary database):主數據庫的熱備用副本。輔助數據庫可以處於 RECOVERING 狀態或 STANDBY 狀態,這將使數據庫可用於受限的只讀訪問。
- 監視服務器 (monitor server):跟蹤日志傳送的所有詳細信息的 SQL Server 的可選實例,包括:主數據庫中事務日志最近一次備份的時間。輔助服務器最近一次復制和還原備份文件的時間。有關任何備份失敗警報的信息。
日志傳送步驟
日志傳送由三項操作組成:
-
在主服務器實例中備份事務日志。
-
將事務日志文件復制到輔助服務器實例。
-
在輔助服務器實例中還原日志備份。
日志可傳送到多個輔助服務器實例。 在這些情況下,將針對每個輔助服務器實例重復執行操作 2 和操作 3。
日志傳送配置不會自動從主服務器故障轉移到輔助服務器。 如果主數據庫變為不可用,可手動使任意輔助數據庫聯機。
您可以為了實現報表目的而使用輔助數據庫。
此外,可以針對日志傳送配置來配置警報。
典型日志傳送配置
下圖顯示了具有主服務器實例、三個輔助服務器實例和一個監視服務器實例的日志傳送配置。 此圖闡釋了備份作業、復制作業以及還原作業所執行步驟,如下所示:
-
主服務器實例執行備份作業以在主數據庫上備份事務日志。 然后,該服務器實例將日志備份放入主日志備份文件(此文件將被發送到備份文件夾中)。 在此圖中,備份文件夾位於共享目錄(“備份共享”)下。
-
全部三個輔助服務器實例都執行其各自的復制作業,以將主日志備份文件復制到它本地的目標文件夾中。
-
每個輔助服務器實例都執行其還原作業,以將日志備份從本地目標文件夾還原到本地輔助數據庫中。
主服務器實例和輔助服務器實例將它們自己的歷史記錄和狀態發送到監視服務器實例。
Log Shipping配置
Primary Server:SANZ-W7\.,以local system啟動默認數據庫實例
Primary Database:InsideTSQL2008
Secondary Server:WUW-W7\.,以域賬戶wuwang啟動默認數據庫實例,因為如果用Local System這個帳號的話,是不能訪問網絡資源的。
Secondary Database:InsideTSQL2008
配置步驟:
步驟1:
在主服務器SANZ-W7上創建一個共享目錄,給Everyone有讀的權限。比如我創建的共享目錄路徑是:C:\Temp\LogShipping,共享路徑是:\\SANZ-W7\LogShipping。
步驟2:
對主數據庫InsideTSQL2008做一個全備份(可以不做全備份,在配置log shipping的時候再做全備份,下面會提到),然后把備份文件InsideTSQL2008.bak放在C:\Temp\LogShipping目錄下。在輔助服務器上創建目錄C:\Temp\LogShipping。
步驟3:
設置LogShipping的配置屬性,我們右鍵InsideTSQL2008->Tasks->Ship Transaction Logs,會出現如下圖所示界面:
點擊Backup Settings進行如下配置:
在此處創建了一個Job叫做LSBackup_InsideTSQL2008,用來自動備份事務日志。
步驟4:
然后添加Secondary服務器WUW-W7,如下圖所示:
Seconday server instance我們選擇WUW-W7,Secondary database默認就是跟primary database同名的InsideTSQL2008。如下圖所示,我們在Initialize Secondary Database中看到有兩個選項,一個是創建數據庫全備份,然后將這個全備份回復到secondary database中,另外一個是指定已有全備份的路徑。
在Copy File標簽中添加Secondary Server保存文件的路徑,我們這里使用同名的路徑。還有secondary server也要啟動sql agent。
配置完畢以后點擊OK,最后會有一個配置成功界面:
Log Shipping驗證:
我們在服務服務器WUW-W7下查看InsideTSQL2008信息,如下圖所示:
我們可以發現InsideTSQL2008處於Resotoring狀態,這是因為恢復到服務數據庫的都是使用nonrecovery模式的。
在完全正確配置Log Shipping以后,我們可以在primary server的C:\Temp\LogShipping目錄下看到如下這些日志備份文件
在Secondary server的C:\Temp\LogShipping目錄下看到
唯一的區別就是primary server有full database backup,而Secondary server中沒有。不論是primary server上的LSBackup_TESTDB1,還是secondary server上的LSCopy_SANZ-W7_TESTDB1和LSRestore_SANZ-W7_TESTDB1,我將他們都設置成每一分鍾執行一次,這樣方便查看實驗結果。
"Could not retrieve backup settings for primary ID"錯誤的解決方法
在SSMS中查看LSBackup_InsideTSQL2008這個Job的工作情況,發現這個Job報錯,錯誤如下:
*** Error: Could not retrieve backup settings for primary ID 'f32baa93-0341-48b5-a5a0-2acde90283fa'.(Microsoft.SqlServer.Management.LogShipping) ***<nl/>2012-09-09 19:30:15.85*** Error: Failed to connect to server WIN-E5EJQ0EN4O2.(Microsoft.SqlServer.ConnectionInfo) ***<nl/>2012-09-09 19:30:15.85*** Error: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider<c/> error: 40 - Could not open a connection to SQL Server)(.Net SqlClient Data Provider) ***<nl/>2012-09-09 19:30:15.85----- END OF TRANSACTION LOG BACKUP -----
從上述錯誤日志中我們發現有一條是說無法連接 server WIN-E5EJQ0EN4O2。但是我的primary server是SANZ-W7啊,怎么成了WIN-E5EJQ0EN4O2?這是當初安裝系統的時候,立馬就安裝了sql server,然后又將主機名從WIN-E5EJQ0EN4O2改成了SANZ-W7。但是在sys.servers中沒有更新,我們可以通過如下TSQL語句查看:
select @@SERVERNAME
其查詢結果就是WIN-E5EJQ0EN4O2。我們只需要更新數據庫中sys.servers信息就可以了。我們執行如下TSQL語句更新server信息
--刪除舊的主機名 EXEC sp_dropserver 'WIN-E5EJQ0EN4O2' GO --添加當前主機名 EXEC sp_addserver 'SANZ-W7', 'local' GO
在執行完上述TSQL語句以后一定要記得重啟sql server,否則使用select @@SERVERNAME查詢當前server名稱還是WIN-E5EJQ0EN4O2。