使用SQLServer同義詞,解決資料庫複製中訂閱庫數據丟失幾條數據訂閱無法正常進行的問題

来源:http://www.cnblogs.com/bluedoctor/archive/2016/07/18/5680582.html
-Advertisement-
Play Games

使用同義詞和insert..from..語句,解決訂閱庫數據丟失的問題 ...


最近給客戶做了基於SQLServer的發佈訂閱的“讀寫分離”功能,但是某些表數據很大,經常發生某幾條數據丟失的問題,導致訂閱無法繼續進行。但是每次發現問題重新做一次發佈訂閱又非常消耗時間,所以還得根據“複製監視器”的提示,找到丟失的數據,手工處理。

定位缺失數據

首先,找到出問題的同步語句,在發佈伺服器的“複製監視器”上事務訂閱的詳細信息裡面,找到出錯的信息

嘗試的命令:
if @@trancount > 0 rollback tran
(事務序列號: 0x0000992600000D09007F00000000,命令 ID: 19)

錯誤消息:
應用複製的命令時在訂閱伺服器上找不到該行。 (源: MSSQLServer,錯誤號: 20598)
獲取幫助: http://help/20598
應用複製的命令時在訂閱伺服器上找不到該行。 (源: MSSQLServer,錯誤號: 20598)

 

然後在分發伺服器上執行下麵的SQL語句,

use distribution
go
sp_browsereplcmds '0x0000992600000D09007F00000000' ,'0x0000992600000D09007F00000000'
go

根據命令ID(如上面的ID:19),找到具體的同步命令(Command列),類似於這樣的:

{CALL [dbo].[sp_MSdel_dboT_FFTODO] ('697e7cacf5354a36be1ae4cf50dcdaa6')}

這裡是 訂閱庫上的 sp_MSdel_dboT_FFTODO 存儲過程,查看存儲過程定義知道參數是ID的值,這裡說找不到要刪除的數據,那麼我們在訂閱庫裡面模擬增加這個ID的記錄即可。添加數據,

補錄數據

網上提供的解決方案是用一個工具生成差異的SQL數據然後給訂閱庫執行,但看了下覺得不是很方便,想起來SqlServer還提供一個 insert...from....語句,那麼是否可以直接從發佈資料庫查詢數據然後插入給訂閱資料庫呢?

可以使用同義詞從發佈庫查詢過來插入到本地訂閱庫,請看下麵具體過程:
先在訂閱庫上建立一個同義詞,比如下麵為表 Biz_Customer 建立一個同義詞 Biz_Customer_Master,建立的時候,要求指定同義詞所在的伺服器名稱,資料庫名稱,架構,表名稱等信息。

但是此時同義詞還不能直接使用,還需要建立“鏈接伺服器”,具體過程如下:

EXEC sp_addlinkedserver
 @server='192.168.7.4',--被訪問的伺服器別名(習慣上直接使用目標伺服器IP,或取個別名如:JOY)
 @srvproduct='',
 @provider='SQLOLEDB',
 @datasrc='192.168.7.4' --要訪問的伺服器
 go
 
 EXEC sp_addlinkedsrvlogin
 '192.168.7.4', --被訪問的伺服器別名(如果上面sp_addlinkedserver中使用別名JOY,則這裡也是JOY)
 'false',
 NULL,
 'sa', --帳號
 '1234567890' --密碼
go

select * from sys.servers;

然後使用下麵的SQL語句插入數據:

insert into [Biz_Customer] 
select * from Biz_Customer_Master where id='7B210173-7382-43EB-BC5E-0000C3BA564A'

查詢報錯,某個列的數據類型錯誤,打開表一看,原來是 發佈庫上的表的欄位順序跟訂閱庫上不一樣,因為當初做訂閱的時候,為瞭解決Timestamp 問題,將訂閱庫的Timestamp欄位修改成了binary(8)類型,故訂閱庫上表的欄位順序改變了。

此時,只需要在insert 和 select 語句上,指定相同順序的列就可以了。那麼如何獲取表所有的列名稱?
很簡單,直接選擇某個表,新建查詢,生成的SQL語句就包含表所有的欄位了。
最後正確的語句如下:

insert into [Biz_Customer]([Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
      )
SELECT  [Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
  FROM dbo.Biz_Customer_Master 
  where id='7B210173-7382-43EB-BC5E-0000C3BA564A';

經過這樣的方式,很方便的把發佈庫的數據就補充到訂閱庫上了,之後,資料庫的發佈訂閱錯誤就解決了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原因: 之前已經寫過一篇關於列存儲索引的簡介http://www.cnblogs.com/wenBlog/p/4970493.html,很粗糙但是基本闡明瞭列存儲索引的好處。為了更好的理解列存儲索引,接下來我們一起通過列存儲索引與傳統的行存儲索引地對比2014中的列存儲索引帶來了哪些改善。由於已經很 ...
  • 在一次生成AWR報告中,發現在“Instances in this Workload Repository schema”部分,出現了多個實例記錄信息(host敏感信息被用host1,host2,host3替換)。具體信息如下截圖所示: SQL> @?/rdbms/admin/awrrpt Curr... ...
  • 一、準備工作 主機個數:n台 操作系統:CentOS 6.5 安裝所需軟體包: CM: cloudera-manager-el6-cm5.4.3_x86_64.tar.gz CDH parcel: CDH-5.4.0-1.cdh5.4.0.p0.27-el6.parcel CDH-5.4.0-1.c ...
  • 本文是redis學習系列的第四篇,前面我們學習了redis的數據結構和一些高級特性,點擊下麵鏈接可回看 《詳細講解redis數據結構(記憶體模型)以及常用命令》 《redis高級應用(主從、事務與鎖、持久化)》 本文我們繼續學習redis的高級特性——集群。本文主要內容包括集群搭建、集群分區原理和集群 ...
  • 一下的示例所用用戶名和密碼為:test,111111 Mysql密碼修改: Mysql修改密碼需要root的許可權,先執行mysql -uroot -p(密碼); 1)使用set password方式來修改賬戶密碼: set password for ‘hzd’@’localhost’=passwor ...
  • 1、準備 cmake-3.6.0.tar.gz bison-3.0.4.tar.gz mysql-5.7.13.tar.gz (http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13.tar.gz) 2、安裝cmake 和 bison 首先 ...
  • MYSQL資料庫基礎: 資料庫幫我們解決以下數據存取難題: 較大數據量 事務控制 持久化和數據安全 高性能要求 高併發訪問 關係型:mysql,oracle,sql server,postgresql 非關係型:Hadoop(大數據),monogoDB(文檔型 ),redis(鍵值),casscan ...
  • 一、phoenix的簡介 hbase的java api或者其語法很難用,可以認為phoenix是一個中間件,提供了訪問hbase的另外的語法。 二、配置phoenix和hbase 1.下載 phoenix的官網是:http://phoenix.apache.org/,用戶可以到該網址找到對應hbas ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...