首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 備份的 30 大迷思:釐清常見誤區,建立正確備份觀念

     編輯:關於SqlServer

前言

在 SQL Server 管理中,備份策略是確保資料安全的核心。然而,圍繞備份操作存在許多流傳已久的迷思,可能導致 DBA 採取錯誤的維護方式,甚至在災難發生時無法順利還原。本文整理了 30 個常見的備份迷思,並逐一釐清事實,幫助您建立正確的備份觀念。

迷思 1:備份操作會導致阻塞

事實: 備份不會對使用者物件加鎖。雖然備份過程會對 I/O 系統造成負擔,可能看起來像阻塞,但實際上 DML 操作永遠不會受到備份操作阻塞。唯一例外是當備份包含最小記錄操作涉及的資料區需要加鎖時,會阻塞 Checkpoint,但不影響一般 DML。

迷思 2:在完整復原模式與大量記錄復原模式之間切換會導致記錄鏈斷裂

事實: 這兩種模式互相切換不會導致記錄鏈斷裂。

迷思 3:只有完整備份才能重新開始被斷裂的記錄鏈

事實: 差異備份也可以重新開始記錄鏈。只要記錄斷裂的部分被差異備份所包含,即可重新啟動記錄鏈。

迷思 4:在完整或差異備份時,不允許進行記錄備份

事實: 自 SQL Server 2005 起,完整或差異備份期間可以同時進行記錄備份。

迷思 5:完整或差異備份會清除交易記錄

事實: 只有備份交易記錄才會清除記錄(在完整或大量記錄復原模式下)。完整/差異備份雖然包含部分記錄,但不會截斷記錄。

迷思 6:大量記錄復原模式下的「最小記錄」操作會減少下一次記錄備份的大小

事實: 記錄備份必須包含使最小記錄操作可回滾的所有記錄及相關資料區,因此備份大小與完整復原模式下基本一致。

迷思 7:完整或差異備份中所包含的記錄僅僅是操作進行時產生的記錄

事實: 完整/差異備份需要足夠的記錄,以將資料庫還原到備份結束時的交易一致性狀態,包含的記錄範圍比想像中大。

迷思 8:備份操作會檢查頁的校驗和

事實: 預設不會檢查。必須指定 WITH CHECKSUM 選項才會驗證校驗和,這也是建議在備份時加上的選項。

迷思 9:備份透過緩衝區讀取資料

事實: 備份子系統會對資料檔案單獨開啟通道,避免將所有資料讀入記憶體再寫入儲存裝置,以免導致效能嚴重下降。僅在指定 WITH CHECKSUM 時會涉及少量記憶體使用。

迷思 10:備份會進行一致性檢查(等同 DBCC CHECKDB)

事實: 備份不會執行任何一致性檢查,兩者功能完全不同。

迷思 11:如果備份成功,還原也一定能成功

事實: 備份檔案本身可能損壞。必須定期驗證備份(如 RESTORE VERIFYONLY 或實際還原測試),確保災難發生時能正確還原。

迷思 12:即使鏡像路徑不可用,鏡像備份依然可以成功

事實: 若鏡像中的任一路徑失效,整個鏡像備份都會失敗。

迷思 13:任何時候都可以進行尾端記錄備份

事實: 若資料檔案受損且記錄包含最小記錄操作,而相關資料區已損壞,則無法進行尾端記錄備份。因此 7x24 生產環境不建議使用大量記錄復原模式。

迷思 14:備份可以替代 DBCC CHECKDB

事實: 完全錯誤。備份無法偵測記憶體中的頁損壞,也無法發現未啟用頁校驗和的頁面損壞。必須定期執行 DBCC CHECKDB。

迷思 15:可以備份資料庫快照集

事實: 不可以備份資料庫快照集。

迷思 16:可以使用資料庫鏡像來替代記錄備份

事實: 鏡像依賴主資料庫可用,若主資料庫損壞,鏡像通常也會受影響。且多個鏡像會嚴重影響效能,無法替代記錄備份。

迷思 17:記錄備份大小與記錄檔佔用大小一致

事實: 記錄備份只包含自上次記錄備份以來的記錄,且不包含作用中交易的回滾記錄。DBCC SQLPERF(LOGSPACE) 顯示的空間使用量不能反映實際備份大小。

迷思 18:無法備份損壞的資料庫

事實: 可使用 WITH CONTINUE_AFTER_ERROR 選項備份損壞資料庫(除非啟動頁或檔案標頭頁損壞),這是 SQL Server 層面備份損壞資料庫的唯一辦法。

迷思 19:無法禁止使用者執行 BACKUP LOG WITH NO_LOG / TRUNCATE_ONLY

事實: SQL Server 2008 可透過追蹤旗標 3231 禁止這些操作。

迷思 20:記錄備份在任何條件下都會清除記錄

事實: 若記錄備份期間有資料庫備份並行執行,或存在長時間作用中交易、複寫等情況,SQL Server 可能認為記錄仍為必要而不清除。

迷思 21:差異備份是增長式的

事實: 差異備份是累積性的(自上次完整備份以來所有修改的資料區),而非增量式。只有記錄備份是增量式的。

迷思 22:備份完成後即可刪除前一份備份

事實: 絕對不可。必須依保留策略保留多組備份,以防最新備份損壞時無法還原。

迷思 23:鎖升級過程是行鎖→頁鎖→表鎖

事實: SQL Server 2005 及之前版本直接從行鎖升級為表鎖。SQL Server 2008 引入分區鎖升級,可透過 ALTER TABLE ... SET (LOCK_ESCALATION = AUTO/TABLE/DISABLE) 控制。

迷思 24:資料庫損壞可透過重啟 SQL Server/Windows 或分離附加解決

事實: 重啟或分離附加無法修復資料損壞。若資料庫處於可疑狀態,分離附加會導致附加失敗。正確做法是從備份還原或執行修復。

迷思 25:填充因子永遠有效 / 填充因子 0 與 100 不同 / 填充因子 0 會在非葉節點保留空間

事實: 填充因子僅在索引建立或重建時生效,不會持續保持頁面空閒空間。填充因子 0 與 100 完全相同。填充因子 0 不會 在非葉節點保留空間。

迷思 26:SQL Server 存在真正的「交易巢狀」

事實: 巢狀交易不是真正的巢狀。SQL Server 僅識別最外層交易。ROLLBACK 內層交易實際會回滾整個外層交易。開發人員應避免使用巢狀交易,改用儲存點(SAVE TRAN)實現部分回滾。

迷思 27:BACKUP WITH CHECKSUM 可替代 DBCC CHECKDB

事實: 無法替代。原因:1) 升級舊版資料庫可能有頁未啟用校驗和;2) 完整備份間隔較長,無法滿足每週檢查的最佳實務;3) 無法偵測記憶體中頁損壞寫入磁碟後產生的「正確校驗和的損壞頁」。

迷思 28:大量記錄復原模式的常見迷思

  • a) 常見 DML 可最小記錄: 僅特定大量操作(如 BULK INSERT、SELECT INTO、建立索引等)可最小記錄。
  • b) 不影響災難復原: 若發生最小記錄操作後資料檔損壞,無法備份尾端記錄,導致資料遺失;且包含最小記錄的記錄備份無法還原至特定時間點,只能整個還原或完全不還原。
  • c) 減少記錄備份大小: 雖記錄量減少,但為了還原需根據位圖備份所有修改過的資料區,實際備份大小與完整復原模式相近。

迷思 29:對堆疊建立叢集索引再刪除可整理堆疊碎片

事實: 這是極差的做法。建立叢集索引會重建所有非叢集索引(RID 變為叢集鍵),刪除叢集索引又會再次重建所有非叢集索引(叢集鍵變回 RID)。正確做法:直接保留叢集索引(選擇窄、唯一、遞增鍵),或 SQL Server 2008+ 使用 ALTER TABLE ... REBUILD(同樣會重建非叢集索引)。

迷思 30:FileStream 相關迷思

  • a) FileStream 資料可存放遠端: 容器必須為本機儲存(含 SAN),但用戶端可透過 UNC 路徑存取。
  • b) 容器可巢狀: 同資料庫的容器不可巢狀;不同資料庫容器不可同目錄。
  • c) 可部分更新: 任何更新都會建立新檔案,完整記錄至記錄檔,故不支援資料庫鏡像。
  • d) 立即垃圾回收: 實際於不再需要且下一個 Checkpoint 時回收。
  • e) 目錄/檔名隨機: 檔名對應建立操作的 LSN;資料表/欄位 GUID 目錄可從系統表查詢。

Checkpoint 寫入未提交髒頁示意圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved