數據庫復制是 SQL Server數據庫的其中一種較為常用的高可用技術,對於很多中小企業,不可能使用數據庫大集中的方式,只能通過數據同步復制技術,利用廉價VPN技術,讓簡單寬帶技術構建起各分公司的集中交易模式,而數據庫復制技術對於中小企業的總/分部數據一致提供了技術可能。該高可用技術一旦出現問題,排查是比較困難的,本文將從SQL數據庫較為少見的故障排查問題進行描述處理。
一、 問題現象描述
在我們合作多年的一家醫院的HIS系統中,由於業務的需求,需要將門診生產系統的數據傳輸同步到門診查詢,經過大量的調研及考證,最終決定在SQL數據庫層面采用SQL復制高科擁架構實現數據的同步,為了防止數據的丟失風險,同樣將門診生產系統的數據采用數據庫鏡像的高可用架構,實現數據的多份,一旦主體中出現問題,可及時切換的備庫中,保證業務的連續性。
今年3月,在部署了數據庫復制的門診生產SQL服務器上,發現發布數據庫上做發生的數據更改無法同步到訂閱服務器上;
啟動復制監視器,並無報錯,只顯示相應消息為“復制的事務正等待下一次日志備份或等待鏡像伙伴更新”。
二、 原因分析
分析錯誤日志發現,為什麼會提示“數據庫的鏡像伙伴未更新”?原本在配置了數據庫復制的數據庫上同時配置了數據庫鏡像,而鏡像服務器最近由於硬件故障,已進行關機維修處理;
針對同時部署數據庫鏡像和復制的數據庫中,會有這樣的情況:日志讀取器代理僅復制那些在鏡像服務器上受保護的事務。如果鏡像服務器不可用,則主體服務器禁止數據庫中的進一步活動;因此,日志讀取器代理沒有事務可以復制(可參考鏈接:https://msdn.microsoft.com/zh-cn/library/ms151799(v=sql.105).aspx);
而在鏡像服務器維修過程,會斷開數據庫鏡像之間的連接,導致了以上復制停滯問題。
三、 解決方法
而在鏡像服務器維修過程,會斷開數據庫鏡像之間的連接,導致了以上復制停滯問題,修復好鏡像服務器,重啟恢復數據庫鏡像的連接後,問題解決;
以後針對此類情況,確實需要暫時斷開鏡像服務器,並避免再次部署的麻煩,可參考以下步驟進行:
利用T-SQL命令先斷開數據庫鏡像的連接:
ALTER DATABASE [數據庫名] SET PARTNER OFF
斷開數據庫的鏡像連接後,復制的同步不再受到影響,可正常執行;
待鏡像服務器修復之後,再次利用腳本配置鏡像即可,先在鏡像服務器上執行以下命令;
Alter Database [數據庫名] Set Partner = 'TCP://主體服務器名或IP:5022'
再在主體服務器上執行以下命令:
Alter Database [數據庫名] Set Partner = 'TCP://鏡像服務器名或IP:5022'
在以上處理的過程中,確保主體服務器的數據庫未進行日志備份,否則會將日志截斷,無法繼續直接配置鏡像,必須重新通過備份還原的方式進行。