日志傳送功能可自動復制數據庫的交易日志文件,並回存到備援服務器 (standby server) 的另外一個數據庫。因此可大幅提高SQL Server數據庫之可用性。因為備援數據庫完整地接收來源數據庫的異動情況,所以它就是一份來源數據庫的復本 - 差別僅在於資料復制與加載過程所產生的時間差。然而,當主要服務器停擺時,您就可以將備援服務器更改為新的主要服務器。如果原來的主要服務器可重新上線使用,那麼您可以將其設定為新的備援服務器 - 事實上就是對調兩台服務器的角色。
在SQL Server 2000企業版或開發版之中,Microsoft在Enterprise Manager內提供了一項日志傳送(Log Shipping)的功能 - 為數據庫維護計劃精靈的其中一部份。在使用之前的SQL Server時,您需要自行建立日志傳送系統。
設定日志傳送
主要服務器(primary server) 即是實際處理資料的正式服務器;此服務器內擁有來源數據庫。次要服務器(secondary server)上存放目的數據庫,用來復制與回存來源數據庫的交易日志文件。監控服務器(monitor server)用來監控主要服務器與次要服務器。與SQL Server 7.0不同的是(SQL Server 7.0是在次要服務器上監控日志傳送動作),SQL Server 2000使用Enterprise Manager的日志傳送監控工具來監控每一組傳送中的日志資料。Microsoft建議您在另外一台監控用服務器安裝這個工具程序。
您可以利用Enterprise Manager的數據庫維護計劃精靈設定SQL Server 2000的日志傳送。但是在您激活精靈之前,您必須先進行某些准備工作。一開始請先遵循下列步驟:
1.決定一組要設定日志傳送的服務器(即日志傳送過程之中,主要服務器與次要服務器為何)。
2. 選擇一台監控服務器。最好不同於主要服務器或次要服務器。
3. 設定所有服務器之安全性。您用來設定日志傳送的Windows帳號必須擁有所有服務器上SQL Server系統管理者(sa)的權限。
4. 在主要/次要服務器上建立分享資料夾。首先,將來源數據庫交易日志文件所在的目錄設定為分享目錄。接著在次要服務器上,將您打算回存交易日志文件的目錄也分享出來。為了清楚辨別各分享目錄,請在分享名稱內注明服務器與數據庫之名稱。如果分享目錄名稱已存在,您可能需要從分享目錄中刪除或是搬移其它檔案,特別是舊的日志備份文件。然後再將這些分享目錄的權限開放給每一台服務器上SQL Agent所使用的Windows帳號。
5. 決定如何建立並初始化目的地數據庫。您可以在日志傳送設定過程就先建立與初始同步化目的地數據庫,否則您必須手動進行初始數據庫之回存動作。
6. 在Enterprise Manager注冊此三台服務器(即主要、次要與監控服務器)。
在您完成這些准備動作時,您就可以准備激活數據庫維護計劃精靈來設定日志傳送。您可以先檢視日志傳送過程的五個連續步驟,如圖1所示:
圖1:SQL Server 2000日志傳送的設定步驟。
前兩個為選擇性(optional)步驟。如果您尚未同步化來源與目的數據庫,則步驟1會為您先備份來源數據庫,然後執行同步化動作。在步驟2時,精靈會將備份文件復制到次要服務器,並回存到目的地數據庫。
精靈一定會執行其余三項步驟。在步驟3時,精靈將在主要服務器上建立一個SQL Agent工作(job)。此工作將會周期性地把交易日志文件內容備份到磁盤檔案內。精靈也會在次要服務器上建立一個傳送日志的數據庫維護計劃;此計畫包含兩個SQL Agent工作:一個是將交易日志文件復制到次要服務器(步驟4),另一個則是將交易日志文件回存到目的數據庫(步驟5)。這些步驟將建立一組日志傳送服務器(互相有日志傳送關系的兩個數據庫)。如果您想要額外提供容錯功能或是設定一台報表服務器,那麼您可以將主要服務器與另外一台次要服務器組合在一起,再設定一組日志傳送配對服務器。
准備工作
1. 准備 Primary Server (以下為Ztao-1) 及 Secondary Server (以下為IntronTest)
2. 將要作 Log Shipping 的數據庫(以下為IntronERP)之還原模型(Recovery Model)設定為完整(FULL)。
3. 將兩台計算機的SQL Server服務賬號加入Administrator群組
4. 建立Primary Server 備份Log的數據夾
a. 建立C:\Logfile,以存放Primary Server數據庫Transaction Log的備份
b. 將C:\Logfile作數據分享,分享目錄的權限開放給SQL Agent所使用的Windows帳號。
5. 建立 Secondary Server 還原的數據夾(在Secondary Server)
a. 建立C:\Shippedlog數據夾以存放從Primary Server傳送過來的Transaction log 的備份
b. 建立 C:\Logfile數據夾,當角色交換後,可存放新Primary Server的數據庫Transaction Log
c. 將C:\Logfile數據夾作資源共享,分享目錄的權限開放給SQL Agent所使用的Windows帳號。
6. 在Pri
if exists(
select * from sysobjects
where name='pr_backup_db' and xtype='p'
)
begin
drop proc pr_backup_db
end
go
/*備份數據庫*/
create proc pr_backup_db
@flag varchar(10) out,
@backup_db_name varchar(128),
@filename varchar(1000) --路徑+文件名字
as
declare @sql nvarchar(4000),
if exists(
select * from sysobjects
where name='fn_GetFilePath' and xtype='fn'
)
begin
drop function fn_GetFilePath
end
go
/*創建函數,得到文件得路徑*/
create function fn_GetFilePath(@filename nvarchar(260))
returns nvarchar(260)
as
begin
declare @file_path nvarchar(260)
declare @filename_reverse nvarchar(260)
select @filename_reverse=reverse(@filename)
select @file_path=substring(@filename,1,len(@filename)+1-charindex('\',@filename_reverse))
return @file_path
end
go
if exists(
select * from sysobjects
where name='pr_restore_db' and xtype='p'
)
begin
drop proc pr_restore_db
end
go
create proc pr_restore_db /*恢復數據庫*/
@flag varchar(20) out, /*過程運行的狀態標志,是輸入參數*/
@restore_db_name nvarchar(128), /*要恢復的數據名字*/
@filename nvarchar(260) /*備份文件存放的路徑+備份文件名字*/
as
declare @proc_result tinyint /*返回系統存儲過程xp_cmdshell運行結果*/
declare @loop_time smallint /*循環次數*/
declare @max_ids smallint /*@tem表的ids列最大數*/
declare @file_bak_path nvarchar(260) /*原數據庫存放路徑*/
declare @flag_file bit /*文件存放標志*/
declare @master_path nvarchar(260) /*數據庫master文件路徑*/
declare @sql nvarchar(4000),@par nvarchar(1000)
declare @sql_sub nvarchar(4000)
declare @sql_cmd nvarchar(4000)
/*
判斷參數@filename文件格式合法性,以防止用戶輸入類似d: 或者 c:\a\ 等非法文件名
參數@filename裡面必須有'\'並且不以'\'結尾
*/
if right(@filename,1)<>'\' and charindex('\',@filename)<>0
begin
select @sql_cmd='dir '+@filename
EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
IF (@proc_result<>0) /*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
begin
select @flag='not exist' /*備份文件不存在*/
return /*退出過程*/
end
/*創建臨時表,保存由備份集內包含的數據庫和日志文件列表組成的結果集*/
create table #tem(
LogicalName nvarchar(128), /*文件的邏輯名稱*/
PhysicalName nvarchar(260) , /*文件的物理名稱或操作系統名稱*/
Type char(1),
您正在看的SQLserver教程是:SQL Server 2000之日志傳送功能 - 設定。to #tem
execute('restore filelistonly from disk='''+@filename+'''')
/*將臨時表導入表變量中,並且計算出相應得路徑*/
insert into @tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)
select LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
from #tem
if @@rowcount>0
begin
drop table #tem
end
select @loop_time=1
select @max_ids=max(ids) /*@tem表的ids列最大數*/
from @tem
while @loop_time<=@max_ids
begin
select @file_bak_path=file_path
from @tem where ids=@loop_time
select @sql_cmd='dir '+@file_bak_path
EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
/*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
IF (@proc_result<>0)
select @loop_time=@loop_time+1
else
BREAK /*沒有找到備份前數據文件原有存放路徑,退出循環*/
end
select @master_path=''
if @loop_time>@max_ids
select @flag_file=1 /*備份前數據文件原有存放路徑存在*/
else
begin
select @flag_file=0 /*備份前數據文件原有存放路徑不存在*/
select @master_path=dbo.fn_GetFilePath(filename)
from master..sysdatabases where name='master'
end
select @sql_sub=''
/*type='d'是數據文件,type='l'是日志文件 */
/*@flag_file=1時新的數據庫文件還是存放在原來路徑,否則存放路徑和master數據庫路徑一樣*/
select @sql_sub=@sql_sub+'move '''+LogicalName+''' to '''
+case type
when 'd' then case @flag_file
when 1 then File_path
else @master_path
end
when 'l' then case @flag_file
when 1 then File_path
else @master_path
end
--備份數據庫test_database
declare @fl varchar(10)
execute pr_backup_db @fl out,'test_database','c:\test_database.bak'
select @fl
--恢復數據庫,輸入的參數錯誤
declare @fl varchar(20)
exec pr_restore_db @fl out,'sa','c:\'
select @fl
--恢復數據庫,即創建數據庫test_database的復本test_db
declare @fl varchar(20)
exec pr_restore_db @fl out,'test_db','c:\test_database.bak'
select @fl
更改日志傳送之組態設定
您可以使用數據庫維護計劃之【屬性】對話盒來更改日志傳送相關設定。在【交易記錄文件備份】設定頁提供的選項可更改日志傳送過程中交易日志文件備份的組態。
【記錄傳送】設定頁顯示出您先前在維護計劃內設定的日志傳送配對服務器;如果您設定了其它組日志傳送配對服務器,也會列在此處。本設
您正在看的SQLserver教程是:SQL Server 2000之日志傳送功能 - 設定。定頁也包含下列選項:新增目的數據庫(用以建立新的日志傳送配對服務器)、刪除既有日志傳送配對服務器、編輯目前的日志傳送配對服務器之屬性,以及移除整個日志傳送功能。
在【超出同步臨界值】項目可設定:當日志傳送監控程序產生警示訊息之前所能允許的最大時間間隔 (介於最近一次來源數據庫交易日志文件備份以及最新的交易日志文件回存動作之間)。您也可以在日志傳送監控程序之中設定此參數。【在入時間延遲】、【檔案保留期限】以及【歷程記錄保留期限】則是與次要服務器相關的設定。
注:監控服務器在這些組態選項中扮演相當重要的角色。因為【記錄傳送】設定頁的大部分信息取決於監控服務器,所以一但監控服務器停擺時,您將無法更改日志傳送的組態設定值。在監控服務器執行SQL Server 2000 Profiler時,主要服務器會連到監控服務器,然後從日志傳送資料表中取得既有的日志傳送計劃。因此,要改變日志傳送計劃的設定時,您必須確定在Enterprise Manager內可以連接到監控服務器。
檢查與監控日志傳送動作
SQL Server 2000的日志傳送功能還提供了一項日志傳送監控程序,可讓您安裝在另一**立監控用服務器。
在SQL Server企業版與開發版的msdb數據庫中共有七個關於日志傳送的資料表:
log_shipping_plans
log_shipping_plan_databases
log_shipping_databases
log_shipping_plan_history
log_shipping_monitor
log_shipping_pr
您可在次要服務器監控SQL Agent工作(復制交易日志文件到次要服務器,並回存至目的數據庫)。 您也可檢視目的數據庫的屬性對話盒,以決定該數據庫在日志傳送過程所扮演的角色。
在次要服務器上,SQL Server使用msdb數據庫的四個日志傳送資料表。當SQL Server建立一個日志傳送計劃之後,它會新增一筆資料到log_shipping_plan資料表,用以紀錄:主要與次要服務器的名稱、檔案位置、復制與回存工作ID(來自於次要服務器之sysjobs系統資料表)。在log_shipping_plan_databases資料表,SQL Server會連結維護計劃以及來源/目的數據庫名稱,而且儲存最後一次進行檔案復制與加載動作的相關信息。log_shipping_plan_history資料表則是將每次日志傳送的復制與回存事件紀錄下來,連同該工作是否成功的信息。SQL Server也會新增一筆資料在log_shipping_monitor資料表,用以參照監控服務器。
如果您勾選了【Allow database to assume primary role】復選框,您將在次要服務器上看到一個重要的額外項目:另一個數據庫維護計劃(與您先前所建立的維護計劃名稱相同),但是並沒有激活日志傳送。您也會看到一個非作用中(disabled)的SQL Agent工作(備份該數據庫的交易日志)。也許您會被這些項目所混淆。盡管它們的名字相同,但是此額外產生的維護計劃卻不同於當初所建立的那個。SQL Server保留第二個逆向維護計劃是為了以後可能發生的主要/次要服務器角色對調動作所准備。
在監控服務器上檢視日志傳送動作 當您正確設定日志傳送之後,SQL Server 會激活監控服務器上Enterprise Manager 的日志傳送監控工具程序。此外,SQL Server會建立兩個SQL Agent 警示工作(alert job):一個用來執行工作,另一個處理out-of-sync情況。
使用監控工具程序的方式是,開啟Enterprise Manager並連至監控服務器,展開【Management】節點,然後點選【記錄傳送監視器(Log Shipping Monitor)】。當您點選此工具程序時,其內會列出日志傳送配對服務器的清單。您可在配對服務器
其狀態(Status)可以是Normal 或是Out-of-Sync。如果SQL Server Agent尚未復制或回存交易日志文件,對話盒內將會顯示日志文件名為first_file_000000000000.trn。這並不是實際的文件名稱,只不過是用來標示SQL Server Agent尚未處理任何檔案而已。在【Status】設定頁也會顯示備份、復制以及加載(回存)等動作執行時所耗費的時間。此設定頁之信息不會自動更新,所以您必須將此對話盒關閉後再開啟,才能更新其資料。
SQL Server只使用msdb數據庫內兩個資料表來儲存日志傳送服務器之相關資料。SQL Server在這兩個資料表中都給予一個ID做為連結,以及一個外來鍵(foreign key)。
該外來鍵是設定在log_shipping_secondaries資料表上,並參照log_shipping_primaries資料表的primary_id字段(這兩個是所有日志傳送資料表中唯一具有外來鍵關系的資料表)。在log_shipping_primaries資料表內的每筆資料都包含日志傳送的相關信息,例如:來源數據庫名稱、交易日志文件備份工作執行之狀態,以及已規劃的停擺信息(可避免不必要的警示訊息)。而log_shipping_secondarIEs 資料表之每筆資料關於目的數據庫之信息;每個目的數據庫附屬於特定的日志傳送來源數據庫。這兩個資料表互相連結的結果就是日志傳送監控程序內所顯示的配對服務器信息。
移除與重新組態日志傳送功能
如果您想從數據庫維護計劃中移除日志傳送功能,可參考下列方式:開啟該計劃的屬性對話盒,選擇【記錄傳送】設定頁,然後點選【移出記錄傳送】。此動作將從次要服務器上移除SQL Server Agent的備份與回存工作,並清除日志傳送資料表內的所有相關資料。此外,日志傳送監控程序的相關信息也會一並被清除。然而此動作將會適當地保留主要服務器上SQL Server Agent的交易日志備份工作。只有在刪除數據庫維護計劃時,該工作才會被移除。假如您想從監控服務器內移除掉日志傳送監控程序,請用手動方式將log_shipping_primaries與log_shipping_secondarIEs這兩個資料表(位於監控服務器的msdb數據庫)的資料刪除即可。
如果您在數據庫維護計劃內設定日志傳送時,就已允許目的數據庫可以做為新的日志傳送來源數據庫。當您刪除主要服務器的維護計劃時,次要服務器上仍然會保留其數據庫維護計劃,以及交易日志文件備份工作。刪除這些項目的方式是將次要服務器上與日志傳送相關的數據庫維護計劃直接刪除。