1. 錯誤:已將此(這些)訂閱標記為不活動,必須將其重新初始化。需要刪除NoSync 訂閱,然后重新創(chuàng)建它們
use distribution
go
--查找狀態(tài)不正常的發(fā)布
select status,* from dbo.MSsubscriptions where status<>2
--修改狀態(tài)
update dbo.MSsubscriptions set status=2 where status<>2
觀察復(fù)制鏈是否能正常運行,正常后用tablediff比較發(fā)布鏈中的表數(shù)據(jù)是否一致
還可以重新初始化快照,但是數(shù)據(jù)量大就是個悲劇。
2. 錯誤:表、存儲過程不存在以及表結(jié)構(gòu)不一致等
處理方法:
a. 表或存儲過程不存在:
在訂閱端對應(yīng)的庫中補齊缺失的對象;
有一種比較奇怪的現(xiàn)象是訂閱端表明明存在,但是同步鏈依然報錯,此時可能有兩種情況:
第一: 表字段不一致,可以參照下面(b)的方式補齊表字段;
第二: 表字段也一致,但是依舊報錯,這時只能選碰碰運氣,先停掉同步鏈,再開啟,如果過了,
算運氣好;如果錯誤依舊,就需要在該同步鏈中先將該表去掉,讓其他數(shù)據(jù)能同步;然后再
將這個表新加到同步鏈中,并比較發(fā)布端和訂閱端的表數(shù)據(jù)。
b. 列名'xxx' 無效
可以通過以下語句查找缺失的字段對應(yīng)的表
--查找某個發(fā)布鏈中的某個字段(Rp_XXXX 發(fā)布名xxx 字段名)
select a.name as table_name,b.name as column_name,(select 'alter table '+a.name+' add '+b.name+' '+
(case when name='nvarchar' then cast(b.max_length/2 AS varchar)
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) inner join sys.columns b WITH(NOLOCK)
on a.objid=b.object_id inner join dbo.syspublications c with(nolock) on a.pubid=c.pubid
where c.name='Rp_XXXX' and b.name='xxx'
3. 錯誤:.主鍵沖突
處理方法:跳過錯誤
錯誤完成后,需要比較兩邊數(shù)據(jù)是否一致(比下數(shù)據(jù)量就行了)
4. 錯誤:應(yīng)用復(fù)制的命令時在訂閱服務(wù)器上找不到該行
a. 可以采用“主鍵沖突”錯誤的處理方式,跳過錯誤,然后再用tablediff比較兩個表的數(shù)據(jù)差;
b. 在訂閱端補充缺失的數(shù)據(jù)
--使用如下語句找出錯誤號
select top 100 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 not like '%transaction%' --失敗的代理
order by id desc
--用上面查到的具體事務(wù)序列號,查看復(fù)制組件執(zhí)行的具體命令
--在分發(fā)數(shù)據(jù)庫上執(zhí)行:sp_browsereplcmds,注意必須限定開始和結(jié)束xact_seqno
sp_browsereplcmds '0x0000003B00000020000500000000','0x0000003B00000020000500000000'
--結(jié)果如下
article_id command
1 {CALL [dbo].[sp_MSdel_dboUPCCodeTransaction] ('000000002 ')}
--找到對應(yīng)的對象
select publisher_db,article From dbo.MSarticles where article_id=1 and publication_id=(
select publication_id from MSpublications with(nolock) where publication='Rp_xxx')
--由sp_MSdel 可以知道,這條命令是一個刪除語句,因為發(fā)布端的數(shù)據(jù)已經(jīng)不存在,所以只能跳過;
--如果是修改,需要驗證上述數(shù)據(jù)在故障訂閱服務(wù)器上是否存在,如果不存在,則補上。
5. 錯誤:用戶'xxx' 登錄失敗或者The process could not connect to Subscriber 'xxxx'.
處理方法: 檢查賬號是否正確,能夠登錄到發(fā)布和訂閱服務(wù)器,而且有相應(yīng)的權(quán)限。
6. 發(fā)布'xxx' 的初始快照尚不可用
保證SQLSERVERAGENT已經(jīng)運行,復(fù)制=》發(fā)布內(nèi)容=》發(fā)布項目=》右擊右側(cè)的訂閱=》重新初始化
如果還不行,復(fù)制監(jiān)視器--發(fā)布服務(wù)器--xxx--發(fā)布的項目--快照,看到進程未能創(chuàng)建文件“XXZSQLPUBunc”,
到該文件夾重新配置sql的帳號對該文件夾權(quán)限為"完全"。
7. 進程未能從表“[dbo].[syncobj_0x3745373834413345]”向外大容量復(fù)制
在寫B(tài)CP 數(shù)據(jù)文件時發(fā)生I/O 錯誤(源: ODBC SQL Server Driver (ODBC); 錯誤代碼: 0)
解決方法:就是字符類型全部改為n類型的解決問題(char-nchar,varchar-nvarchar,ntext).
8. 錯誤消息:
"代理'xxxx' 在出錯后正在重試。已重試了25 次。有關(guān)詳細信息,請參閱Jobs 文件夾中的代理作業(yè)歷史記錄。”
發(fā)生這個錯誤一般都是在一臺機器上面有比較多的發(fā)布鏈,錯誤原因在于數(shù)據(jù)庫對Replication使用內(nèi)存的限制,
我們需要更改這個現(xiàn)在來解決這個問題(最好是不要再一臺機器上創(chuàng)建太多的發(fā)布鏈),方法如下:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerSubSystems
點開Windows項,找到下面這些內(nèi)容
%SystemRoot%system32csrss.exe ObjectDirectory=Windows SharedSection=1024,20480,768
將最后的數(shù)字(不一定是這個數(shù)字,可能是等)改成1024 保存,重啟即可。
Windows2008 server 如果不是amdin用戶可能會不讓打開注冊表,如果是管理組權(quán)限的話,可以到
C:windowssystem32 下面找到regedit32.exe 文件,右鍵,然后將自己的賬號添加到運行權(quán)限里面。
9.--Cannot drop the database XXX because it is being used for replication
exec sp_removedbreplication 'database'