IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類(lèi)|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁(yè)數(shù)據(jù)庫(kù)MSSQL → 分布式事務(wù)、性能計(jì)數(shù)器和SQL備份

分布式事務(wù)、性能計(jì)數(shù)器和SQL備份

時(shí)間:2015/6/28來(lái)源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

問(wèn)題:我們使用了大量分布式事務(wù),正研究數(shù)據(jù)庫(kù)鏡像以使我們的關(guān)鍵數(shù)據(jù)庫(kù)之一具備高可用性。在測(cè)試過(guò)程中我們發(fā)現(xiàn),在嘗試對(duì)鏡像數(shù)據(jù)庫(kù)進(jìn)行故障轉(zhuǎn)移后,分布式事務(wù)有時(shí)會(huì)失敗。能否說(shuō)明這是為什么?

解答:這實(shí)際上是記錄在案的使用分布式事務(wù)的限制。在使用數(shù)據(jù)庫(kù)鏡像或日志傳送時(shí)會(huì)存在該限制,基本上對(duì)于在執(zhí)行故障轉(zhuǎn)移后 Windows 服務(wù)器名稱會(huì)有所不同的任何技術(shù),都存在該限制。

在使用 Microsoft 分布式事務(wù)處理協(xié)調(diào)器 (MSDTC) 事務(wù)時(shí),本地事務(wù)處理協(xié)調(diào)器具有資源 ID,用于標(biāo)識(shí)運(yùn)行該協(xié)調(diào)器的服務(wù)器。在進(jìn)行鏡像故障轉(zhuǎn)移時(shí),主體數(shù)據(jù)庫(kù)會(huì)承載于另一個(gè)服務(wù)器上(鏡像伙伴),因此事務(wù)處理協(xié)調(diào)器的資源 ID 會(huì)有所不同。

如果某個(gè)分布式事務(wù)處于活動(dòng)狀態(tài),鏡像伙伴上的事務(wù)處理協(xié)調(diào)器會(huì)嘗試識(shí)別該事務(wù)的狀態(tài),但是無(wú)法識(shí)別,因?yàn)樗哂绣e(cuò)誤的資源 ID;MSDTC 無(wú)法識(shí)別該 ID,因?yàn)樗畛跷窗谠摲植际绞聞?wù)中。在這種情況下,必須終止該分布式事務(wù),這便是您所看到的行為。

跨數(shù)據(jù)庫(kù)事務(wù)(涉及多個(gè)數(shù)據(jù)庫(kù)中的更新的簡(jiǎn)單事務(wù))也存在類(lèi)似問(wèn)題。如果所涉及的一個(gè)數(shù)據(jù)庫(kù)進(jìn)行了鏡像,另外一個(gè)沒(méi)有鏡像,則跨數(shù)據(jù)庫(kù)事務(wù)可以在這兩個(gè)數(shù)據(jù)庫(kù)中提交。如果進(jìn)行強(qiáng)制鏡像故障轉(zhuǎn)移(當(dāng)主體與鏡像未同步,且執(zhí)行允許丟失數(shù)據(jù)的手動(dòng)故障轉(zhuǎn)移時(shí)),在鏡像數(shù)據(jù)庫(kù)中提交的事務(wù)可能會(huì)丟失,這會(huì)破壞跨數(shù)據(jù)庫(kù)事務(wù)的完整性。

這可能會(huì)在鏡像數(shù)據(jù)庫(kù)未同步時(shí)發(fā)生(有關(guān)詳細(xì)信息,請(qǐng)參閱我發(fā)表的 2009 年 6 月專欄),因此提交的跨數(shù)據(jù)庫(kù)事務(wù)的日志記錄尚未發(fā)送到鏡像。在強(qiáng)制故障轉(zhuǎn)移后,新主體數(shù)據(jù)庫(kù)中不存在該事務(wù),因此會(huì)破壞跨數(shù)據(jù)庫(kù)事務(wù)的完整性。

問(wèn)題:最近我對(duì)某些性能計(jì)數(shù)器進(jìn)行監(jiān)視,以解決一個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)方面的問(wèn)題。在這個(gè)過(guò)程中,我注意到了一些非常奇怪的現(xiàn)象:盡管數(shù)據(jù)庫(kù)中未進(jìn)行任何操作,數(shù)據(jù)庫(kù)文件仍然存在寫(xiě)入活動(dòng)。數(shù)據(jù)和日志文件都存在這種情況。甚至在我確保未連接到 sql server 的情況下,這種情況仍在繼續(xù)。既然沒(méi)有連接,怎么會(huì)存在 I/O 活動(dòng)呢?

解答:SQL Server 有很多需要運(yùn)行的內(nèi)部操作;這些操作稱為后臺(tái)任務(wù)。系統(tǒng)中會(huì)執(zhí)行一個(gè)或多個(gè)后臺(tái)任務(wù),從而導(dǎo)致 I/O 活動(dòng)。下面簡(jiǎn)單列出了可能的原因:

虛影清理:刪除操作僅將記錄標(biāo)記為已刪除,以優(yōu)化取消操作時(shí)的性能;該操作實(shí)際上不對(duì)空間清零。一旦提交了刪除操作,便必須執(zhí)行某種操作,以從數(shù)據(jù)庫(kù)中實(shí)際移除被刪除的記錄。這是由虛影清理任務(wù)完成的。有關(guān)詳細(xì)信息,請(qǐng)參閱我的博客文章,這篇文章還說(shuō)明了如何檢查虛影清理任務(wù)是否正在運(yùn)行。

自動(dòng)縮減:?jiǎn)⒂么巳蝿?wù)可以自動(dòng)移除數(shù)據(jù)庫(kù)中的空空間。此任務(wù)的工作方式是,將數(shù)據(jù)文件末尾的頁(yè)面移動(dòng)至開(kāi)頭,合并末尾的可用空間,然后截?cái)辔募。您?dāng)然可以啟用此任務(wù),但絕對(duì)不應(yīng)這樣做,因?yàn)檫@樣會(huì)導(dǎo)致索引碎片問(wèn)題(從而降低性能)并會(huì)占用大量資源。通常,還會(huì)為數(shù)據(jù)庫(kù)啟用自動(dòng)增長(zhǎng),因此可能會(huì)陷入縮減-增長(zhǎng)-縮減-增長(zhǎng)的循環(huán),這就做了大量無(wú)用功。您可以使用下面的查詢檢查所有數(shù)據(jù)庫(kù)的狀態(tài):

  1. SELECT name, is_auto_shrink_on FROM sys.databases; 

延遲丟棄:此任務(wù)負(fù)責(zé)執(zhí)行丟棄或截?cái)啾砗退饕璧墓ぷ鳎ㄟM(jìn)行索引重新生成操作可能引起索引丟棄,即生成新索引,然后丟棄舊索引)。對(duì)于小型表和索引,會(huì)立即執(zhí)行取消分配。對(duì)于較大的表和索性,會(huì)通過(guò)后臺(tái)任務(wù)成批執(zhí)行取消分配。這是為了確保獲取所有必需的鎖,而不致耗盡內(nèi)存。您可以按照此處的聯(lián)機(jī)叢書(shū)中所述,使用各種延遲丟棄性能計(jì)數(shù)器監(jiān)視此任務(wù)。

延遲寫(xiě)入:此任務(wù)負(fù)責(zé)從內(nèi)存中緩存(稱為緩沖池)移除舊頁(yè)面。當(dāng)服務(wù)器內(nèi)存不足時(shí),即使對(duì)頁(yè)面進(jìn)行了更改,也可能必須將其移除。在這種情況下,更改過(guò)的頁(yè)面必須先寫(xiě)入磁盤(pán),之后才能從內(nèi)存中移除。您可以按照此處的聯(lián)機(jī)叢書(shū)中所述,使用"Lazy writes/sec"性能計(jì)數(shù)器監(jiān)視此任務(wù)。

以上所有這些任務(wù)都可能對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改。它們?nèi)际褂檬聞?wù)進(jìn)行更改,只要提交事務(wù),事務(wù)所生成的事務(wù)日志記錄就必須寫(xiě)入磁盤(pán)上的數(shù)據(jù)庫(kù)日志部分。因?yàn)闀?huì)時(shí)常對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改,所以還必須存在檢查點(diǎn),以將更改的數(shù)據(jù)文件頁(yè)面刷新到磁盤(pán)。有關(guān)詳細(xì)信息,請(qǐng)參閱我為 TechNet 雜志 2009 年 2 月刊撰寫(xiě)的文章了解 SQL Server 中的日志記錄和恢復(fù)功能。

可以看到,不存在活動(dòng)的 SQL Server 連接,不一定意味著進(jìn)程處于靜止?fàn)顟B(tài),它可能正忙于執(zhí)行一個(gè)或多個(gè)后臺(tái)任務(wù)。如果所有數(shù)據(jù)庫(kù)活動(dòng)都完成很久后,I/O 活動(dòng)仍在進(jìn)行,可能還需要檢查是否在運(yùn)行計(jì)劃作業(yè)。

問(wèn)題:我是非自愿 DBA,正在嘗試不同的任務(wù)以盡快熟悉工作。前任 DBA 設(shè)置作業(yè)將備份寫(xiě)入一個(gè)文件,但是我不知道如何還原這些備份。是否可以查看文件中的備份內(nèi)容?我該如何正確地還原這些備份?

解答:盡管可以將備份附加到同一個(gè)文件,但是大多數(shù)人將每個(gè)備份放在名稱有意義的(通常還帶日期/時(shí)間戳組合)的獨(dú)立文件中。這樣有助于避免您所面臨的問(wèn)題,也便于執(zhí)行其他任務(wù):

每個(gè)備份都位于自己的文件中時(shí),出于安全原因而復(fù)制備份會(huì)十分簡(jiǎn)單。如果所有備份都位于一個(gè)文件中,就只能通過(guò)復(fù)制整個(gè)備份文件來(lái)創(chuàng)建最新備份的副本。
當(dāng)所有備份都位于一個(gè)文件中時(shí),不能刪除舊備份。
如果每個(gè)備份都有單獨(dú)命名的文件,則不可能意外覆蓋現(xiàn)有副本。
遺憾的是,這一點(diǎn)對(duì)您毫無(wú)幫助,您已在一個(gè)文件中包含多個(gè)備份。不過(guò),可以通過(guò)兩種方式還原副本:手動(dòng)還原或使用 SQL Server Management Studio (SSMS) 還原。

若要查看文件中的備份內(nèi)容,可以使用 SSMS 創(chuàng)建引用該文件的新備份設(shè)備。創(chuàng)建引用后,可以顯示該備份設(shè)備中的內(nèi)容的備份詳細(xì)信息。也可以使用 RESTORE HEADERONLY 命令。這兩種方法都會(huì)檢查備份設(shè)備,并提供一行輸出,用于描述文件中的每個(gè)備份。SSMS 使用友好名稱標(biāo)識(shí)備份類(lèi)型。若要使用正確的語(yǔ)法,需要按照 SQL Server 聯(lián)機(jī)叢書(shū)中有關(guān)該命令的條目(有關(guān) SQL Server 2008 版本,請(qǐng)參閱此處)所提供的信息,確定每個(gè)備份的備份類(lèi)型,從而可以使用適當(dāng)?shù)?RESTORE 命令還原備份。

您還需要確定要還原的備份。這有一點(diǎn)棘手,因?yàn)樗枰?RESTORE HEADERONLY 的輸出列名稱與您必須用于還原的選項(xiàng)不匹配。文件中的備份從 1 開(kāi)始編號(hào)(1 表示最舊),在名為"Position"的列中可以找到編號(hào)。若要還原備份,必須在 RESTORE 命令的 WITH FILE=<編號(hào)> 部分中使用相應(yīng)編號(hào)。下面是一個(gè)示例:

  1. RESTORE DATABASE test FROM DISK = 'C:\SQLskills\test.bak' 
  2. WITH FILE = 1, NORECOVERY;RESTORE LOG test 
  3. FROM DISK = 'C:\SQLskills\test.bak' 
  4. WITH FILE = 2, NORECOVERY; 

其他在此就不一一列舉了。您必須從某個(gè)數(shù)據(jù)庫(kù)備份開(kāi)始還原序列,然后還原零個(gè)或多個(gè)差異數(shù)據(jù)庫(kù)和/或事務(wù)日志備份。更詳細(xì)的信息不在本專欄的討論范圍之內(nèi),不過(guò),在我為 2009 年 11 月刊撰寫(xiě)的文章利用備份進(jìn)行災(zāi)難恢復(fù)中,詳細(xì)介紹了有關(guān)可能需要的還原序列和其他 RESTORE 選項(xiàng)。

使用 SSMS 時(shí),可在還原數(shù)據(jù)庫(kù)向?qū)е兄付▊浞菸募,該向(qū)?huì)自動(dòng)顯示文件中的所有備份,并允許您選擇需要的備份。圖 1 顯示了一個(gè)示例。

圖 1 使用 SSMS 還原數(shù)據(jù)庫(kù)向?qū)э@示文件中的多個(gè)備份。

無(wú)論選擇哪個(gè)選項(xiàng),在進(jìn)行災(zāi)難恢復(fù)時(shí),在正式執(zhí)行還原之前,必須試還原到另一個(gè)位置,這一點(diǎn)至關(guān)重要。我始終遵循的原則之一是"沒(méi)有成功還原,就沒(méi)有備份。"

問(wèn)題:我有一個(gè)很大的數(shù)據(jù)庫(kù),每隔幾周就需要將它復(fù)制到開(kāi)發(fā)環(huán)境中。我的問(wèn)題是,最近數(shù)據(jù)庫(kù)因要容納更多數(shù)據(jù)增大了,現(xiàn)在將它還原到開(kāi)發(fā)環(huán)境中時(shí),它顯得太大了。如何在還原該數(shù)據(jù)庫(kù)時(shí)使它縮小一些?

解答:這是一個(gè)相當(dāng)普遍的問(wèn)題,遺憾的是,沒(méi)有什么好的解決方法。

數(shù)據(jù)庫(kù)備份不會(huì)以任何方式更改數(shù)據(jù)庫(kù),它僅僅讀取所有已使用的數(shù)據(jù)庫(kù)部分,將這些部分以及一些事務(wù)日志(有關(guān)原因和程度的說(shuō)明,請(qǐng)參閱我的博客文章)包含在備份中。從數(shù)據(jù)庫(kù)備份進(jìn)行的還原僅創(chuàng)建文件,寫(xiě)出備份中的內(nèi)容,然后對(duì)數(shù)據(jù)庫(kù)運(yùn)行恢復(fù)操作;旧,數(shù)據(jù)庫(kù)中的內(nèi)容即是還原時(shí)獲得的內(nèi)容。沒(méi)有選項(xiàng)可以用于在還原時(shí)縮減數(shù)據(jù)庫(kù)、在還原時(shí)解決索引碎片問(wèn)題、在還原時(shí)更新統(tǒng)計(jì)數(shù)據(jù)或是人們可能需要執(zhí)行的任何其他操作。

那么,如何實(shí)現(xiàn)您的目的呢?根據(jù)具體方案,您有三種方法。

首先,可以對(duì)生產(chǎn)數(shù)據(jù)庫(kù)執(zhí)行縮減操作,以回收空的空間。這樣可使還原的數(shù)據(jù)庫(kù)副本與生產(chǎn)數(shù)據(jù)庫(kù)相同,而不會(huì)浪費(fèi)空間,但是成本可能會(huì)很高。生產(chǎn)數(shù)據(jù)庫(kù)會(huì)再次增長(zhǎng),因而縮減操作可能成本極高(在 CPU、I/O 和事務(wù)日志方面),并可能導(dǎo)致索引碎片。索引碎片問(wèn)題必須得到

關(guān)鍵詞標(biāo)簽:SQL備份

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟sql server系統(tǒng)表?yè)p壞的解決方法sql server系統(tǒng)表?yè)p壞的解決方法MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶Access、SQL Server、Oracle常見(jiàn)應(yīng)用的區(qū)別Access、SQL Server、Oracle常見(jiàn)應(yīng)用的區(qū)別

相關(guān)下載

人氣排行 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù)SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù)配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改SQL Server 2005降級(jí)到2000的正確操作步驟修改Sql Server唯一約束教程淺談JSP JDBC來(lái)連接SQL Server 2005的方法SQL Server創(chuàng)建表語(yǔ)句介紹