1. 錯誤:已將此(這些)訂閱標記為不活動,必須將其重新初始化。需要刪除NoSync 訂閱,然後重新建立它們
use distribution
go
--尋找狀態不正常的發布
select status,*from dbo.MSsubscriptions where status<>2
--修改狀態
update dbo.MSsubscriptions set status=2where status<>2
觀察複製鏈是否能正常運行,正常後用tablediff比較發布鏈中的表資料是否一致
還可以重新初始化快照,但是資料量大就是個悲劇。
2. 錯誤:表、預存程序不存在以及表結構不一致等
處理方法:
a. 表或預存程序不存在:
在訂閱端對應的庫中補齊缺失的對象;
有一種比較奇怪的現象是訂閱端表明明存在,但是同步鏈依然報錯,此時可能有兩種情況:
第一: 表欄位不一致,可以參照下面(b)的方式補齊表欄位;
第二: 表欄位也一致,但是依舊報錯,可以採取三種方式解決:
a. 暫停同步鏈,然後再次開啟,看是否能通過,如果不行,進行下面的步驟;
b. 勾選掉同步鏈中報錯的這個表,然後觀察同步鏈,此時去掉了這個表的發布,錯誤一般都能過去,
等到所有資料同步後,再將這個表勾選上,一般都能過;同步鏈正常後,在用TableDiff工具比較下
這個表的資料;
c. 如果b步驟依然報錯,那就只能重建了。
b. 列名'xxx' 無效
可以通過以下語句尋找缺失的欄位對應的表
--尋找某個發布鏈中的某個欄位(Rp_XXXX 發布名xxx 欄位名)
select a.name as table_name,b.name as column_name,(select'alter table '+a.name+' add '+b.name+''+
(casewhen name='nvarchar'thencast(b.max_length/2ASvarchar)
when name like'date%'or name='money'then''
else name end )
from sys.types where system_type_id=b.system_type_id ) as definition FROM dbo.sysarticles a WITH(NOLOCK) innerjoin sys.columns b WITH(NOLOCK)
on a.objid=b.object_idinnerjoin dbo.syspublications c with(nolock) on a.pubid=c.pubid
where c.name='Rp_XXXX'and b.name='xxx'
3. 錯誤:.主鍵衝突
處理方法:跳過錯誤
錯誤完成後,需要比較兩邊資料是否一致(比下資料量就行了)
---------------跳過訂閱機器上面的錯誤------------------------
-----------------------在分發機器上--------------------------
--文法
sp_helpsubscriptionerrors [ @publisher = ]'publisher'
, [ @publisher_db = ]'publisher_db'
, [ @publication = ]'publication'
, [ @subscriber = ]'subscriber'
, [ @subscriber_db = ]'subscriber_db'
--get publisher subscriber
select*from MSsubscriber_info
--get publisher_db publication subscriber_db=publisher_db
select*from MSpublications
--example
sp_helpsubscriptionerrors 'SQLw2k8','dbtranpub','dbtranpub_pub','SQLw2k8Subscriber','dbtransub'
--擷取xact_seqno 值
----------------------在訂閱機器上---------------------------
sp_setsubscriptionxactseqno [ @publisher= ]'publisher',
[ @publisher_db= ]'publisher_db',
[ @publication= ]'publication',
[ @xact_seqno= ] xact_seqno
--example
sp_helpsubscriptionerrors 'SQLw2k8','dbtranpub','dbtranpub_pub',xact_seqno
-------------------------------------------------------------------------------------
4. 錯誤:應用複製的命令時在訂閱伺服器上找不到該行
a. 可以採用“主鍵衝突”錯誤的處理方式,跳過錯誤,然後再用tablediff比較兩個表的資料差;
b. 在訂閱端補充缺失的資料
--使用如下語句找出錯誤號碼
selecttop100 e.xact_seqno ,e.command_id,e.*
from dbo.MSdistribution_history h
join dbo.MSrepl_errors e on h.error_id=e.id
where comments notlike'%transaction%'--失敗的代理
orderby id desc
--用上面查到的具體事務序號,查看複製組件執行的具體命令
--在散發資料庫上執行:sp_browsereplcmds,注意必須限定開始和結束xact_seqno
sp_browsereplcmds '0x0000003B00000020000500000000','0x0000003B00000020000500000000'
--結果如下
article_id command
1 {CALL [dbo].[sp_MSdel_dboUPCCodeTransaction] ('000000002 ')}
--找到對應的對象
select publisher_db,article From dbo.MSarticles where article_id=1and publication_id=(
select publication_id from MSpublications with(nolock) where publication='Rp_xxx')
--由sp_MSdel 可以知道,這條命令是一個刪除語句,因為發布端的資料已經不存在,所以只能跳過;
--如果是修改,需要驗證上述資料在故障訂閱伺服器上是否存在,如果不存在,則補上。
5. 錯誤:使用者'xxx' 登入失敗或者The process could not connect to Subscriber 'xxxx'.
處理方法: 檢查帳號是否正確,能夠登入到發布和訂閱伺服器,而且有相應的許可權。
6. 發布'xxx' 的初始快照集尚不可用
保證SQLSERVERAGENT已經運行,複製=》發布內容=》發布項目=》右擊右側的訂閱=》重新初始化
如果還不行,複製監視器--發行伺服器--xxx--發布的項目--快照,看到進程未能建立檔案“\\XXZ\SQLPUB\unc”,
到該檔案夾重新設定sql的帳號對該檔案夾許可權為"完全"。
7. 進程未能從表“[dbo].[syncobj_0x3745373834413345]”向外大量複製
在寫BCP 資料檔案時發生I/O 錯誤(源: ODBC SQL Server Driver (ODBC); 錯誤碼: 0)
解決方案:就是字元類型全部改為n類型的解決問題(char-nchar,varchar-nvarchar,ntext).
8. 錯誤訊息:
"代理'xxxx' 在出錯後正在重試。已重試了25 次。有關詳細資料,請參閱Jobs 檔案夾中的代理作業記錄。”
發生這個錯誤一般都是在一台機器上面有比較多的發布鏈,錯誤原因在於資料庫對Replication使用記憶體的限制,
我們需要更改這個限制來解決這個問題(最好是不要再一台機器上建立太多的發布鏈),方法如下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\
點開Windows項,找到下面這些內容
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768
將最後的數字(不一定是這個數字,可能是等)改成1024 儲存,重啟即可。
Windows2008 server 如果不是amdin使用者可能會不讓開啟註冊表,如果是管理組許可權的話,可以到
C:\windows\system32 下面找到regedit32.exe 檔,右鍵,然後將自己的帳號添加到運行許可權裡面。
9.--Cannot drop the database XXX because it is being used for replication
exec sp_removedbreplication 'database'