sqlserver關於發佈訂閱replication_subscription的總結

(轉載)sqlserver關於發佈訂閱replication_subscription的總結

 

來自 “ ITPUB博客 ” ,原文地址:http://blog.itpub.net/30126024/viewspace-2639648/,如需轉載,請註明出處,否則將追究法律責任。

 

官方文檔https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/subscribe-to-publications?view=sql-server-2017

 

1、如果操作發佈訂閱的客戶端SSMS版本比服務器端版本低,會報錯,比如service是sqlserver2016,ssms使用sqlserver2014會報錯 

2、只建立分發時,會新增7個相關job;初次建立發佈的同時建立分發,會新增9個相關job

3、後面每新增一個發佈名,發佈服務器上會新增兩個發佈的job如下,前一個是不停的生成發佈數據,該job不停運行,後一個是初始化發佈數據(生成unc目錄下的文件和文件),運行一次就可以了

TESTDB1-replicate2-2

TESTDB1-replicate2-pub_replicate2-2

發佈實例名--數據庫名--發佈名的序號

發佈實例名--數據庫名--發佈名--發佈名的序號

4、發佈服務器-複製-本地發佈-發佈名-右鍵-屬性-snapshot,選擇put files in the following folder,可以把文件放到共享路徑

5、訂閱,可以在訂閱服務器建立,也可以在發佈服務器建立,發佈服務器-複製-本地發佈-發佈名,右鍵選擇new subscriptions

6、後面每新增一個訂閱,如果是推送訂閱,主庫增加一個job,如果是請求訂閱,從庫增加一個job

TESTDB1-replicate2-replicate2-TESTDB2-6(推送訂閱,發佈實例名-發佈數據庫名-發佈名-訂閱實例名-編號)

TESTDB1-replicate1-pub_replicate1-TESTDB2-replicate_01-CD7A365E-2DE7-47A3-B31E-70F785FA71F2(請求訂閱)

7、發佈job或訂閱job,都可以根據需要修改scheduler

8、本地發佈或本地訂閱下面的訂閱圖標有小圈圈,表示在當前實例下,是對方主動而不是當前實例主動,訂閱的job在對方那邊

推送訂閱,在主庫發佈下面的訂閱圖標沒有藍色小圈圈,在從庫訂閱下面的訂閱圖標有藍色小圈圈

請求訂閱,在主庫發佈下面的訂閱圖標有藍色小圈圈,在從庫訂閱下面的訂閱圖標沒有藍色小圈圈

--也適用於本地發佈又是本地訂閱的情況,比如本地一個庫信息傳輸到本地另一個庫,則本地發佈或本地訂閱下面都有訂閱,如果是推送訂閱,則發佈下面的訂閱圖標沒有藍色小圈圈,訂閱下面的訂閱圖標有藍色小圈圈,如果是請求訂閱,則發佈下面的訂閱圖標有藍色小圈圈,訂閱下面的訂閱圖標沒有藍色小圈圈

9、訂閱的刪除,根據推送訂閱和請求訂閱的不同,有不同操作方式,統一的操作方法就是直接刪除主庫發佈下面的訂閱。

推送訂閱的情況下,如果只在從庫刪除訂閱,則主庫的發佈下面的訂閱信息還在,主庫上的訂閱job也還在(但是信息不會同步到訂閱庫了),還需要在主庫再刪除一遍

推送訂閱的情況下,在主庫刪除訂閱的話,主庫上的訂閱job也不在了,從庫的訂閱信息也自動刪除了

請求訂閱的情況下,在主庫刪除訂閱的話,從庫上的訂閱job也不在了,從庫的訂閱信息也自動刪除了

請求訂閱的情況下,在從庫刪除訂閱的話,從庫上的訂閱job不在了,主庫上的發佈下面的訂閱信息也不在了

--也適用於本地發佈又是本地訂閱的情況,比如本地一個庫信息傳輸到本地另一個庫,則本地發佈或本地訂閱下面都有訂閱

10、發佈的job在msdb.dbo.sysjobs正常記錄,但是這些job運行時在sysprocesses.program_name都是顯示Microsoft SQL Server,不顯示爲具體的job名稱,如下語句查詢job,不適用於訂閱複製

select * from msdb.dbo.sysjobs where name='jobname'

select a.program_name,a.* from master..sysprocesses a where a.program_name like '%0D1CE57E8AC5%'

11、訂閱的job在msdb.dbo.sysjobs正常記錄,但是這些job運行時在sysprocesses.program_name都是顯示爲空

12、刪除訂閱數據庫時,出現如下,解決方法是把訂閱的job停掉再把訂閱數據庫offline,再刪除

Cannot drop the database ‘XXX’because it is being used for replication

13、刪除發佈,如果發佈下面有訂閱,則刪除發佈的時候,訂閱就失效了

請求訂閱的情況下,從庫的本地訂閱下面還有訂閱和job,但是失效了,還需要手工刪除一下訂閱,此時會自動刪除job

推送訂閱的情況下,主庫的發佈和job都刪除了,從庫的本地訂閱下面還有訂閱,但是失效了,還需要手工刪除一下

--也適用於本地發佈又是本地訂閱的情況,比如本地一個庫信息傳輸到本地另一個庫,則本地發佈或本地訂閱下面都有訂閱

14、訂閱庫,可以執行DML,執行delete不會有什麼後遺症,執行update或insert的話,如果後面收到發佈庫傳過來的數據,可能會產生衝突

15、發佈訂閱相關的存儲過程

EXEC distribution.dbo.sp_replmonitorhelppublisher --發佈庫上執行,檢查發佈服務器上的本地發佈的情況

16、發佈建立好後,發佈服務器上有一個linked sever指向分發服務器,名稱一般爲repl_distributor,disable publishing and distribution後,該linked server會自動刪除

訂閱建立後(不管是請求訂閱還是推送訂閱),會在發佈服務器上自動建立一個linked server指向訂閱服務器。刪除發佈或disable publishing and distribution,該linked server都不會自動刪除

17、如果訂閱的job的schedules沒有明確指定,只是start automaticaly when SQL Server Agent starts,那麼一旦把這個job停止,後面不會再同步了,在Replication Monitor裏面的Subscription Watch List看到這個訂閱的status就是not running

18、推送訂閱:到發佈服務器下面的本地發佈-發佈名稱-訂閱名,右鍵選擇view Synchronization Status可以看到訂閱狀態

請求訂閱:到訂閱服務器下面的本地訂閱-訂閱名,右鍵訂閱,選擇view Synchronization Status可以看到訂閱狀態,並可以看到訂閱job的運行情況

19、複製-本地訂閱-訂閱名,右鍵選擇view Synchronization Status查看到狀態是No replicated transactions are available,則到發佈端,複製-本地發佈-發佈名,右鍵發佈,選擇如下兩者,查看job狀態是否start運行中,如果是,再count(*)主從表數據是否一致,如果一致,說明此時確實沒有DML事務產生新的數據

View Snapshot Agent Status查看快照代理狀態,對應的job其實是"實例名-發佈數據庫名-發佈名稱-發佈序號",一般只運行一次,生成存放在unc中的初始化數據

View Log Reader Agent Status查看日誌讀取器代理狀態,對應的job其實是"實例名-發佈數據庫名-發佈序號",一般一直運行

20、所謂的分發服務,就是創建一個分發數據庫默認是distribution,並創建snapshot目錄,如果沒有創建分發,初次建立發佈的時候,會自動建立分發服務,第二次建立發佈的時候,會使用原來的分發服務。創建發佈時,必須要先有分發,要不發佈的數據存放在哪呢?分發就是存放這些要發佈的數據的地方

21、分發服務器是發佈服務器與訂閱服務器之間的橋樑,起着存儲區的作用,負責複製與一個或多個發佈服務器相關聯的特定數據。每個發佈服務器都與分發服務器上的單個數據庫(稱作分發數據庫)相關聯。分發數據庫從發佈服務器獲得要發佈的數據後將存儲複製狀態數據和有關發佈的元數據,並且在某些情況下爲從發佈服務器向訂閱服務器移動的數據起着排隊的作用。在大多數情況下,一個數據庫服務器實例充當發佈服務器和分發服務器兩個角色。當發佈服務器和分發服務器在同一個數據庫實例中時,稱爲“本地分發服務器”。當發佈服務器和分發服務器按各自的數據庫服務器實例配置時,把分發服務器稱爲“遠程分發服務器”

22、沒有建立過分發時,右鍵replication時,有configure distribution,選擇configure distribution表示只配置分發,不做其他動作,在此過程中如果在Publishers頁面勾選了publisher和distribution database,則右鍵replication時,沒有了configure distribution,取而代之的是publisher properties、distributor properties、disable publishing and distribution;如果在Publishers頁面沒有勾選publisher和distribution database,則右鍵replication時,沒有了configure distribution,取而代之的是Distributor Properties、Disabled Publishing and Distribution Wizard。其實右鍵replication選擇configure distribution時勾選了publisher和distribution database,就是選擇哪些發佈服務器可以使用這個分發服務器(enable servers to use this distributor when they become publishers),其中distribution database沒得選,就是分發的數據庫,默認是distribution

23、右鍵Replicattion選擇Disabled Publishing and Distribution Wizard,禁用訂閱發佈,所有的訂閱發佈信息都丟失了包括system databases裏的distribution數據庫也包括unc目錄下的所有目錄和文件,所以執行之前需要對訂閱發佈信息進行備份或截圖

24、要初始化訂閱,即重新把發佈端的數據推送到訂閱端,可以選擇推送到這個發佈的單個訂閱(發佈端--發佈名稱--訂閱名稱--右鍵--reinitialize),也可以選擇推送到這個發佈的所有訂閱(發佈端--發佈名稱--右鍵--reinitialize all subscriptions)。再在發佈服務器-複製-本地發佈-發佈名,右鍵選擇View Snapshot Agent Status選擇start,或運行job"實例名-發佈數據庫名-發佈名稱-發佈序號"

25、在訂閱端的表裏手工先insert一條語句,後面發佈端同步一條一樣數據過來的時候,訂閱端會報錯

Violation of PRIMARY KEY constraint 'PK_XX'. Cannot insert duplicate key in object 'dbo.TXX'. The duplicate key value is (33583).

26、bug問題:右鍵Replicattion選擇Disabled Publishing and Distribution Wizard後,最後一步會報錯,但是確實把發佈和分發都刪除了

27、導出訂閱複製的腳本的方法:右鍵Replication選擇Generate Scripts(導出腳本里面有註釋,在發佈端執行還是訂閱端執行) 
以上會導出當前服務器下的分發、發佈、訂閱,如果在Generate Scripts跳出的界面勾選了distributor properties則會導出分發;勾選了publications in the following data sources則會導出發佈;如果勾選了subscriptions in the following data sources則會導出訂閱。

28、監控發佈訂閱是否有異常,在發佈端執行以下5條語句即可

select * from [distribution].[dbo].[MSlogreader_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) 
select * from [distribution].[dbo].[MSdistribution_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) 
select * from [distribution].[dbo].[MSsnapshot_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) 
select * from [distribution].[dbo].MSrepl_errors order by 2 desc

select * from msdb.dbo.sysreplicationalerts order by 7 desc

29、 查詢某個發佈XX,發佈的數據庫對象的2種方法

29.1、發佈數據庫上執行(數據來源這三張表,distribution.dbo.MSpublications視圖查詢發佈名、

distribution.dbo.MSarticles視圖查詢發佈的對象比如表、sysarticlecolumns視圖查詢發佈的表發佈了哪些字段)  

select a.article,a.source_object,a.destination_object,b.colid from 

(select article,article_id,source_object,destination_object 

from [distribution].[dbo].MSarticles where publication_id in 

( select publication_id from 

[distribution].[dbo].MSpublications where publication='XX' 

) a 

inner join 

(select * from replicate1.dbo.sysarticlecolumns) b 

on a.article_id=b.artid order by a.article 

29.2、訂閱數據庫上執行  

select distinct article  from MSreplication_objects where publication='XX'

30、某個發佈XX丟失了,但是請求訂閱還在的處理方法

訂閱端執行如下,找到發佈的數據庫對象,再在發佈端創建發佈,再重建訂閱,方法2可行

select distinct article  from MSreplication_objects where publication='XX'

如下方法不行

把發佈數據庫恢復到丟失以前看能不能找回發佈信息,發現發佈數據庫執行如下報錯

select * from sysarticlecolumns

Invalid object name 'sysarticlecolumns'.

31、發佈訂閱需要新增一張表時,只需要右鍵發佈名稱選擇articles項目在裏面勾選需要新增的表即可,再右鍵發佈名稱--view snapshot agent status--start即可,在發佈端的日誌讀取job(右鍵發佈名稱--view log reader agent status)正常運行的情況下,訂閱job(右鍵訂閱名稱--view sysnchronization status)也正常運行的情況,訂閱數據庫上可以馬上看到新增的表

32、SSMS圖形界面,新建發佈到第四步articles項目時或已經存在的發佈右鍵選擇articles項目時,界面很慢一直無法正常顯示數據庫對象比如表視圖存儲過程等,說明有堵塞,SSMS點開一些界面其實就是一個select的動作,找到堵塞源殺掉後,就可以正常顯示了

33、實例--replication--Local Subscriptions--訂閱名稱--右鍵--View Synchronization Status報錯:An error occurred connecting to server 'XX'.SQL Server repliaction requires the actual server name to nake a connection to the server. 
原因:可能修改了計算機名,SSMS連接的是新的計算機名,但是數據庫沒有修改Servername,導致這個報錯,SSMS連接使用老的計算機名或修改數據庫修改Servername爲新的計算機名即可

34、A服務器ADB1庫的數據做了replication到B服務器的ADB1數據庫,A服務器和A1服務器搭建了AG,並把ADB1加入了AG,但是A1上的AG對應的數據庫ADB1不正常,右鍵A服務器ADB1對應的發佈名稱--View Log Reader Agent Status發現ADB1的發佈報錯:Replicated transaction are waiting for next log backup or for mirror partner to catch up(複製的事務正等待下一次日誌備份或等待鏡像夥伴更新) 
解決方法 
    方法1、確保A1的AG中ADB1正常(首選方法) 
    方法2、在A服務器上把該數據庫ADB1從AG中移除 
    方法3、在A服務器上執行 
DBCC TRACEON (1448, -1)     --不希望replication受到alwayson 其他node的影響 
原因: 
    我們知道always on的輔助副本secondary是獲取了primary的日誌信息而進行的redo動作實現了數據庫的同步工作。當secondary異常宕機後,爲了保證secondary起來時能夠繼續上次讀取日誌的地方做redo動作,db的transaction log就不會進行備份,而一直增大,最壞的情況導致磁盤爆滿,無法使用。如當前01爲primary,02爲secondary,爲了避免failover後,02切換爲主副本,而此節點卻沒有獲取到和01一樣新的replication信息,導致異常。所以所有的always on node都要知道同步的情況,否則不繼續進行同步。即所有node都獲取replication信息後,才允許replication繼續進行

 

 

建立分發

複製-右鍵-配置分發

1、選擇分發服務器

2、選擇snapshot目錄

3、創建分發數據庫(數據庫名稱默認爲distribution、數據庫文件目錄、數據庫日誌名稱)

4、選擇哪些發佈服務器可以使用這個分發服務器,enable servers to use this distributor when they become publishers,其中distribution database沒得選,就是分發的數據庫,默認是distribution

--如果上面第四步勾選了publisher和distribution database,右鍵Replicattion有Publisher Properties、Distributor Properties、Disabled Publishing and Distribution Wizard。如果不勾選,右鍵Replicattion則沒有Publisher Properties,有Distributor Properties、Disabled Publishing and Distribution Wizard

分發建立好後,有如下job

1、Agent history clean up: distribution

2、Distribution clean up: distribution

3、Expired subscription clean up

4、Monitor and sync replication agent jobs

5、Reinitialize subscriptions having data validation failures

6、Replication agents checkup

7、Replication monitoring refresher for distribution.

 

 

建立發佈

複製-本地發佈-右鍵-新建發佈

 

建立發佈1:還沒有分發時,建立發佈的同時建立分發(雖然沒有了上面"建立分發"的第3、4步,但是也默認創建了數據庫distribution)

右鍵local publications(本地發佈)--選擇new publication(新的發佈)

1、選擇分發服務器

2、選擇snapshot目錄

3、選擇要發佈的數據庫

4、選擇發佈類型

5、選擇要發佈的對象,比如表、視圖、存儲過程

6、選擇snapshot代理,snapshot是立即創建還是定期創建,snapshot代理的安全性是使用用戶名密碼還是使用sqlserver agent服務,snapshot代理怎麼連接發佈服務器,是OS域帳戶還是DB帳戶

7、創建發佈名稱

發佈建立好後,有如下job

1、Agent history clean up: distribution

2、Distribution clean up: distribution

3、Expired subscription clean up

4、Monitor and sync replication agent jobs

5、Reinitialize subscriptions having data validation failures

6、Replication agents checkup

7、Replication monitoring refresher for distribution.

8、WONCNTESTDB1-replicate1-1

9、WONCNTESTDB1-replicate1-pub_replicate1-1

 

建立發佈2:已經建立了分發時,只建立發佈

1、選擇要發佈的數據庫

2、選擇發佈類型

3、選擇要發佈的對象,比如表、視圖、存儲過程

4、選擇snapshot代理,snapshot是立即創建還是定期創建,snapshot代理的安全性是使用用戶名密碼還是使用sqlserver agent服務,snapshot代理怎麼連接發佈服務器,是OS域帳戶還是DB帳戶

5、創建發佈名稱

發佈建立好後,有如下job

1、WONCNTESTDB1-replicate1-1

2、WONCNTESTDB1-replicate1-pub_replicate1-1

 

 

建立訂閱

1、選擇發佈服務器,選擇發佈

2、選擇推送訂閱還是請求訂閱

3、選擇訂閱服務器,選擇訂閱數據庫

4、選擇訂閱代理服務器,分發代理使用怎麼連接,是OS域帳戶還是DB帳戶,分發服務器使用怎麼連接,是OS域帳戶還是DB帳戶,訂閱服務器使用怎麼連接,是OS域帳戶還是DB帳戶

5、訂閱同步是持續性還是按需求

6、是否馬上初始化訂閱對象

訂閱建立好後,有如下job,此job名稱的前半段和訂閱名稱一樣即WONCNTESTDB1-replicate1-pub_replicate1

WONCNTESTDB1-replicate1-pub_replicate1-WONCNTESTDB2-replicate_01-CD7A365E-2DE7-47A3-B31E-70F785FA71F2

 

 


無法重命名該數據庫,因爲它已發佈或者它是複製使用的分發數據庫。  解決辦法    執行 sp_removedbreplication '數據庫名'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章