時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
新陣列移動(dòng)日
問(wèn):我們當(dāng)前的 RAID 很快就填滿(mǎn)了,因此需要將一些 SQL Server 2005 數(shù)據(jù)庫(kù)移到其他位置。新陣列已準(zhǔn)備就緒,并且我一直在為移動(dòng)數(shù)據(jù)庫(kù)作準(zhǔn)備。我剛剛發(fā)現(xiàn)其中一個(gè)數(shù)據(jù)庫(kù)是事務(wù)復(fù)制發(fā)布服務(wù)器,我知道這表示我不能移動(dòng)該數(shù)據(jù)庫(kù)。我應(yīng)怎樣做?
答:對(duì)您來(lái)說(shuō)有一個(gè)好消息 - 只有 SQL Server 2000(和更早版本)具有以下局限性:限制在未重新初始化事務(wù)復(fù)制或直接更改各種系統(tǒng)表的情況下移動(dòng)發(fā)布數(shù)據(jù)庫(kù)。
對(duì)于 SQL Server 2005 和 SQL Server 2008,有一個(gè)記錄下來(lái)的過(guò)程,您可以按照它移動(dòng)數(shù)據(jù)庫(kù),而不必對(duì)事務(wù)復(fù)制執(zhí)行任何操作,但要求數(shù)據(jù)庫(kù)保持連接到同一 SQL Server 實(shí)例。移動(dòng)時(shí)必須停機(jī)一段時(shí)間,因?yàn)楫?dāng)數(shù)據(jù)庫(kù)文件仍處于聯(lián)機(jī)狀態(tài)時(shí)無(wú)法將其移動(dòng)。過(guò)程如下:
首先,使用下面的代碼使數(shù)據(jù)庫(kù)脫機(jī)。如果有用戶(hù)連接到數(shù)據(jù)庫(kù),則需要先斷開(kāi)這些用戶(hù)的連接,此過(guò)程才能成功:????
- ALTER?DATABASE?MyDatabaseName?SET?OFFLINE;?
接著,將數(shù)據(jù)文件復(fù)制到新位置。使用復(fù)制而不是移動(dòng),可在發(fā)生任何錯(cuò)誤時(shí)進(jìn)行快速回滾(否則,必須執(zhí)行還原)。然后,使用以下代碼告知 SQL Server 每個(gè)文件的新位置
- ALTER?DATABASE?MyDatabaseName? ?
- MODIFY?FILE ?
- ???(NAME?=?N'LogicalFileName', ?
- ???FILENAME?=?N'pathname\filename');?
物理上復(fù)制了所有文件并更新了 SQL Server 中的文件位置后,使用以下代碼使數(shù)據(jù)庫(kù)恢復(fù)聯(lián)機(jī)狀態(tài):
- ALTER?DATABASE?MyDatabaseName?SET?ONLINE;?
關(guān)閉頁(yè)鎖存
問(wèn):我在理解一些性能優(yōu)化相關(guān)概念時(shí)存在疑問(wèn)。我?guī)状巫x到需要防止"頁(yè)鎖存"問(wèn)題。我不知道"頁(yè)"或"鎖存"是什么意思,或者說(shuō)為什么頁(yè)鎖存甚至是一個(gè)問(wèn)題。您能解釋所有這些疑問(wèn)嗎?
答:SQL Server 數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)文件中。在內(nèi)部,這些文件組織成大小為 8 KB 的數(shù)據(jù)塊序列,稱(chēng)為頁(yè)。頁(yè)是 SQL Server 可以管理的基本存儲(chǔ)和 I/O 單位。頁(yè)通常位于磁盤(pán)上的數(shù)據(jù)文件中,并且在處理任何查詢(xún)之前,需要 SQL Server 的緩存(稱(chēng)為緩沖池)來(lái)進(jìn)行讀取。
SQL Server 使用各種頁(yè)來(lái)存儲(chǔ)不同類(lèi)型的關(guān)系數(shù)據(jù)(例如,表中的行、非群集索引中的行或者文本/LOB 數(shù)據(jù))。還有一些頁(yè)存儲(chǔ) SQL Server 組織和訪(fǎng)問(wèn)存儲(chǔ)關(guān)系數(shù)據(jù)的頁(yè)所需的內(nèi)部數(shù)據(jù)結(jié)構(gòu)部分。
鎖存 是一種輕量級(jí)內(nèi)部機(jī)制,SQL Server 使用它來(lái)同步對(duì)緩存內(nèi)的某個(gè)頁(yè)的訪(fǎng)問(wèn)。您需要注意兩種類(lèi)型的頁(yè)鎖存 - 常規(guī)頁(yè)鎖存 和頁(yè) I/O 鎖存。如果 SQL Server 線(xiàn)程必須等待獲取其中一個(gè)鎖存,則表示出現(xiàn)性能問(wèn)題。
當(dāng) SQL Server 正等待從磁盤(pán)中讀取數(shù)據(jù)文件的某部分時(shí),則可能會(huì)導(dǎo)致頁(yè) I/O 鎖存等待。如果頁(yè) I/O 鎖存持續(xù)很長(zhǎng)時(shí)間,則通常表明底層磁盤(pán)子系統(tǒng)出現(xiàn)性能問(wèn)題(即,該子系統(tǒng)過(guò)載)。
當(dāng) SQL Server 中的多個(gè)線(xiàn)程嘗試訪(fǎng)問(wèn)內(nèi)存中的相同 8 KB 數(shù)據(jù)文件頁(yè)時(shí),就存在對(duì)該頁(yè)訪(fǎng)問(wèn)權(quán)的爭(zhēng)用,這可能會(huì)導(dǎo)致頁(yè)鎖存等待。最常見(jiàn)的這種情況涉及大量使用 tempdb 數(shù)據(jù)庫(kù)中的臨時(shí)小對(duì)象。
有關(guān)如何監(jiān)視和減少頁(yè)鎖存等待的更深入說(shuō)明不屬于本專(zhuān)欄文章的范圍,但您可以在以下資料中找到更多信息:
SQL Server 2008 聯(lián)機(jī)叢書(shū)中的"SQL Server Wait Statistics 對(duì)象"部分,它說(shuō)明如何使用系統(tǒng)監(jiān)視器監(jiān)視等待統(tǒng)計(jì)數(shù)據(jù)。
SQL Server 2008 聯(lián)機(jī)叢書(shū)中的"sys.dm_os_wait_stats"部分,它列出了常見(jiàn)的 SQL Server 等待類(lèi)型及其含義,并說(shuō)明如何從 SQL Server 內(nèi)部監(jiān)視等待統(tǒng)計(jì)數(shù)據(jù)。
白皮書(shū)《SQL Server 2008 中的性能問(wèn)題故障排除》,它提供各種故障排除查詢(xún)和技術(shù),包括等待統(tǒng)計(jì)數(shù)據(jù)。
通查數(shù)據(jù)庫(kù)快照
問(wèn):我剛剛發(fā)現(xiàn)了數(shù)據(jù)庫(kù)快照?,F(xiàn)在,我考慮將它們用作完全恢復(fù)模式和日志備份的替代方法。我將大約每小時(shí)創(chuàng)建一次快照,這樣當(dāng)出現(xiàn)錯(cuò)誤時(shí),我可以拉回?fù)p壞的數(shù)據(jù)。這似乎是一種更省事且更快的還原方法。您認(rèn)為進(jìn)行這種更改會(huì)產(chǎn)生任何問(wèn)題嗎?
答:會(huì)產(chǎn)生問(wèn)題,數(shù)據(jù)庫(kù)快照不是全面的災(zāi)難恢復(fù)策略的實(shí)用或可行替代方法。在從災(zāi)難完全恢復(fù)方面,數(shù)據(jù)庫(kù)快照不具備與事務(wù)日志備份相同的功能。數(shù)據(jù)庫(kù)快照不包含數(shù)據(jù)庫(kù)中所有頁(yè)的副本,它只包含自第一次創(chuàng)建數(shù)據(jù)庫(kù)后更改過(guò)的頁(yè)的副本。這意味著,如果數(shù)據(jù)庫(kù)有任何損壞,則沒(méi)有底層數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)快照將沒(méi)有任何用處。它只是數(shù)據(jù)庫(kù)中不同頁(yè)的集合,不能用于恢復(fù)。
您可以通過(guò)數(shù)據(jù)庫(kù)快照拉回不小心從數(shù)據(jù)庫(kù)中刪除的數(shù)據(jù),但前提是數(shù)據(jù)庫(kù)本身仍可用。例如,如果從數(shù)據(jù)庫(kù)中刪除的表仍存在于快照中,則可以使用快照重新創(chuàng)建該表。
也就是因?yàn)闈撛诘男阅軉?wèn)題,創(chuàng)建太多數(shù)據(jù)庫(kù)快照(作為每一個(gè)半小時(shí)的事務(wù)日志備份的替代方法)不是一個(gè)好主意。在可以交換數(shù)據(jù)庫(kù)頁(yè)之前(請(qǐng)參閱"關(guān)閉頁(yè)鎖存"部分中的答案說(shuō)明),必須先將頁(yè)同步地復(fù)制到尚未包含該頁(yè)版本的所有現(xiàn)有數(shù)據(jù)庫(kù)快照中。隨著創(chuàng)建的數(shù)據(jù)庫(kù)快照越來(lái)越多,要生成的頁(yè)副本也越來(lái)越多,從而導(dǎo)致性能下降。
不要?jiǎng)?chuàng)建太多數(shù)據(jù)庫(kù)快照的另一個(gè)原因是每個(gè)數(shù)據(jù)庫(kù)快照將包含數(shù)據(jù)庫(kù)頁(yè)更改前的副本。每個(gè)副本將隨著數(shù)據(jù)庫(kù)中更改的內(nèi)容增多而增大。這可能會(huì)導(dǎo)致磁盤(pán)空間問(wèn)題和性能問(wèn)題。
數(shù)據(jù)庫(kù)快照不是為了替代頻繁日志備份而設(shè)計(jì)的。您可以在白皮書(shū) Database Snapshot Performance Considerations Under I/O-Intensive Workloads 中閱讀關(guān)于數(shù)據(jù)庫(kù)快照的性能影響的更深入研究。
此外,如果您要使用完全恢復(fù)模式和事務(wù)日志備份,則很明顯您對(duì)最多能夠恢復(fù)到災(zāi)難點(diǎn)和/或使用時(shí)間點(diǎn)還原感興趣。(有關(guān)恢復(fù)到災(zāi)難點(diǎn)和時(shí)間點(diǎn)還原的說(shuō)明,請(qǐng)分別參閱我于 2009 年 7 月和 2009 年 11 月發(fā)布的文章"了解 SQL Server 備份"和"SQL Server:利用備份進(jìn)行災(zāi)難恢復(fù)"。)
鏡像,鏡像
問(wèn):我被要求為數(shù)據(jù)庫(kù)設(shè)置數(shù)據(jù)庫(kù)鏡像,但我擔(dān)心數(shù)據(jù)庫(kù)鏡像不能幫助解決我們的問(wèn)題。我們的 SAN 存在一些損壞問(wèn)題,因此打算通過(guò)數(shù)據(jù)庫(kù)鏡像防止我們受到損壞。損壞不會(huì)自動(dòng)發(fā)送到鏡像嗎?數(shù)據(jù)庫(kù)鏡像如何幫助我們解決此問(wèn)題?
答:這是一個(gè)會(huì)引起大量混淆的問(wèn)題。任何提供冗余數(shù)據(jù)庫(kù)副本的技術(shù)看起來(lái)似乎都容易受到從主體傳播到鏡像數(shù)據(jù)庫(kù)(以使用數(shù)據(jù)庫(kù)鏡像術(shù)語(yǔ))的損壞的影響,但實(shí)際上這種情況不會(huì)發(fā)生。
問(wèn)題的關(guān)鍵在于理解鏡像數(shù)據(jù)庫(kù)的維護(hù)方式。如果底層同步機(jī)制將完整數(shù)據(jù)庫(kù)頁(yè)從主體復(fù)制到鏡像數(shù)據(jù)庫(kù),則損壞肯定會(huì)傳播到鏡像。然后,主體中損壞的頁(yè)將被放置在鏡像中。
但是,數(shù)據(jù)庫(kù)鏡像專(zhuān)門(mén)避免了這種情況,因?yàn)樗粚⒁粋€(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)頁(yè)復(fù)制到另一個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)鏡像過(guò)程是將事務(wù)日志記錄從主體數(shù)據(jù)庫(kù)復(fù)制到鏡像來(lái)完成的。事務(wù)日志記錄說(shuō)明對(duì)數(shù)據(jù)庫(kù)頁(yè)所做的物理更改,它們不包含實(shí)際頁(yè)本身。(有關(guān)事務(wù)日志記錄、日志記錄和恢復(fù)的完整說(shuō)明,請(qǐng)參閱我于 2009 年 2 月發(fā)布的文章:"了解 SQL Server 中的日志記錄和恢復(fù)功能。")
即使數(shù)據(jù)庫(kù)頁(yè)被主體數(shù)據(jù)庫(kù)的底層 I/O 子系統(tǒng)損壞,該損壞也不可能直接傳播到鏡像數(shù)據(jù)庫(kù)??赡艹霈F(xiàn)的最壞情況是如果 SQL Server 未檢測(cè)到頁(yè)面損壞(由于未啟用頁(yè)面校驗(yàn)和),將使用已損壞的列值來(lái)計(jì)算存儲(chǔ)在數(shù)據(jù)庫(kù)中的值。生成的不正確結(jié)果將傳播到鏡像數(shù)據(jù)庫(kù),從而產(chǎn)生二級(jí)損壞效果。如前所述,如果啟用了頁(yè)面校驗(yàn)和,則從磁盤(pán)中讀取頁(yè)面時(shí),這種損壞仍將檢測(cè)不到,從而不會(huì)出現(xiàn)二級(jí)損壞。
此行為還說(shuō)明了為什么對(duì)主體數(shù)據(jù)庫(kù)運(yùn)行一致性檢查不會(huì)生成關(guān)于鏡像數(shù)據(jù)庫(kù)的一致性狀態(tài)的任何信息,反之亦然。它們是通過(guò)傳送對(duì)數(shù)據(jù)庫(kù)而不是實(shí)際數(shù)據(jù)庫(kù)頁(yè)的物理更改的說(shuō)明來(lái)保持同步的兩個(gè)不同數(shù)據(jù)庫(kù)。
關(guān)鍵詞標(biāo)簽:SQL,數(shù)據(jù)庫(kù)
相關(guān)閱讀
熱門(mé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ù)用戶(hù)、角色、架構(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的方法