時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
當(dāng)系統(tǒng)出現(xiàn)故障時(shí),只要存在數(shù)據(jù)日志那么就可以利用它來(lái)恢復(fù)數(shù)據(jù)解決數(shù)據(jù)庫(kù)故障。作為SQL Server數(shù)據(jù)庫(kù)管理員,了解數(shù)據(jù)日志文件的作用,以及如何利用它來(lái)解決一些數(shù)據(jù)庫(kù)的常見(jiàn)故障,這非常重要。既然事務(wù)日志這么重要,那么他到底可以用來(lái)做什么事情呢?口說(shuō)無(wú)憑,筆者這里就跟大家說(shuō)說(shuō)事務(wù)日志到底可以用來(lái)解決什么故障。
故障一:服務(wù)器意外關(guān)閉造成的損失
俗話說(shuō),天又不測(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)就有可能還沒(méi)有把緩存中的修改后的數(shù)據(jù)寫入到硬盤中,即數(shù)據(jù)文件內(nèi)有未完成事務(wù)所做的修改。如果確實(shí)有這種情況,則當(dāng)啟動(dòng)SQL Server實(shí)例時(shí),如果沒(méi)有事務(wù)日志或者事務(wù)日志損壞時(shí),修改后的數(shù)據(jù)就無(wú)法恢復(fù)過(guò)來(lái)了。但是,如果當(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ù)同步問(wèn)題
有時(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ù)是通過(guò)什么技術(shù)來(lái)達(dá)到這個(gè)生產(chǎn)服務(wù)器與備份服務(wù)器之間的數(shù)據(jù)同步的呢?簡(jiǎn)單的說(shuō),就是通過(guò)這個(gè)事務(wù)日志的復(fù)制來(lái)實(shí)現(xiàn)數(shù)據(jù)同步的。具體的來(lái)說(shuō),SQL Server數(shù)據(jù)庫(kù)提供了兩種解決方案,分別為數(shù)據(jù)鏡像與日志傳送。這兩個(gè)方案都是在事務(wù)日志復(fù)制的基礎(chǔ)上來(lái)實(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),還可以在無(wú)法按計(jì)劃執(zhí)行這些操作時(shí)引發(fā)警報(bào)。日志傳送配置中的主服務(wù)器是作為生產(chǎn)服務(wù)器的 SQL Server 數(shù)據(jù)庫(kù)引擎實(shí)例。主數(shù)據(jù)庫(kù)是主服務(wù)器上希望備份到其他服務(wù)器的數(shù)據(jù)庫(kù)。通過(guò)數(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ù)管理員的工作量。
另外也可以通過(guò)數(shù)據(jù)庫(kù)鏡像方案中來(lái)解決生產(chǎn)服務(wù)器與備用服務(wù)器之間的數(shù)據(jù)同步問(wèn)題。生產(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ù)荷過(guò)高或鏡像服務(wù)器系統(tǒng)的負(fù)荷過(guò)高,則時(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ù)荷等來(lái)確定。
可見(jiàn)現(xiàn)在可用的備份服務(wù)器與生產(chǎn)服務(wù)器之間的數(shù)據(jù)同步解決方案都是基于事務(wù)日志來(lái)實(shí)現(xiàn)的。
故障三:解決數(shù)據(jù)一致性問(wèn)題
假設(shè)現(xiàn)在有這么一種情況。在一個(gè)銀行系統(tǒng)中,某個(gè)用戶需要轉(zhuǎn)帳。這個(gè)轉(zhuǎn)帳作業(yè)主要是通過(guò)兩個(gè)步驟來(lái)完成。第一個(gè)步驟就是扣減用戶帳戶中的金額;第二個(gè)步驟是把錢轉(zhuǎn)入到另外一個(gè)用戶那里?,F(xiàn)在如果在轉(zhuǎn)帳的過(guò)程中,第一步成功了,但是第二個(gè)步驟因?yàn)槟撤N原因出錯(cuò)了。如用戶提供的帳戶名字與實(shí)際轉(zhuǎn)帳的帳戶名字不符,則第二個(gè)操作就會(huì)失敗。此時(shí)整個(gè)轉(zhuǎn)帳操作就會(huì)以失敗而告終。但是現(xiàn)在的問(wèn)題是,第一個(gè)扣減的動(dòng)作在數(shù)據(jù)庫(kù)zhon給已經(jīng)完成了。而實(shí)際卻是沒(méi)有轉(zhuǎn)帳成功,就救造成了數(shù)據(jù)一致性的問(wèn)題。
實(shí)際過(guò)程中如果應(yīng)用程序發(fā)出 ROLLBACK 語(yǔ)句,或者數(shù)據(jù)庫(kù)引擎檢測(cè)到錯(cuò)誤,就使用日志記錄回滾未完成的事務(wù)所做的修改。也就是說(shuō),當(dāng)?shù)诙€(gè)操作失敗的話,應(yīng)用程序要發(fā)出一個(gè)ROLLBACK 語(yǔ)句,利用事務(wù)日志回滾功能,恢復(fù)第一步的操作。也就是說(shuō),把扣減金額的操作進(jìn)行恢復(fù),從而實(shí)現(xiàn)數(shù)據(jù)的一致性。類似的應(yīng)用,在數(shù)據(jù)庫(kù)開發(fā)過(guò)程中很頻繁。
故障四:數(shù)據(jù)庫(kù)時(shí)點(diǎn)恢復(fù)的問(wèn)題
如現(xiàn)在遇到這么一種故障。數(shù)據(jù)庫(kù)系統(tǒng)在上午11點(diǎn)突然發(fā)現(xiàn)故障,啟動(dòng)不起來(lái)了。而數(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ù)。可見(jiàn)事務(wù)日志可以幫助管理員把數(shù)據(jù)恢復(fù)到某一個(gè)具體的時(shí)點(diǎn)。
關(guān)鍵詞標(biāo)簽:事務(wù)日志,解決,SQL,Se
相關(guān)閱讀
熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系
人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法