誤區(qū) #1:在服務(wù)器故障轉(zhuǎn)移后,正在運(yùn)行的事務(wù)繼續(xù)執(zhí)行 這當(dāng)然是錯(cuò)誤的! 每次故障轉(zhuǎn)移都伴隨著某種形式的恢復(fù)。但是如果當(dāng)正在執(zhí)行的事務(wù)沒有Commit時(shí),由于服務(wù)器或?qū)嵗罎?dǎo)致連接斷開,SQL Server可沒有辦法在故障轉(zhuǎn)移后的服務(wù)器重新建立事務(wù)的上下文并繼續(xù)執(zhí)行事務(wù)-無論你使用的故障轉(zhuǎn)移方式是集群,鏡像,日志傳送或是SAN復(fù)制。 對(duì)于故障轉(zhuǎn)移集群來說,當(dāng)故障轉(zhuǎn)移發(fā)生后,一個(gè)SQL Server實(shí)例在另一個(gè)故障轉(zhuǎn)移集群的節(jié)點(diǎn)啟動(dòng)。所有實(shí)例上的數(shù)據(jù)庫(kù)都要經(jīng)歷Recovery階段-也就是所有沒有Commit的事務(wù)都要被回滾。 對(duì)于數(shù)據(jù)庫(kù)鏡像來說,來自主體服務(wù)器的日志不斷傳送到鏡像服務(wù)器進(jìn)行Redo操作。當(dāng)鏡像服務(wù)器被切換作為主體服務(wù)器時(shí),原鏡像服務(wù)器的事務(wù)日志將會(huì)變?yōu)镽ecovery模式,這使得好像原鏡像服務(wù)器經(jīng)歷了一次崩潰那樣,在這之后所有的連接都會(huì)導(dǎo)向原鏡像服務(wù)器。 對(duì)于事務(wù)日志傳送來說,事務(wù)日志被定期備份并傳送到輔助服務(wù)器.當(dāng)主服務(wù)器崩潰時(shí),DBA按照恢復(fù)順序?qū)⑤o助服務(wù)器恢復(fù)后上線.但最終步驟都是要執(zhí)行recovery步驟,也就是將沒有提交的事務(wù)進(jìn)行回滾。 對(duì)于SAN復(fù)制來說,本地SAN的I/O被復(fù)制到遠(yuǎn)程SAN上進(jìn)行重放,當(dāng)故障轉(zhuǎn)移發(fā)生后,系統(tǒng)將會(huì)連接到遠(yuǎn)端SAN但數(shù)據(jù)庫(kù)仍然需要執(zhí)行recovery步驟,這和故障轉(zhuǎn)移集群極其類似。 “唯一”使得正在執(zhí)行的事務(wù)在故障轉(zhuǎn)移發(fā)生后仍然得以繼續(xù)執(zhí)行的技術(shù)使用帶有實(shí)時(shí)遷移功能的虛擬化技術(shù),因?yàn)檫@時(shí)連接本身并不知道其連接的對(duì)象已經(jīng)變?yōu)榱硪慌_(tái)物理服務(wù)器。 但是無論使用那種技術(shù),如果”連接”失效,正在執(zhí)行的事務(wù)將會(huì)丟失,所以處理這類問題的這部分工作就需要在程序中用代碼實(shí)現(xiàn)某種“重新執(zhí)行”的功能。 |
|