SQLServer Replication 常見錯誤

來源:互聯網
上載者:User

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'

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.