檢視 Transactional Replication 執行某句命令所觸發的錯誤

當發佈端的資料表新增或刪除某筆記錄,而訂閱端資料表先前已經新增/刪除該筆記錄,就會引發如下的錯誤(此處抓取的畫面是訂閱端的記錄先刪掉了,因此執行複寫的刪除預存程序,傳回受影響記錄筆數 0,引發錯誤):

image

image

  • 解法一

可以根據該交易序號(Transaction sequence number xact_seqno)和命令識別碼(Command ID command_id)搭配 Distribution 系統資料庫內的 sp_browsereplcmds 系統預存程序,或是直接查詢 MSrepl_commands 系統資料表。

–這要用文字顯示,而非 grid,且參數是數值型,轉成文字會變成亂碼
select command_id,
CONVERT(nvarchar(max),case when datalength(command) > 6 then right(command,datalength(command)-6) else command end),command
from distribution.dbo.MSrepl_commands
where xact_seqno=0x00000046000000F9000800000000 and command_id=1

執行結果如下:
command_id                                                                                                                                               
———– ———————————————————————————————————————————————-
1           { C A L L   [ d b o ] . [ s p _ M S d e l _ d b o t ]   ( ? ) }
command
———————————————————————————————————————————————————-
0x4000000001007B00430041004C004C0020005B00640062006F005D002E005B00730070005F004D005300640065006C005F00640062006F0074005D002000280
03F0029007D00010001000000

–或直接呼叫預存程序
exec distribution.dbo.sp_browsereplcmds
@xact_seqno_start = ‘0x00000046000000F9000800000000’,
@xact_seqno_end = ‘0x00000046000000F9000800000000’

image

可以簡單地將訂閱端資料表內對應的記錄先加回或刪除,讓Distribution Agent可以正常執行完對應的預存程序以刪除或新增紀錄,即可讓Replication繼續執行

  • 解法二

若資料表內容複雜,不想要個別修改紀錄,而從 Publisher 初始化該資料表,但又不影響整個 Publication 所有的資料表,可以執行以下的預存程序(要初始化的個別資料表不大,整個Publication也不大的情況下)

–要在提供 Publication 的資料庫下執行,而非 Distribution
exec sp_reinitsubscription
    @publication = ‘test’,
    @article =’t’,
    @subscriber =’P714P4USER’,
    @destination_db =’d’,
    @for_schema_change =1,
    @invalidate_snapshot =1

–產生 Snapshot
–這會產生整個 publication 的,但Distributor會僅對上述標示要 Initialize 的資料表
–利用 snapshot 執行個別資料表的初始化,這可以從 UI 做
EXEC sp_startpublication_snapshot @publication=’test’

6 Comments

  1. casper
    Posted 2011 年 09 月 15 日 at 10:15:18 | Permalink | 回覆

    Dear Byronhu:

    有個 sql Transactional Replication 的問題,我在檢視同步訂閱狀態出現TCP 提供者: 指定的網路名稱無法使用,想請教您有甚麼原因會造成ㄋ?

    2011-09-15 10:09:25.324 Copyright (c) 2008 Microsoft Corporation
    2011-09-15 10:09:25.324 Microsoft SQL Server 複寫代理程式: distrib
    2011-09-15 10:09:25.324
    2011-09-15 10:09:25.324 輸出行開頭的時間戳記以 UTC 時間表示。
    使用者指定的代理程式參數值:
    -Subscriber T1S1DB02
    -SubscriberDB WebData
    -Publisher T030301547
    -Distributor T030301547
    -DistributorSecurityMode 1
    -Publication WebData
    -PublisherDB WebData
    -Continuous
    -XJOBID 0x5DC4D11F5D665E4AAD9A6B3E6F0EE825
    -XJOBNAME T030301547-WebData-WebData-T1S1DB02-4
    -XSTEPID 2
    -XSUBSYSTEM Distribution
    -XSERVER T030301547
    -XCMDLINE 0
    -XCancelEventHandle 000000000000085C
    -XParentProcessHandle 00000000000008BC
    2011-09-15 10:09:25.324 Startup Delay: 7549 (msecs)
    2011-09-15 10:09:32.875 正在連接到 散發者 ‘T030301547’
    從代理程式設定檔取得的參數值:
    -bcpbatchsize 2147473647
    -commitbatchsize 100
    -commitbatchthreshold 1000
    -historyverboselevel 1
    -keepalivemessageinterval 300
    -logintimeout 15
    -maxbcpthreads 1
    -maxdeliveredtransactions 0
    -pollinginterval 5000
    -querytimeout 1800
    -skiperrors
    -transactionsperhistory 100
    2011-09-15 10:09:32.890 正在連接到 訂閱者 ‘T1S1DB02’
    正在初始化
    略過檔案 ‘test_2.pre’,因為在前一個發行項就已經傳遞,或已由先前中斷的快照集傳遞。
    代理程式訊息碼 64。TCP 提供者: 指定的網路名稱無法使用。
    Category:COMMAND
    Source: 失敗的命令
    Number:
    Message: create procedure [dbo].[sp_MSupd_dbotest]
    @c1 int = NULL,
    @pkc1 int = NULL,
    @bitmap binary(1)
    as
    begin
    update [dbo].[test] set
    [sno] = case substring(@bitmap,1,1) & 1 when 1 then @c1 else [sno] end
    where [sno] = @pkc1
    if @@rowcount = 0
    if @@microsoftversion>0x07320000
    exec sp_MSreplraiserror 20598
    end

    Category:NULL
    Source: Microsoft SQL Server Native Client 10.0
    Number: 64
    Message: TCP 提供者: 指定的網路名稱無法使用。
    Category:NULL
    Source: Microsoft SQL Server Native Client 10.0
    Number: 64
    Message: 通訊連結失敗
    Category:NULL
    Source: Microsoft SQL Server Native Client 10.0
    Number: 08S01
    Message: 通訊連結失敗
    Category:NULL
    Source: Microsoft SQL Server Native Client 10.0
    Number: 08S01
    Message: 通訊連結失敗

    • Posted 2011 年 09 月 15 日 at 13:03:17 | Permalink | 回覆

      看起來是執行在散發者機器上的 Distribution Agent 找不到訂閱者的 IP…但我無從得知為何散發者無法解析訂閱者的 IP…

      • casper
        Posted 2011 年 09 月 16 日 at 02:34:28 | Permalink

        謝謝您的回覆,這發生原因與跨網段或防火牆設定會有關係ㄇ? 散發者 T030301547 與 訂閱者 T1S1DB02 為不同網段中間還有防火牆,目前只有開 1433 雙向~

  2. Posted 2011 年 09 月 16 日 at 03:11:38 | Permalink | 回覆

    看起來名稱解析不出來,或許試試設 hosts 檔案或是 SQL Server 組態管理員設別名

  3. casper
    Posted 2011 年 09 月 19 日 at 01:27:19 | Permalink | 回覆

    謝謝您的回覆,關於您的建議我皆有調整與設定,可是仍是 : TCP 提供者: 指定的網路名稱無法使用。

  4. Posted 2011 年 09 月 19 日 at 01:41:48 | Permalink | 回覆

    不知要如何猜…

One Trackback

  1. By 啟動交易式複寫,但不初始化 « 偶有所得 on 2015 年 09 月 09 日 at 07:22:08

    […] 由於未初始化,有部分資料不一致會導致複寫錯誤,可以參照以下的做法解決:檢視 Transactional Replication 執行某句命令所觸發的錯誤 […]

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: