<備忘>設計一個安全的複寫環境(Secure Replication)
設計 SQL Server 的複寫工作之前,首先請先確認環境的建置,大多數無法順利建立複寫的原因,是因為安全性的設定不正確,而導致複寫無法順利設定完成。
在設定複寫環境之前,我們只要想一下複寫的動作,自然就會了解為何安全性是如此的重要。
如果複寫的環境設定不出來,不妨先簡化環境的設定。舉例來說,先把發行者、散發者與訂閱者三種角色都由一台 SQL Server 扮演,這樣就一定能先測試成功,再來再慢慢的增加難度,以期能達到發行者、散發者與訂閱者分別用一台機器來扮演。
你可以用下面的步驟來檢視一下你的權限是否有設定正確:
1.
A 機器要傳送資料到 B 機器,尤其是要利用代理程式幫忙傳送,一定得設定好權限。所以 SQL Server Agent 的登入帳號的權限不能太小,如果 A 機器與 B 機器都沒有加入網域的話,那麼你所設定的登入帳號必需要能完全存取 C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA 目錄的權限。
到控制台的服務,檢查一下登入帳號。
設定 REPLDATA 的權限,確定登入帳號能完全控制。
2.
如果 A 機器與 B 機器有加入到網域,則 A 機器的登入帳號就用網域帳號進行登入,同樣的也必需要設定 REPLDATA 目錄的安全性。
3.
將你要設定的散發者與訂閱者機器,利用 Enterprise Manager 註冊進來。
接下來就可以利用精靈來設定複寫了。
複寫的設定的步驟如下:
1.
建立發行集。
2.
設定 push 或是 pull 發行集。
利用工具 → 複寫建立與管理發行集。
選擇想要散發的資料庫,然後按下建立發行集。
精靈的好處在這裡,如果你並沒有完成一些工作,某些按鈕就沒有辦法按下。
選擇散發者的機器,如果你事先已經將其他台的 SQL Server 先註冊進來的話,你可以選擇其他台 SQL Server 當作散發伺服器,如果沒有的話,你也可以用本機電腦作為散發者, SQL Server 會幫你在該台機器中建立一個 distribution 資料庫。
預設會將所有資料庫的資料,利用快照集資夾進行傳送,所以要先確認一下這個資料夾是否 SQL Server Agent 具備有存取的權限,換句話來說,資料之間的搬移複製動作,都是透過這個資料夾暫存相關的資訊。
選擇要散發的資料庫,這裡是以 Northwind 資料庫為例。
你可以選擇 SQL Server 複寫的對象是何種類型的資料庫,可以是 SQL Server 2000、SQL Server 7.0 或是非 SQL Server 的關連式資料庫,例如你可以選擇是 Oracle,或是 Access 資料庫。(不過若是選擇異質資料庫,則只能用 push 的方式將資料發送到異質資料庫,而不能使用 pull 的方式提取資料庫)。
選擇想要散發的資料表或是檢視表、預存程序,如果是交易式複寫,則資料表必需要有主索引鍵。
設定發行集的名稱,因為一個資料庫可能會有數個發行集。
*****************錯誤訊息分隔線************************
原則上,在這裡設定完成後即可以進入下一階段。但是?如果您和小羽一樣是將舊有資料庫轉移到新資料庫後再更名的話應該會出現以下訊息:
錯誤18483:未能連接到服務器「Server」,因為「distributor_admin」未在該服務器上定義為遠程登入。
出現此問題就是因為曾經更改過資料庫的名稱才會導致如此。
解決方法為:
進入Query Analyzer並登入資料庫中,打入以下程式碼*注意均不用更動,直接複製貼上即可。*
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end
完成後重新啟動SQL服務,再重新配置一次發行集即可順利運作
*****************錯誤訊息分隔線************************
精靈正在建立發行集的設定。
設定完發行集後,就可以設定資料集的訂閱工作,只要選擇發行集名稱,再按下「發送新的訂閱」,就會出現設定精靈。
從清單選出訂閱者的名稱,如果訂閱者名稱很多,則必需一個一個先將這些訂閱者利用 Enterprise Manager 註冊進來。
選擇要複寫到訂閱者機器上的哪一個資料庫。
選擇更新訂閱的頻率,如果是交易式複寫的話,可以選擇「連續」,不然可以使用排程,使得快照集資料定期傳送到訂閱者端。
如果訂閱者端沒有資料,則要選擇初始化結構描述與資料,以及啟動快照集代理程式以立即開始初始化處理,這樣訂閱者端資料庫才會初始資料。
精靈開始執行,將訂閱者端的資料初始化。
可以在複寫監視器中,查看發行集是否已經產生了快照集,並且將資料傳送到訂閱者的資料庫端。
這時後,可以透過複寫監視器中,看到 test 資料庫已經將快照集準備好了,可以切換到 test 資料庫看一下裡面的內容。
在 test 資料庫中的 Employees 資料庫,目前已經將整個快照集的資料收集過來。
快照集產生出來的速度,端看你的資料量多寡,以及與訂閱者端網路的頻寬決定,所以快照集代理程式這個動作,在實務上是最花費時間的動作。
不管你是使用哪一種複寫方式,都會有快照集的產生,之後資料間的異動,就看複寫的特性了。
本例是用交易式的複寫,所以我在發行者端 Employees資料庫做個異動之後,再檢查複寫監視器。
交易複寫的改變-只要發行者有任何異動,都會被記錄助讀員發現,進而將該筆交易資料送到訂閱者資料庫中,完成資料庫複寫的工作。
參考資料來源:
1.http://www.microsoft.com/taiwan/technet
2.http://www.sinhu.net
在設定複寫環境之前,我們只要想一下複寫的動作,自然就會了解為何安全性是如此的重要。
如果複寫的環境設定不出來,不妨先簡化環境的設定。舉例來說,先把發行者、散發者與訂閱者三種角色都由一台 SQL Server 扮演,這樣就一定能先測試成功,再來再慢慢的增加難度,以期能達到發行者、散發者與訂閱者分別用一台機器來扮演。
你可以用下面的步驟來檢視一下你的權限是否有設定正確:
1.
A 機器要傳送資料到 B 機器,尤其是要利用代理程式幫忙傳送,一定得設定好權限。所以 SQL Server Agent 的登入帳號的權限不能太小,如果 A 機器與 B 機器都沒有加入網域的話,那麼你所設定的登入帳號必需要能完全存取 C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA 目錄的權限。
到控制台的服務,檢查一下登入帳號。
設定 REPLDATA 的權限,確定登入帳號能完全控制。
2.
如果 A 機器與 B 機器有加入到網域,則 A 機器的登入帳號就用網域帳號進行登入,同樣的也必需要設定 REPLDATA 目錄的安全性。
3.
將你要設定的散發者與訂閱者機器,利用 Enterprise Manager 註冊進來。
接下來就可以利用精靈來設定複寫了。
複寫的設定的步驟如下:
1.
建立發行集。
2.
設定 push 或是 pull 發行集。
利用工具 → 複寫建立與管理發行集。
選擇想要散發的資料庫,然後按下建立發行集。
精靈的好處在這裡,如果你並沒有完成一些工作,某些按鈕就沒有辦法按下。
選擇散發者的機器,如果你事先已經將其他台的 SQL Server 先註冊進來的話,你可以選擇其他台 SQL Server 當作散發伺服器,如果沒有的話,你也可以用本機電腦作為散發者, SQL Server 會幫你在該台機器中建立一個 distribution 資料庫。
預設會將所有資料庫的資料,利用快照集資夾進行傳送,所以要先確認一下這個資料夾是否 SQL Server Agent 具備有存取的權限,換句話來說,資料之間的搬移複製動作,都是透過這個資料夾暫存相關的資訊。
選擇要散發的資料庫,這裡是以 Northwind 資料庫為例。
你可以選擇 SQL Server 複寫的對象是何種類型的資料庫,可以是 SQL Server 2000、SQL Server 7.0 或是非 SQL Server 的關連式資料庫,例如你可以選擇是 Oracle,或是 Access 資料庫。(不過若是選擇異質資料庫,則只能用 push 的方式將資料發送到異質資料庫,而不能使用 pull 的方式提取資料庫)。
選擇想要散發的資料表或是檢視表、預存程序,如果是交易式複寫,則資料表必需要有主索引鍵。
設定發行集的名稱,因為一個資料庫可能會有數個發行集。
*****************錯誤訊息分隔線************************
原則上,在這裡設定完成後即可以進入下一階段。但是?如果您和小羽一樣是將舊有資料庫轉移到新資料庫後再更名的話應該會出現以下訊息:
錯誤18483:未能連接到服務器「Server」,因為「distributor_admin」未在該服務器上定義為遠程登入。
出現此問題就是因為曾經更改過資料庫的名稱才會導致如此。
解決方法為:
進入Query Analyzer並登入資料庫中,打入以下程式碼*注意均不用更動,直接複製貼上即可。*
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end
完成後重新啟動SQL服務,再重新配置一次發行集即可順利運作
*****************錯誤訊息分隔線************************
精靈正在建立發行集的設定。
設定完發行集後,就可以設定資料集的訂閱工作,只要選擇發行集名稱,再按下「發送新的訂閱」,就會出現設定精靈。
從清單選出訂閱者的名稱,如果訂閱者名稱很多,則必需一個一個先將這些訂閱者利用 Enterprise Manager 註冊進來。
選擇要複寫到訂閱者機器上的哪一個資料庫。
選擇更新訂閱的頻率,如果是交易式複寫的話,可以選擇「連續」,不然可以使用排程,使得快照集資料定期傳送到訂閱者端。
如果訂閱者端沒有資料,則要選擇初始化結構描述與資料,以及啟動快照集代理程式以立即開始初始化處理,這樣訂閱者端資料庫才會初始資料。
精靈開始執行,將訂閱者端的資料初始化。
可以在複寫監視器中,查看發行集是否已經產生了快照集,並且將資料傳送到訂閱者的資料庫端。
這時後,可以透過複寫監視器中,看到 test 資料庫已經將快照集準備好了,可以切換到 test 資料庫看一下裡面的內容。
在 test 資料庫中的 Employees 資料庫,目前已經將整個快照集的資料收集過來。
快照集產生出來的速度,端看你的資料量多寡,以及與訂閱者端網路的頻寬決定,所以快照集代理程式這個動作,在實務上是最花費時間的動作。
不管你是使用哪一種複寫方式,都會有快照集的產生,之後資料間的異動,就看複寫的特性了。
本例是用交易式的複寫,所以我在發行者端 Employees資料庫做個異動之後,再檢查複寫監視器。
交易複寫的改變-只要發行者有任何異動,都會被記錄助讀員發現,進而將該筆交易資料送到訂閱者資料庫中,完成資料庫複寫的工作。
參考資料來源:
1.http://www.microsoft.com/taiwan/technet
2.http://www.sinhu.net
留言