新聞中心
當(dāng)系統(tǒng)出現(xiàn)故障時(shí),只要存在數(shù)據(jù)日志那么就可以利用它來恢復(fù)數(shù)據(jù)解決數(shù)據(jù)庫(kù)故障。作為SQL Server數(shù)據(jù)庫(kù)管理員,了解數(shù)據(jù)日志文件的作用,以及如何利用它來解決一些數(shù)據(jù)庫(kù)的常見故障,這非常重要。既然事務(wù)日志這么重要,那么他到底可以用來做什么事情呢?口說無憑,筆者這里就跟大家說說事務(wù)日志到底可以用來解決什么故障。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供站前企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、做網(wǎng)站、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為站前眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
故障一:服務(wù)器意外關(guān)閉造成的損失
俗話說,天又不測(cè)風(fēng)云。數(shù)據(jù)庫(kù)服務(wù)器如果因?yàn)橥蝗粩嚯娀蛘咂渌恍┰蛞馔猱?dāng)機(jī)時(shí),再重新啟動(dòng)服務(wù)器后會(huì)出現(xiàn)一些數(shù)據(jù)的損失。這主要是因?yàn)閿?shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)生更改后,并不會(huì)在***時(shí)間就把數(shù)據(jù)寫入到硬盤中。為了提高數(shù)據(jù)庫(kù)的運(yùn)行效率,往往是先把數(shù)據(jù)寫入到數(shù)據(jù)高速緩存中;同時(shí)把更改的情況寫入到事務(wù)日志中。等到一定的情況數(shù)據(jù)庫(kù)系統(tǒng)才會(huì)把數(shù)據(jù)寫入到硬盤文件中。
此時(shí),如果數(shù)據(jù)庫(kù)服務(wù)器系統(tǒng)突然發(fā)生故障,數(shù)據(jù)庫(kù)系統(tǒng)就有可能還沒有把緩存中的修改后的數(shù)據(jù)寫入到硬盤中,即數(shù)據(jù)文件內(nèi)有未完成事務(wù)所做的修改。如果確實(shí)有這種情況,則當(dāng)啟動(dòng)SQL Server實(shí)例時(shí),如果沒有事務(wù)日志或者事務(wù)日志損壞時(shí),修改后的數(shù)據(jù)就無法恢復(fù)過來了。但是,如果當(dāng)事務(wù)日志可用的話,則當(dāng)實(shí)例啟動(dòng)時(shí),系統(tǒng)會(huì)丟每個(gè)數(shù)據(jù)庫(kù)執(zhí)行恢復(fù)操作。前滾日至中記錄的、可能尚未寫入數(shù)據(jù)文件的每個(gè)修改。在事務(wù)日志中找到的每個(gè)未完成的事務(wù)都將回滾,以確保數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性。
所以當(dāng)數(shù)據(jù)庫(kù)服務(wù)器意外故障時(shí),數(shù)據(jù)庫(kù)管理員***能夠確認(rèn)一下事務(wù)日志是否可用。如果事務(wù)日志已經(jīng)損壞,那么就需要先恢復(fù)事務(wù)日志然后再重新啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例。否則的話,數(shù)據(jù)庫(kù)實(shí)例在重新啟動(dòng)時(shí)不能夠正常恢復(fù)數(shù)據(jù)。這一點(diǎn)在遇到服務(wù)器突發(fā)行的故障時(shí)一定要注意。否則的話,很可能破壞數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性。
故障二:解決備份數(shù)據(jù)庫(kù)的數(shù)據(jù)同步問題
有時(shí)候出于數(shù)據(jù)庫(kù)高可用性的目的,需要在生產(chǎn)服務(wù)器之外的地方再部署一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器。當(dāng)生產(chǎn)服務(wù)器出現(xiàn)故障不可用時(shí),則可以馬上啟用這個(gè)備用的服務(wù)器。故就需要保證生產(chǎn)服務(wù)器與備用服務(wù)器之間數(shù)據(jù)的同步。那么SQL Server數(shù)據(jù)庫(kù)是通過什么技術(shù)來達(dá)到這個(gè)生產(chǎn)服務(wù)器與備份服務(wù)器之間的數(shù)據(jù)同步的呢?簡(jiǎn)單的說,就是通過這個(gè)事務(wù)日志的復(fù)制來實(shí)現(xiàn)數(shù)據(jù)同步的。具體的來說,SQL Server數(shù)據(jù)庫(kù)提供了兩種解決方案,分別為數(shù)據(jù)鏡像與日志傳送。這兩個(gè)方案都是在事務(wù)日志復(fù)制的基礎(chǔ)上來實(shí)現(xiàn)的。
在日志傳送方案中,生產(chǎn)服務(wù)器將生產(chǎn)數(shù)據(jù)庫(kù)的活動(dòng)事務(wù)日志發(fā)送到一個(gè)或多個(gè)目標(biāo)服務(wù)器。每個(gè)輔助服務(wù)器將該日志還原為其本地的輔助數(shù)據(jù)庫(kù),從而實(shí)現(xiàn)備用服務(wù)器與生產(chǎn)服務(wù)器之間數(shù)據(jù)的一致性。使用日志傳送,您可以自動(dòng)將“主服務(wù)器”實(shí)例上“主數(shù)據(jù)庫(kù)”內(nèi)的事務(wù)日志備份發(fā)送到單獨(dú)“輔助服務(wù)器”實(shí)例上的一個(gè)或多個(gè)“輔助數(shù)據(jù)庫(kù)”。事務(wù)日志備份分別應(yīng)用于每個(gè)輔助數(shù)據(jù)庫(kù)??蛇x的第三個(gè)服務(wù)器實(shí)例(稱為“監(jiān)shi服務(wù)器”)記錄備份和還原操作的歷史記錄及狀態(tài),還可以在無法按計(jì)劃執(zhí)行這些操作時(shí)引發(fā)警報(bào)。日志傳送配置中的主服務(wù)器是作為生產(chǎn)服務(wù)器的 SQL Server 數(shù)據(jù)庫(kù)引擎實(shí)例。主數(shù)據(jù)庫(kù)是主服務(wù)器上希望備份到其他服務(wù)器的數(shù)據(jù)庫(kù)。通過數(shù)據(jù)庫(kù)進(jìn)行的所有日志傳送配置管理都是在主數(shù)據(jù)庫(kù)中執(zhí)行的。另外需要注意的是,如果采用日志傳送方案對(duì)于生產(chǎn)服務(wù)器的工作模式有限制。生產(chǎn)數(shù)據(jù)庫(kù)必須使用完整恢復(fù)模式或大容量日志恢復(fù)模式。如果將數(shù)據(jù)庫(kù)切換為簡(jiǎn)單恢復(fù)模式會(huì)導(dǎo)致日志傳送停止工作。
一臺(tái)備用服務(wù)器可以包含多臺(tái)不同生產(chǎn)服務(wù)器中數(shù)據(jù)庫(kù)的備份副本。例如,某個(gè)集團(tuán)公司可能有三臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,每臺(tái)服務(wù)器都運(yùn)行關(guān)鍵數(shù)據(jù)庫(kù)系統(tǒng)。在這種情況下,可以只使用一臺(tái)輔助服務(wù)器,而不必使用三臺(tái)單獨(dú)的輔助服務(wù)器。三個(gè)主系統(tǒng)上的備份都可以加載到這個(gè)備份系統(tǒng)中,從而減少所需的資源數(shù)量并節(jié)省開支,也可以數(shù)據(jù)庫(kù)管理員的工作量。
另外也可以通過數(shù)據(jù)庫(kù)鏡像方案中來解決生產(chǎn)服務(wù)器與備用服務(wù)器之間的數(shù)據(jù)同步問題。生產(chǎn)數(shù)據(jù)庫(kù)的每次更新都在獨(dú)立的、完整的備份數(shù)據(jù)庫(kù)中立即重新生成。主體服務(wù)器實(shí)例立即將每個(gè)日志記錄發(fā)送到鏡像服務(wù)器實(shí)例,鏡像服務(wù)器實(shí)例將傳入的日志記錄應(yīng)用于鏡像數(shù)據(jù)庫(kù),從而將其繼續(xù)前滾。“數(shù)據(jù)庫(kù)鏡像”是用于提高數(shù)據(jù)庫(kù)可用性的***軟件解決方案。鏡像基于每個(gè)數(shù)據(jù)庫(kù)實(shí)現(xiàn),并且只適用于使用完整恢復(fù)模式的數(shù)據(jù)庫(kù)。簡(jiǎn)單恢復(fù)模式和大容量日志恢復(fù)模式不支持?jǐn)?shù)據(jù)庫(kù)鏡像。因此,所有大容量操作始終被完整地記入日志。數(shù)據(jù)庫(kù)鏡像可使用任意支持的數(shù)據(jù)庫(kù)兼容級(jí)別。在“數(shù)據(jù)庫(kù)鏡像模式”中,主體服務(wù)器和鏡像服務(wù)器作為伙伴進(jìn)行通信和協(xié)作。兩個(gè)伙伴在會(huì)話中扮演互補(bǔ)的角色:主體角色(生產(chǎn)服務(wù)器)和鏡像角色(備份服務(wù)器)。在任何給定的時(shí)間,都是一個(gè)伙伴扮演生產(chǎn)服務(wù)器角色,另一個(gè)伙伴扮演備用服務(wù)器角色。如果生產(chǎn)服務(wù)器角色出現(xiàn)故障時(shí),則備份服務(wù)器角色馬上會(huì)頂替出現(xiàn)故障的生產(chǎn)服務(wù)器角色,轉(zhuǎn)變?yōu)樯a(chǎn)服務(wù)器角色。從而實(shí)現(xiàn)數(shù)據(jù)庫(kù)的高可用性。
數(shù)據(jù)庫(kù)鏡像方案有兩種鏡像運(yùn)行模式。一種是“高安全性模式”,它支持同步操作。在高安全性模式下,當(dāng)會(huì)話開始時(shí),鏡像服務(wù)器將使鏡像數(shù)據(jù)庫(kù)盡快與主體數(shù)據(jù)庫(kù)同步,一旦同步了數(shù)據(jù)庫(kù),事務(wù)將在伙伴雙方處提交,這會(huì)延長(zhǎng)事務(wù)滯后時(shí)間。第二種運(yùn)行模式,即高性能模式,它與***種模式的主要差異就在于異步運(yùn)行。鏡像服務(wù)器嘗試與主體服務(wù)器發(fā)送的日志記錄保持同步。鏡像數(shù)據(jù)庫(kù)可能稍微滯后于主體數(shù)據(jù)庫(kù)。但是,數(shù)據(jù)庫(kù)之間的時(shí)間間隔通常很小。但是,如果主體服務(wù)器的工作負(fù)荷過高或鏡像服務(wù)器系統(tǒng)的負(fù)荷過高,則時(shí)間間隔會(huì)增大。在高性能模式中,主體服務(wù)器向鏡像服務(wù)器發(fā)送日志記錄之后,會(huì)立即再向客戶端發(fā)送一條確認(rèn)消息。它不會(huì)等待鏡像服務(wù)器的確認(rèn)。這意味著事務(wù)不需要等待鏡像服務(wù)器將日志寫入磁盤便可提交。此異步操作允許主體服務(wù)器在事務(wù)滯后時(shí)間最小的條件下運(yùn)行,但可能會(huì)丟失某些數(shù)據(jù)。具體采用哪種模式,則需要數(shù)據(jù)庫(kù)管理員根據(jù)企業(yè)對(duì)待數(shù)據(jù)損失的態(tài)度與工作負(fù)荷等來確定。
可見現(xiàn)在可用的備份服務(wù)器與生產(chǎn)服務(wù)器之間的數(shù)據(jù)同步解決方案都是基于事務(wù)日志來實(shí)現(xiàn)的。
故障三:解決數(shù)據(jù)一致性問題
假設(shè)現(xiàn)在有這么一種情況。在一個(gè)銀行系統(tǒng)中,某個(gè)用戶需要轉(zhuǎn)帳。這個(gè)轉(zhuǎn)帳作業(yè)主要是通過兩個(gè)步驟來完成。***個(gè)步驟就是扣減用戶帳戶中的金額;第二個(gè)步驟是把錢轉(zhuǎn)入到另外一個(gè)用戶那里?,F(xiàn)在如果在轉(zhuǎn)帳的過程中,***步成功了,但是第二個(gè)步驟因?yàn)槟撤N原因出錯(cuò)了。如用戶提供的帳戶名字與實(shí)際轉(zhuǎn)帳的帳戶名字不符,則第二個(gè)操作就會(huì)失敗。此時(shí)整個(gè)轉(zhuǎn)帳操作就會(huì)以失敗而告終。但是現(xiàn)在的問題是,***個(gè)扣減的動(dòng)作在數(shù)據(jù)庫(kù)zhon給已經(jīng)完成了。而實(shí)際卻是沒有轉(zhuǎn)帳成功,就救造成了數(shù)據(jù)一致性的問題。
實(shí)際過程中如果應(yīng)用程序發(fā)出 ROLLBACK 語句,或者數(shù)據(jù)庫(kù)引擎檢測(cè)到錯(cuò)誤,就使用日志記錄回滾未完成的事務(wù)所做的修改。也就是說,當(dāng)?shù)诙€(gè)操作失敗的話,應(yīng)用程序要發(fā)出一個(gè)ROLLBACK 語句,利用事務(wù)日志回滾功能,恢復(fù)***步的操作。也就是說,把扣減金額的操作進(jìn)行恢復(fù),從而實(shí)現(xiàn)數(shù)據(jù)的一致性。類似的應(yīng)用,在數(shù)據(jù)庫(kù)開發(fā)過程中很頻繁。
故障四:數(shù)據(jù)庫(kù)時(shí)點(diǎn)恢復(fù)的問題
如現(xiàn)在遇到這么一種故障。數(shù)據(jù)庫(kù)系統(tǒng)在上午11點(diǎn)突然發(fā)現(xiàn)故障,啟動(dòng)不起來了。而數(shù)據(jù)庫(kù)系統(tǒng)是在昨天晚上12點(diǎn)剛做完一個(gè)完全備份。在這種情況下,如果只是從完全備份中恢復(fù)數(shù)據(jù)的話,只能夠恢復(fù)到昨天晚上12點(diǎn)的數(shù)據(jù)。那從昨天晚上12點(diǎn)到今天上午11點(diǎn)的數(shù)據(jù)就不能夠恢復(fù)了嗎?
其實(shí)不然。因?yàn)橛脩粼趯?duì)數(shù)據(jù)庫(kù)做的任何一個(gè)修改都會(huì)保存在事務(wù)日志當(dāng)中。為此只要事務(wù)日志不損壞的情況下,數(shù)據(jù)庫(kù)管理員可以把數(shù)據(jù)恢復(fù)到上午11點(diǎn)那個(gè)時(shí)刻的數(shù)據(jù)。具體的操作方法很簡(jiǎn)單,就好先利用完全備份文件恢復(fù)數(shù)據(jù)庫(kù)系統(tǒng),此時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)位昨天晚上12點(diǎn)的數(shù)據(jù)。然后再利用日志恢復(fù)功能把數(shù)據(jù)恢復(fù)到今天上午11點(diǎn)的數(shù)據(jù)??梢娛聞?wù)日志可以幫助管理員把數(shù)據(jù)恢復(fù)到某一個(gè)具體的時(shí)點(diǎn)。
標(biāo)題名稱:通過事務(wù)日志解決SQLServer常見四大故障
文章地址:http://fisionsoft.com.cn/article/cdcpcps.html


咨詢
建站咨詢
