1. 程式人生 > >不同資料庫之間表資料的實時同步-釋出與訂閱

不同資料庫之間表資料的實時同步-釋出與訂閱

最近要將不同伺服器上資料庫的表資料同步彙總,所以就涉及到了資料同步的問題,以前沒有接觸過,在網上找了找方法,

 大抵的方法有三種:

1,在資料庫中編寫觸發器

2,寫一個同步程式去完成同步

3,使用資料庫的釋出和訂閱功能

以上前兩種方法暫且不提,今天說說第三種方法:使用資料庫的釋出和訂閱功能實現同一伺服器下的不同資料庫的表資料同步和不同伺服器下的不同資料庫的表資料同步前提是源資料表結構和目標資料表結構必須相同。

先來說說【釋出】和【訂閱】的操作步驟,在文章的後面,會將這個過程中可能會遇到的所有問題做一個彙總,然後給出解決方法。

目錄

1釋出

2訂閱

3釋出和訂閱過程中的可能遇到問題及解決方案

1釋出
1,首先使用本機名稱連線到資料庫,不能使用IP地址連線資料庫,至於為什麼,在文後說明找到【。複製,展開復制選項,可以看到兩個節點】:【本地釋出】,【本地訂閱】

 

 

2,滑鼠右鍵點選【本地釋出】,【選擇新建釋出】

 

3,【彈出新建釋出嚮導】對話方塊,【選擇下一步】 

 

4,選擇要釋出的資料庫,點選然後【下一步】

 5,選擇釋出型別,這裡資料庫有四種釋出型別,每種釋出型別下面都有型別說明,這裡在選擇選擇【快照發布】,點選然後【下一步】

 

如圖6所示,選擇要釋出的表物件,在左側的選擇區域選擇要釋出的表資訊,然後點選【下一步】

 7,進入篩選表的設定介面,這裡的篩選是指釋出的表資料中的某一個或者全部欄位只能為固定的值,從而達到當所有的訂閱伺服器接收資料時,接收到的該欄位的值為釋出時設定的值。如果不需要,直接點選【下一步】

 8,進入快照代理介面,將介面上的兩項內容選中

 9,如果需要修改資料同步的時間和頻率,則點選【更改】

 10,設定資料同步的的的頻率段段,每天執行的的的頻率段段狀語從句:執行的開始時間結束狀語從句:時間,設定完成點選【確定】,返回到上一介面,然後點選【下一步】

 11,設定代理快照,點選【安全設定】,進入設定介面

 12,選擇【在SQL Server代理服務賬戶下執行】和【使用以下SQL Server登入名】,登入名和密碼是為了使訂閱的伺服器登入到釋出伺服器。設定完成點選【確定】,返回到上一個介面,然後點選【下一步】

 13,該頁面選擇預設設定,直接點選【下一步】

 14,為本次釋出建立一個名稱,然後點選【完成】

 15,以上步驟全部做完之後,等待發布的建立完成,當提示成功時,表示本次釋出建立成功

 16,返回到資料庫的連線初始介面,的左側處節點選擇【複製】 - 》【本地釋出】,可以在改節點下看到剛才建立好的釋出

 至此,釋出的相關操作已經做完,一個完整的釋出已經成功釋出。接下來要做的就是在需要同步資料的伺服器上訂閱該釋出。

2訂閱
在需要同步資料的伺服器上新增訂閱,訂閱剛才我們新增的釋出,這樣可以實現資料庫表資料之間的同步和遷移。

1,同樣的是使用本機名稱連線資料庫,然後選擇【複製】,展開該節點,選擇【本地訂閱】,滑鼠右鍵點選該項,選擇【新建訂閱】

2,進入新建訂閱嚮導介面,初始介面同新建釋出介面,選擇【下一步】

 3,進入為訂閱選擇釋出的介面,如果是一個伺服器不同資料庫之間的表資料同步,則在釋出伺服器中選擇本地伺服器;如果是不同伺服器之間不同資料庫的表的資料同步,則在釋出伺服器中選擇遠端伺服器。

 4,如果是不同伺服器之間的資料同步,選擇【釋出伺服器】的下拉框,選擇第一項【查詢SQL Server釋出伺服器】,會彈出【連線到伺服器】的對話方塊,點選【伺服器名稱】一欄的下拉框,選擇【瀏覽更多】,在開啟的介面【選擇網路伺服器】,找到釋出的伺服器。

 

 

 5,找到該伺服器之後,選擇用例項名登入資料庫,選擇用SQL Server身份驗證,登入名和密碼則為源伺服器建立釋出時選擇的登入名和密碼

 6,選擇連線,自動返回到選擇釋出伺服器的介面,在資料庫和釋出區域,會將連線到的伺服器的所有釋出的資料庫顯示出來,例如這個的textdb就是剛才建立的釋出資料庫,然後展開該項,可以看到我們剛才建立的釋出為111的名稱,選中該釋出,點選然後【下一步】

 如圖7所示,選擇然後【在配給物伺服器***執行上所有代理】,【點選下一步】

 如圖8所示,選擇訂閱伺服器,選中當前需要訂閱的伺服器,然後點選後面的【訂閱資料庫】,選擇下拉框,然後選擇目標資料庫,之後完成【選擇下一步】

 

9,進入分發代理安全性設定介面,選擇與訂閱伺服器的連線的選擇按鈕,進入設定介面 

 10,按照圖中所示進行設定,SQL Server登入名和密碼即為當前資料庫的登入名和密碼,設定完成點選【確定】,返回到上一介面,然後點選【下一步】

 11,同步計劃的設定,點選代理計劃框,出現下拉框,選擇需要的方式,完成設定點選之後【下一步】

 12,初始化的設定,點選初始化時間設定框,出現下拉框,選擇需要的初始化時間,完成設定點選【下一步】

 13,其他選項全部預設,點選直接【下一步】

 

14,點選完成,等待訂閱的成功提示 

 至此,目標伺服器端的訂閱也成功配置。

以上釋出和訂閱同時完成之後,只要保證伺服器之間的連線暢通,則資料會實時的實現同步。

以上只是一對一的伺服器之間的資料同步,一個伺服器同時訂閱多個釋出會有衝突,比如伺服器1的甲資料庫有一個表一,伺服器2的乙資料庫有一個表B,需要將資料庫阿中表一的資料和資料庫乙中表b的資料彙總同步到伺服器3的資料庫的ç表中,A,b,C三個表的結構需要完全相同,在的伺服器3單獨訂閱伺服器1時,資料可以順利同步,當同時訂閱伺服器1和伺服器2的時候,在同步伺服器1的資料時沒有問題,在同步伺服器2的時候,會自動覆蓋掉伺服器1的資料。

3 釋出和訂閱過程中的可能遇到問題及解決方案
在釋出和訂閱的建立過程中,往往會因為電腦的設定原因,而出現各種各樣的問題,在這裡整理一下最常見到的問題,並提供一些解決方案

1

問題:新建釋出或者訂閱,提示“無法連線到伺服器,需要有實際的服務名才能連線到伺服器”,

解決方案:該問題是因為使用了IP地址登入伺服器導致的,需要使用實際的服務名登入伺服器,具體的名稱檢視方法:【右鍵我的電腦】 - “【屬性】即可檢視到計算機名,使用該名稱連線伺服器即可

 

2

問題:新建釋出或者訂閱,提示“SQL Server複製需要有實際的伺服器名稱才能連線到伺服器,不支援通過別名,ip地址或其他任何備用名稱進行連線。請指定實際的伺服器名稱”xxxx“”

解決方案:該問題是由於更改計算機名稱導致的。如果遇到此問題,則複製下面的SQL語句到資料庫中執行

select @@servername
select serverproperty('servername')
 

執行以上兩句程式碼,結果如上圖所示,如果兩個結果的名稱不一致,則需要修改,修改程式碼如下:

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 Server(MSSQLSERVER)服務,然後重啟之後再使用一下程式碼查詢。

select @@servername
select serverproperty('servername')
結果顯示查詢結果一致,則該問題解決。

3

問題:在建立釋出的最後一步,提示一個警告,顯示“SQL Server無法啟動快照代理”

解決方案:該問題是由於SQL伺服器的一個服務沒有啟動導致的開啟SQL伺服器的配置管理器,檢視SQL伺服器的代理服務是否啟動,如果沒有啟動,則啟動該程式即可

 

暫時遇到的這幾種問題,以後遇到的在做補充。