乙個事務複製的bug 更新丟失 續

2022-02-02 23:03:00 字數 2017 閱讀 1186

閱讀本文之前請參考

最近又做了乙個case,環境是sql server 2008 r2. 客戶新增了乙個'replication support only'的訂閱,之後發現現存訂閱出現了更新丟失。 丟失的資料恰巧是新增訂閱前的幾秒鐘內生成的。

我開始以為是log reader沒有開啟造成的,檢查了distribution database的mslogreader_history

,發現期間log reader並沒有停止過。

如果log reader停止,那麼新增訂閱前的更新肯定是丟失了。因為產生的資料的lsn小於"新增訂閱"的lsn, 並且distribution agent把"新增訂閱"的lsn先傳遞到了訂閱。可是log reader一直處於執行狀態,那麼還有什麼可能呢? 如果log reader的效率很低,沒有即時地將資料更新傳遞到distribution agent,那麼也會產生這個問題吧?我想理論上是這樣的,如果效率非常低,可以等同於log reader沒有執行! 那麼如何證明這一點呢?reproduce的過程可能會很複雜,而且客戶的磁碟效能也很好…

我想到了另外一種可能,這個問題實際上和log reader的工作方式有關係:

當log reader啟動後,會去讀取publication database的日誌,如果一次讀取完後,如果publication database的日誌中仍然有需要處理的資料,log reader會繼續讀;如果讀取後沒有資料需要處理,log reader會休息一段時間, 時間長度為pollinginterval的值(預設為5秒中)。 那麼我們假設這樣的情景。

pollinginterval為五秒。log reader啟動後發現沒有資料需要讀取,開始休息。

在第1秒的時候,其中的article a產生了資料更新

在第2秒的時候,其中的article b產生了資料更新

在第3秒的時候,新增了乙個非snapshot方式初始化的訂閱。

在第4秒的時候,其中的article c產生了資料更新

在第5秒的時候,其中的article d產生了資料更新

同時log reader開始繼續掃瞄日誌, 我們就會發現第一秒和第二秒的資料更新丟失了。

更多資訊

1 向任意乙個包含'replication support only' 訂閱的發布新增article時都可能會導致這個發布庫的所有發布的所有現存訂閱出現更新丟失的問題。

向不包含'replication support only'訂閱的發布新增不會有這個問題。

2 如果在新增乙個'replication support only'的訂閱時 ,該發布對應的發布資料庫的所有已存在訂閱也會出現更新丟失的情況,無論這些都訂閱通過何種方式初始化,或屬於那個發布。

解決方法之前文章介紹的相同

解決辦法

===

公升級至sql servr 2012

如果您暫時沒有辦法公升級,可以採用以下兩種方法:

新增乙個新的發布,將新的article或訂閱新增到發布中。

在新增article

前將log reader

和distribution agent

停止。新增完成後,啟動

log reader

,確認log reader

已經將之前的資料傳送到了

distribution

資料庫後(可以使用

tracer token

來確認log reader

是否已經完成同步), 啟動

distribution agent

。這樣就可以避免資料丟失了。

更多資訊

1 向任意乙個包含』replication support only』 訂閱的發布新增article時,  都可能導致這個發布庫的所有發布的所有現存訂閱出現更新丟失的問題。 向不包含』replication support only』訂閱的發布新增article不會有這個問題。

2 如果在新增乙個』replication support only』的訂閱時 ,該發布對應的發布資料庫的所有發布的所有已存在訂閱都會受到影響,無論這些訂閱是通過何種方式初始化,或屬於哪個發布。

乙個事務複製的bug 更新丟失 續

閱讀本文之前請參考 最近又做了乙個case,環境是sql server 2008 r2.客戶新增了乙個 replication support only 的訂閱,之後發現現存訂閱出現了更新丟失。丟失的資料恰巧是新增訂閱前的幾秒鐘內生成的。我開始以為是log reader沒有開啟造成的,檢查了dist...

微軟的乙個BUG

各位,我不知道我的這個發現屬不屬於微軟的乙個bug round 1.225,2 1.23 round 1.245,2 1.25 round 1.265,2 1.26 round 1.285,2 1.28 按照技術文章上說的,vb中round 函式屬於四捨五入函式,但實際執行當中,其實round 函式...

乙個微妙的bug

都知道不同型別運算元進行運算時,發生的轉換,資料型別一般朝著浮點度更高,長度更長的方向轉換,但signed 向unsigned 轉換得多多注意了,有如下 includeint a define cd sizeof a sizeof int sizeof 還回值為unsigned int main 最...